From 7633dd2a61e20a603463946442705db817dbfebe Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Fri, 30 Oct 2026 13:41:07 -0400 Subject: [PATCH 1/8] test: add namespace identity contract fixtures --- tests/resources/identity/namespaces.json | 139 +++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 tests/resources/identity/namespaces.json diff --git a/tests/resources/identity/namespaces.json b/tests/resources/identity/namespaces.json new file mode 100644 index 0000000..8a89219 --- /dev/null +++ b/tests/resources/identity/namespaces.json @@ -0,0 +1,139 @@ +{ + "identity_version": 2, + "roots": [ + { + "application_name": "inventory", + "namespace": null, + "expected_root": "can://inventory/inventory" + }, + { + "application_name": "currencyservice", + "namespace": "online-boutique", + "expected_root": "can://online-boutique/currencyservice" + }, + { + "application_name": "a%b", + "namespace": "team space", + "expected_root": "can://team%20space/a%25b" + }, + { + "application_name": "caf\u00e9", + "namespace": "\u56e2\u961f", + "expected_root": "can://%E5%9B%A2%E9%98%9F/caf%C3%A9" + }, + { + "application_name": "Inventory", + "namespace": "Team", + "expected_root": "can://Team/Inventory" + }, + { + "application_name": "inventory", + "namespace": "team", + "expected_root": "can://team/inventory" + }, + { + "application_name": " cafe\u0301 ", + "namespace": "team", + "expected_root": "can://team/%20cafe%CC%81%20" + } + ], + "invalid": [ + { + "value": "", + "reason": "empty" + }, + { + "value": " ", + "reason": "whitespace-only" + }, + { + "value": "a/b", + "reason": "slash" + }, + { + "value": "a\\b", + "reason": "backslash" + }, + { + "value": ".", + "reason": "dot" + }, + { + "value": "..", + "reason": "dot-dot" + }, + { + "value": "a\u0001b", + "reason": "control" + }, + { + "value": "\ud800", + "reason": "unpaired-high-surrogate" + }, + { + "value": "\udc00", + "reason": "unpaired-low-surrogate" + } + ], + "modules": [ + { + "application_name": "currencyservice", + "namespace": "online-boutique", + "language": "javascript", + "file_key": "server.js", + "expected_uri": "can://online-boutique/currencyservice/javascript/server.js" + }, + { + "application_name": "paymentservice", + "namespace": "online-boutique", + "language": "javascript", + "file_key": "server.js", + "expected_uri": "can://online-boutique/paymentservice/javascript/server.js" + }, + { + "application_name": "inventory", + "namespace": null, + "language": "python", + "file_key": "src/main.py", + "expected_uri": "can://inventory/inventory/python/src/main.py" + }, + { + "application_name": "inventory", + "namespace": null, + "language": "typescript", + "file_key": "src/main.ts", + "expected_uri": "can://inventory/inventory/typescript/src/main.ts" + }, + { + "application_name": "inventory", + "namespace": null, + "language": "java", + "file_key": "src/Main.java", + "expected_uri": "can://inventory/inventory/java/src/Main.java" + }, + { + "application_name": "inventory", + "namespace": null, + "language": "go", + "file_key": "main.go", + "expected_uri": "can://inventory/inventory/go/main.go" + } + ], + "duplicate_module_rows": { + "rows": [ + { + "module_id": "can://online-boutique/currencyservice/javascript/server.js", + "file_key": "server.js" + }, + { + "module_id": "can://online-boutique/paymentservice/javascript/server.js", + "file_key": "server.js" + }, + { + "module_id": "can://online-boutique/currencyservice/javascript/server.js", + "file_key": "server.js" + } + ], + "expected_unique_id_count": 2 + } +} From 315eeae8e3c9028d1404d2150f00e01e36f6c42b Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Fri, 30 Oct 2026 20:11:03 -0400 Subject: [PATCH 2/8] feat: bind SDK URI resolution to namespace and application --- cldk/analysis/commons/backend_config.py | 20 +- cldk/analysis/commons/identity.py | 84 ++++++ cldk/analysis/commons/keys.py | 68 +++-- cldk/analysis/go/codeanalyzer/codeanalyzer.py | 27 +- cldk/analysis/go/go_analysis.py | 8 +- cldk/analysis/go/neo4j/neo4j_backend.py | 80 +++--- cldk/analysis/java/backend.py | 21 +- .../java/codeanalyzer/codeanalyzer.py | 23 +- cldk/analysis/java/java_analysis.py | 25 +- cldk/analysis/java/neo4j/neo4j_backend.py | 38 ++- .../python/codeanalyzer/codeanalyzer.py | 51 ++-- cldk/analysis/python/neo4j/neo4j_backend.py | 110 +++++--- cldk/analysis/python/python_analysis.py | 54 ++-- .../typescript/codeanalyzer/codeanalyzer.py | 32 ++- .../typescript/neo4j/neo4j_backend.py | 60 +++-- .../typescript/typescript_analysis.py | 10 +- cldk/core.py | 2 + cldk/models/go/models.py | 6 +- cldk/models/java/models.py | 3 + cldk/models/typescript/models.py | 5 + tests/analysis/commons/test_identity.py | 239 ++++++++++++++++++ .../commons/test_identity_local_producers.py | 42 +++ tests/analysis/commons/test_lifted_helpers.py | 50 +++- tests/analysis/go/test_go_analysis.py | 39 ++- tests/analysis/go/test_go_e2e.py | 2 +- .../test_go_neo4j_multi_application_scope.py | 84 ++++++ tests/analysis/java/conftest.py | 8 +- tests/analysis/java/test_java_addressing.py | 20 +- tests/analysis/java/test_java_analysis.py | 10 +- tests/analysis/java/test_java_dataflow.py | 24 +- tests/analysis/java/test_java_degradation.py | 12 +- tests/analysis/java/test_java_e2e.py | 2 +- tests/analysis/java/test_java_entrypoints.py | 14 +- .../java/test_java_neo4j_lookup_miss.py | 3 + ...test_java_neo4j_multi_application_scope.py | 80 ++++-- .../analysis/java/test_java_public_surface.py | 12 +- tests/analysis/java/test_java_schema_probe.py | 2 +- tests/analysis/java/test_java_v1_accessors.py | 8 +- .../java/test_java_view_dispatches.py | 23 +- tests/analysis/java/test_jcodeanalyzer.py | 75 ++++-- tests/analysis/python/conftest.py | 13 +- tests/analysis/python/test_artifacts.py | 33 ++- tests/analysis/python/test_bodies.py | 2 +- tests/analysis/python/test_entrypoints.py | 24 +- .../analysis/python/test_external_symbols.py | 20 +- tests/analysis/python/test_locate.py | 12 +- tests/analysis/python/test_module_key_of.py | 21 +- .../test_neo4j_multi_application_scope.py | 67 ++++- tests/analysis/python/test_python_analysis.py | 4 +- .../python/test_python_method_lookup.py | 12 + .../python/test_python_neo4j_selection.py | 2 +- tests/analysis/python/test_python_taint.py | 8 +- .../analysis/python/test_resolution_probe.py | 2 +- tests/analysis/python/test_resolve.py | 2 +- .../analysis/python/test_scoping_keywords.py | 33 ++- tests/analysis/typescript/conftest.py | 6 + .../typescript/test_typescript_addressing.py | 8 +- .../typescript/test_typescript_analysis.py | 46 ++-- .../test_typescript_bulk_accessors.py | 2 +- .../typescript/test_typescript_dataflow.py | 4 +- .../typescript/test_typescript_e2e.py | 2 +- .../test_typescript_e2e_neo4j_live.py | 16 +- .../typescript/test_typescript_entrypoints.py | 4 +- .../test_typescript_external_reconstruct.py | 7 +- .../test_typescript_get_method_functions.py | 21 +- .../test_typescript_neo4j_backend.py | 2 +- .../typescript/test_typescript_neo4j_bulk.py | 5 +- ...ypescript_neo4j_multi_application_scope.py | 50 ++-- .../test_typescript_neo4j_selection.py | 2 +- .../typescript/test_typescript_taint.py | 20 +- tests/models/go/test_go_models.py | 6 +- tests/models/java/test_java_models.py | 4 +- tests/models/python/test_python_models.py | 45 +++- tests/models/typescript/test_ts_v2_models.py | 12 +- tests/resources/go/analysis.json | 2 +- tests/resources/go/analysis_json/v2/README.md | 19 ++ .../resources/java/analysis_json/v2/README.md | 21 ++ .../java/analysis_json/v2/a1/analysis.json.gz | Bin 924438 -> 926009 bytes .../java/analysis_json/v2/a4/analysis.json.gz | Bin 353246 -> 354831 bytes .../resources/regenerate_identity_fixtures.py | 125 +++++++++ .../typescript/analysis_json/v2/README.md | 19 ++ .../analysis_json/v2/a1/analysis.json | 2 +- .../analysis_json/v2/a2/analysis.json | 2 +- .../analysis_json/v2/a3/analysis.json | 2 +- .../analysis_json/v2/a4/analysis.json | 2 +- 85 files changed, 1642 insertions(+), 545 deletions(-) create mode 100644 cldk/analysis/commons/identity.py create mode 100644 tests/analysis/commons/test_identity.py create mode 100644 tests/analysis/commons/test_identity_local_producers.py create mode 100644 tests/analysis/go/test_go_neo4j_multi_application_scope.py create mode 100644 tests/resources/regenerate_identity_fixtures.py diff --git a/cldk/analysis/commons/backend_config.py b/cldk/analysis/commons/backend_config.py index f2a3b83..3c0b2ca 100644 --- a/cldk/analysis/commons/backend_config.py +++ b/cldk/analysis/commons/backend_config.py @@ -34,10 +34,13 @@ from __future__ import annotations -from dataclasses import dataclass +from dataclasses import dataclass, field +import hashlib from pathlib import Path from typing import Union +from cldk.analysis.commons.identity import ApplicationIdentity + # The canonical sub-directory name each language's artifacts live under inside the shared cache # root. Keyed so that a polyglot repository analyzed under more than one language does not have its # backends overwrite a single shared ``analysis.json``. @@ -54,10 +57,14 @@ class CodeAnalyzerConfig: Attributes: cache_dir: Root directory for analysis artifacts. When ``None`` the facade defaults it to ``/.codeanalyzer``. Each backend writes under a language-keyed subdirectory of - this root (see :func:`cache_subdir`), so the same root can be shared across languages. + this root (see :func:`cache_subdir`), with a separate digest for each application identity. + namespace: Raw namespace; defaults to the resolved application name. + application_name: Raw application name; defaults to the normalized project-root basename. """ cache_dir: Union[str, Path, None] = None + namespace: str | None = field(default=None, kw_only=True) + application_name: str | None = field(default=None, kw_only=True) @dataclass @@ -112,6 +119,7 @@ class Neo4jConnectionConfig: password: str = "neo4j" database: str | None = None application_name: str | None = None + namespace: str | None = field(default=None, kw_only=True) # Per-language discriminated unions the facades match on. @@ -124,17 +132,19 @@ class Neo4jConnectionConfig: GoBackend = Union[CodeAnalyzerConfig, Neo4jConnectionConfig] -def cache_subdir(cache_dir: Union[str, Path, None], project_dir: Union[str, Path, None], language: str) -> Path | None: +def cache_subdir(cache_dir: Union[str, Path, None], project_dir: Union[str, Path, None], language: str, *, identity: ApplicationIdentity | None = None) -> Path | None: """Resolve the language-keyed cache directory for a backend. Args: cache_dir: The cache root from the backend config. When ``None``, defaults to ``/.codeanalyzer``. project_dir: The project directory, used to derive the default root. + identity: Bound application identity; when supplied its digest isolates cached outputs. language: The canonical language key (``"java"``, ``"python"``, ``"typescript"``, ``"go"``). Returns: - ``/`` as an absolute path, or ``None`` if no root can be determined + ``//`` (or the language directory when unbound) + as an absolute path, or ``None`` if no root can be determined (no ``cache_dir`` and no ``project_dir``). """ key = _CACHE_KEYS.get(language, language) @@ -144,4 +154,6 @@ def cache_subdir(cache_dir: Union[str, Path, None], project_dir: Union[str, Path root = Path(project_dir).expanduser().resolve() / ".codeanalyzer" else: return None + if identity is not None: + return root / key / hashlib.sha256(identity.application_id.encode()).hexdigest() return root / key diff --git a/cldk/analysis/commons/identity.py b/cldk/analysis/commons/identity.py new file mode 100644 index 0000000..f60d84b --- /dev/null +++ b/cldk/analysis/commons/identity.py @@ -0,0 +1,84 @@ +################################################################################ +# Copyright IBM Corporation 2026 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +################################################################################ + +"""Validated raw application identity and canonical URI ownership.""" + +import json +import unicodedata +from dataclasses import dataclass +from pathlib import Path +from urllib.parse import quote + +from cldk.utils.exceptions import CodeanalyzerExecutionException + + +@dataclass(frozen=True) +class ApplicationIdentity: + namespace: str + application_name: str + application_id: str + + +def _segment(value: str) -> str: + if not isinstance(value, str) or not value.strip() or value in {".", ".."} or any(c in "/\\" or unicodedata.category(c) in {"Cc", "Cs"} for c in value): + raise ValueError("identity names must be nonempty raw names without separators or control characters") + return quote(value, safe="-._~", encoding="utf-8", errors="strict") + + +def resolve_identity(application_name: str | None, namespace: str | None, *, project_root: Path | None = None) -> ApplicationIdentity: + if application_name is None: + if project_root is None: + raise CodeanalyzerExecutionException("application_name is required to scope queries to an application.") + application_name = Path(project_root).expanduser().resolve().name + namespace = application_name if namespace is None else namespace + return ApplicationIdentity(namespace, application_name, f"can://{_segment(namespace)}/{_segment(application_name)}") + + +def validate_identity(payload, identity: ApplicationIdentity, *, envelope: bool = True): + """Reject legacy or foreign persisted data without synthesizing metadata.""" + if envelope and hasattr(payload, "application"): + app_model = payload.application + if hasattr(app_model, "identity_version") and "identity_version" not in app_model.model_fields_set: + raise CodeanalyzerExecutionException("Analysis identity marker is missing from the application.") + raw = ( + payload.model_dump(include={"identity_version": True, "language": True, "application": {"identity_version", "id", "application_name", "identity_namespace"}}) + if envelope and hasattr(payload, "model_dump") + else payload + ) + if not isinstance(raw, dict): + raise CodeanalyzerExecutionException("Analysis identity metadata must be an object.") + app = raw.get("application", {}) if envelope else raw + if not isinstance(app, dict): + raise CodeanalyzerExecutionException("Application identity metadata must be an object.") + if envelope and raw.get("language") != "java" and (type(app.get("identity_version")) is not int or app.get("identity_version") != 2): + raise CodeanalyzerExecutionException("Analysis identity marker is missing from the application.") + if ( + type(raw.get("identity_version")) is not int + or raw.get("identity_version") != 2 + or app.get("application_name") != identity.application_name + or app.get("identity_namespace") != identity.namespace + or app.get("id") != identity.application_id + ): + raise CodeanalyzerExecutionException("Analysis identity metadata is missing, incompatible, or outside the requested application scope.") + return payload + + +def cache_matches(path: Path, identity: ApplicationIdentity) -> bool: + try: + validate_identity(json.loads(path.read_text(encoding="utf-8")), identity) + return True + except (OSError, ValueError, CodeanalyzerExecutionException): + return False diff --git a/cldk/analysis/commons/keys.py b/cldk/analysis/commons/keys.py index 518616a..4642343 100644 --- a/cldk/analysis/commons/keys.py +++ b/cldk/analysis/commons/keys.py @@ -26,38 +26,44 @@ import os import posixpath -from typing import Collection, Iterable, List, Sequence +from typing import Collection, Iterable, List, Sequence, Mapping +from pathlib import Path from cldk.analysis.commons.bounds import check_depth, check_selector, reject_bare_string -def resolve_module_key(path: str, keys: Iterable[str]) -> str: - """The symbol-table / graph ``file_key`` naming ``path``, or ``path`` unchanged if none does. - - A caller of :meth:`PythonAnalysisBackend.locate` hands over whatever its scanner printed — - ``./src/app.py``, ``src/../src/app.py``, or an absolute path from the machine the scan ran on — - while both backends are keyed by the project-relative path the analyzer saw. Exact key first, - then the normalised form, then the longest known key the normalised path *ends on a segment - boundary* of (which is what an absolute path is). Returning ``path`` unchanged when nothing - matches is deliberate: the caller then gets ``file_not_in_graph`` naming the path it asked - about, not a silently substituted neighbour. - """ - keys = list(keys) - if path in keys: +def resolve_module_key( + path: str, keys: Iterable[str], *, application_id: str | None = None, module_ids: Mapping[str, str] | None = None, source_root: str | Path | None = None +) -> str: + """Resolve only within the bound application's verified module IDs and source root.""" + path = str(path) + known = list(keys) + if path.startswith("can:") or "://" in path: + if application_id is None or not path.startswith(application_id + "/") or module_ids is None: + raise ValueError("Module URI is outside the bound application scope") + matches = [key for key, value in module_ids.items() if value == path and key in known] + if len(matches) != 1: + raise ValueError("Module URI is not a module in the selected language view") + return matches[0] + if Path(path).is_absolute(): + if source_root is None or not Path(source_root).is_dir(): + raise ValueError("Absolute module paths require a bound source root") + try: + path = Path(path).resolve().relative_to(Path(source_root).resolve()).as_posix() + except ValueError as exc: + raise ValueError("Absolute module path is outside the bound source root") from exc + if path in known: return path - norm = posixpath.normpath(str(path).replace(os.sep, "/")) - if norm in keys: - return norm - suffix_matches = [k for k in keys if norm.endswith("/" + k)] - return max(suffix_matches, key=len) if suffix_matches else path + norm = posixpath.normpath(path.replace(os.sep, "/")) + return norm if norm in known else path -def scope_paths(paths: Sequence[str] | None, keys: Iterable[str], kind: str = "paths") -> List[str] | None: +def scope_paths(paths: Sequence[str] | None, keys: Iterable[str], kind: str = "paths", **scope) -> List[str] | None: """Resolve requested module paths to symbol-table keys, or ``None`` for "the whole application". Both backends route their ``paths=`` / ``module=`` keywords through here, so the lenient - resolution (:func:`resolve_module_key` — an absolute path or one with native separators finds - its module) and the strictness (:func:`check_selector` — a path naming no module raises) cannot + resolution (:func:`resolve_module_key` — relative keys, verified module URIs, or absolute + paths under the existing bound source root) and the strictness (:func:`check_selector` — a path naming no module raises) cannot drift apart between them. Args: @@ -68,8 +74,8 @@ def scope_paths(paths: Sequence[str] | None, keys: Iterable[str], kind: str = "p single-valued keyword routes through here as a one-element sequence. **Resolution is many-to-one, and the result is de-duplicated.** Leniency is the whole point of - :func:`resolve_module_key` — ``"pkg/a.py"`` and ``"/abs/pkg/a.py"`` are two spellings a scanner - may plausibly hand over for the *same* module — so two requested paths legitimately collapse to + :func:`resolve_module_key` — a relative key and an absolute path under the bound root may + name the *same* module — so two requested paths legitimately collapse to one key and the caller gets one entry back. Raising on the collapse would punish the very caller the leniency exists for; de-duplicating explicitly is what keeps the returned list from naming the same module twice and asking both backends to fetch it twice. @@ -83,7 +89,7 @@ def scope_paths(paths: Sequence[str] | None, keys: Iterable[str], kind: str = "p if paths is None: return None known = list(keys) - resolved = [resolve_module_key(p, known) for p in paths] + resolved = [resolve_module_key(p, known, **scope) for p in paths] check_selector(kind, list(paths), [p for p, r in zip(paths, resolved) if r not in known]) return list(dict.fromkeys(resolved)) @@ -182,3 +188,15 @@ def body_key_column(key: str) -> int: """ _, _, col = key.split("/", 1)[0].partition(":") return int(col) if col.isdigit() else -1 + + +def module_scope(backend) -> dict: + """Carry the backend's selected owner and existing source root into path resolution.""" + identity = backend.identity + if hasattr(backend, "_module_ids"): + ids = backend._module_ids + elif hasattr(backend, "_module_props"): + ids = {key: props["id"] for key, props in backend._module_props.items()} + else: + ids = {key: value.id for key, value in backend.get_application_view().symbol_table.items()} + return dict(application_id=identity.application_id, module_ids=ids, source_root=getattr(backend, "source_root", getattr(backend, "project_dir", None))) diff --git a/cldk/analysis/go/codeanalyzer/codeanalyzer.py b/cldk/analysis/go/codeanalyzer/codeanalyzer.py index fd14e97..bb85ab0 100644 --- a/cldk/analysis/go/codeanalyzer/codeanalyzer.py +++ b/cldk/analysis/go/codeanalyzer/codeanalyzer.py @@ -34,6 +34,7 @@ import networkx as nx +from cldk.analysis.commons.identity import resolve_identity, validate_identity, cache_matches from cldk.analysis.commons.backend_config import cache_subdir from cldk.analysis.commons.levels import analyzer_level from cldk.analysis.go.backend import ARTIFACT_LAYER_UNAVAILABLE, GoAnalysisBackend @@ -50,6 +51,7 @@ from cldk.models.python import PyArtifact, PyConfigKey, PyConfigRead, PyConfigUseEdge, PyDependency from cldk.utils.exceptions.exceptions import CodeanalyzerExecutionException + class GoCodeanalyzer(GoAnalysisBackend): """Run ``cango`` and answer queries over the parsed ``analysis.json``. @@ -70,7 +72,12 @@ def __init__( analysis_level: str, eager_analysis: bool, target_files: List[str] | None, + *, + application_name: str | None = None, + namespace: str | None = None, ) -> None: + self.identity = resolve_identity(application_name, namespace, project_root=Path(project_dir) if project_dir is not None else None) + self.project_dir = project_dir self.cache_dir = cache_dir self.analysis_level = analysis_level @@ -80,8 +87,9 @@ def __init__( # unknown level rather than silently defaulting to 1 (the bug a hand-rolled dict caused). # cango has no L3/L4, so _argv caps the result at 2. self.analysis: GoAnalysis = self._init_codeanalyzer(analyzer_level(analysis_level)) + validate_identity(self.analysis, self.identity) self.application: GoApplication = self.analysis.application - self.application_name: str = self.application.id.removeprefix("can://") + self.application_name: str = self.identity.application_name self._call_graph: nx.DiGraph | None = None self._index() @@ -117,8 +125,8 @@ def _argv(self, analysis_level: int, output_dir: Path | None) -> List[str]: args = self._get_codeanalyzer_exec() + [ "-i", str(project), - "--app-name", - project.name, + f"--app-name={self.identity.application_name}", + f"--namespace={self.identity.namespace}", "-a", str(min(analysis_level, 2)), ] @@ -151,7 +159,7 @@ def _init_codeanalyzer(self, analysis_level: int) -> GoAnalysis: at or above the requested level is reused as-is: the schema is additive (``L1 ⊆ L2``), so a deeper cache already contains everything a shallower request needs. """ - output_dir = cache_subdir(self.cache_dir, self.project_dir, "go") + output_dir = cache_subdir(self.cache_dir, self.project_dir, "go", identity=self.identity) if output_dir is None: args = self._argv(analysis_level, None) try: @@ -166,7 +174,7 @@ def _init_codeanalyzer(self, analysis_level: int) -> GoAnalysis: # level it cannot produce). Compare the requested level, capped, against the cached level. requested = min(analysis_level, 2) cached_level = self._cached_level(analysis_json_file) if analysis_json_file.exists() else None - stale = cached_level is None or cached_level < requested + stale = cached_level is None or cached_level < requested or not cache_matches(analysis_json_file, self.identity) needs_run = self.eager_analysis or bool(self.target_files) or stale if needs_run: args = self._argv(analysis_level, output_dir) @@ -291,10 +299,7 @@ def get_source(self, node_id: str) -> str: """ entry = self._source_of.get(node_id) if entry is None: - raise CodeanalyzerExecutionException( - f"no source for {node_id!r}: not a type, callable or field of application " - f"{self.application_name!r}" - ) + raise CodeanalyzerExecutionException(f"no source for {node_id!r}: not a type, callable or field of application " f"{self.application_name!r}") mod, node = entry if node.span is None: raise CodeanalyzerExecutionException(f"node {node_id!r} carries no span, so it has no source text") @@ -311,9 +316,7 @@ def get_source(self, node_id: str) -> str: def get_artifacts(self) -> Dict[str, PyArtifact]: raise CodeanalyzerExecutionException(ARTIFACT_LAYER_UNAVAILABLE.format(app=self.application_name)) - def get_dependencies( - self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None - ) -> List[PyDependency]: + def get_dependencies(self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None) -> List[PyDependency]: raise CodeanalyzerExecutionException(ARTIFACT_LAYER_UNAVAILABLE.format(app=self.application_name)) def get_config_keys(self) -> Dict[str, PyConfigKey]: diff --git a/cldk/analysis/go/go_analysis.py b/cldk/analysis/go/go_analysis.py index 5575be9..903368b 100644 --- a/cldk/analysis/go/go_analysis.py +++ b/cldk/analysis/go/go_analysis.py @@ -36,6 +36,7 @@ import networkx as nx +from cldk.analysis.commons.identity import resolve_identity from cldk.analysis.commons.backend_config import CodeAnalyzerConfig, GoBackend, Neo4jConnectionConfig from cldk.analysis.go.backend import GoAnalysisBackend from cldk.analysis.go.codeanalyzer import GoCodeanalyzer @@ -71,19 +72,24 @@ def __init__( # The backend is selected by the *type* of the config: Neo4jConnectionConfig picks the # read-only Cypher backend, CodeAnalyzerConfig (the default) the in-process cango. self.backend_config: GoBackend = backend if backend is not None else CodeAnalyzerConfig() + self.identity = resolve_identity(self.backend_config.application_name, self.backend_config.namespace, project_root=Path(project_dir) if project_dir is not None else None) self.backend: GoAnalysisBackend if isinstance(self.backend_config, Neo4jConnectionConfig): cfg = self.backend_config - application_name = cfg.application_name or (Path(project_dir).name if project_dir else None) + application_name = self.identity.application_name self.backend = GoNeo4jBackend( neo4j_uri=cfg.uri, neo4j_username=cfg.username, neo4j_password=cfg.password, neo4j_database=cfg.database, application_name=application_name, + namespace=self.identity.namespace, + source_root=project_dir, ) else: self.backend = GoCodeanalyzer( + application_name=self.identity.application_name, + namespace=self.identity.namespace, project_dir=project_dir, cache_dir=self.backend_config.cache_dir, analysis_level=analysis_level, diff --git a/cldk/analysis/go/neo4j/neo4j_backend.py b/cldk/analysis/go/neo4j/neo4j_backend.py index 4a5068f..8c97954 100644 --- a/cldk/analysis/go/neo4j/neo4j_backend.py +++ b/cldk/analysis/go/neo4j/neo4j_backend.py @@ -45,6 +45,7 @@ import networkx as nx +from cldk.analysis.commons.identity import resolve_identity, validate_identity from cldk.analysis.go.backend import ARTIFACT_LAYER_UNAVAILABLE, GoAnalysisBackend from cldk.analysis.go.neo4j import reconstruct as R from cldk.models.go import GoApplication, GoCallable, GoCallGraphEdge, GoField, GoModule, GoParam, GoType @@ -65,50 +66,58 @@ def __init__( neo4j_password: str, neo4j_database: str | None = None, application_name: str | None = None, + namespace: str | None = None, + source_root=None, ) -> None: try: from neo4j import GraphDatabase except ModuleNotFoundError as e: # pragma: no cover - import guard - raise CodeanalyzerExecutionException( - "The Neo4j backend requires the 'neo4j' driver. Install it with `pip install neo4j` " - "(or `pip install cldk[neo4j]`)." - ) from e + raise CodeanalyzerExecutionException("The Neo4j backend requires the 'neo4j' driver. Install it with `pip install neo4j` " "(or `pip install cldk[neo4j]`).") from e self._init_with_driver( GraphDatabase.driver(neo4j_uri, auth=(neo4j_username, neo4j_password)), application_name=application_name, + namespace=namespace, + source_root=source_root, neo4j_database=neo4j_database, ) @classmethod - def _from_driver(cls, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None) -> "GoNeo4jBackend": + def _from_driver( + cls, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None, namespace: str | None = None, source_root=None + ) -> "GoNeo4jBackend": """Construct from an already-built driver — the seam tests inject a fake/real driver here.""" self = cls.__new__(cls) - self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database) + self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database, namespace=namespace, source_root=source_root) return self - def _init_with_driver(self, driver: Any, *, application_name: str | None, neo4j_database: str | None) -> None: - if not application_name: - raise CodeanalyzerExecutionException("application_name is required to scope queries to an application.") - self.application_name = application_name + def _init_with_driver(self, driver: Any, *, application_name: str | None, neo4j_database: str | None, namespace: str | None = None, source_root=None) -> None: + self.identity = resolve_identity(application_name, namespace) + self.application_name = self.identity.application_name + self.source_root = source_root self._database = neo4j_database self._driver = driver self._session_obj: Any | None = None self._call_graph: nx.DiGraph | None = None self._probe_schema() + self._probe_identity() # -----[ scope + execution ]----- @property def _app_id(self) -> str: - """``can://`` — the ``:GoApplication`` anchor id and the root of every id below it.""" - return f"can://{self.application_name}" + """``can:///`` — the ``:GoApplication`` anchor id and the root of every id below it.""" + return self.identity.application_id @property def _scope_prefix(self) -> str: - """``can:///`` — the trailing slash keeps ``app`` from matching ``app-b``.""" + """``can:////`` — the trailing slash keeps ``app`` from matching ``app-b``.""" return f"{self._app_id}/" def _run(self, query: str, **params: Any) -> List[Dict[str, Any]]: """Run one read statement over a reused session; drop the session on failure.""" + for name in ("id", "mid", "tid"): + value = params.get(name) + if isinstance(value, str) and value.startswith("can:") and not value.startswith(self._scope_prefix + "go/"): + raise ValueError("Node URI is outside the bound Go application scope") if self._session_obj is None: self._session_obj = self._driver.session(database=self._database) try: @@ -128,19 +137,19 @@ def __enter__(self) -> "GoNeo4jBackend": def __exit__(self, *exc: Any) -> None: self.close() + def _probe_identity(self) -> None: + rows = self._run("MATCH (a:GoApplication {id: $app_id}) RETURN properties(a) AS identity", app_id=self._app_id) + validate_identity(rows[0].get("identity", {}) if rows else {}, self.identity, envelope=False) + def _probe_schema(self) -> None: """Refuse a graph that is not a codeanalyzer-go projection or holds no node for this app.""" found = {r["relationshipType"] for r in self._run("CALL db.relationshipTypes()")} missing = _REQUIRED_RELS - found if missing: - raise CodeanalyzerExecutionException( - f"the graph is not a codeanalyzer-go projection: missing relationship types {sorted(missing)}" - ) + raise CodeanalyzerExecutionException(f"the graph is not a codeanalyzer-go projection: missing relationship types {sorted(missing)}") rows = self._run("OPTIONAL MATCH (a:GoApplication {id: $app_id}) RETURN count(a) AS n", app_id=self._app_id) if not (rows and rows[0].get("n")): - raise CodeanalyzerExecutionException( - f"the graph holds no :GoApplication node for {self.application_name!r} (id {self._app_id!r})" - ) + raise CodeanalyzerExecutionException(f"the graph holds no :GoApplication node for {self.application_name!r} (id {self._app_id!r})") # -----[ application / whole-program ]----- def get_application_view(self) -> GoApplication: @@ -151,14 +160,24 @@ def get_application_view(self) -> GoApplication: @cached_property def _application(self) -> GoApplication: - return GoApplication(id=self._app_id, symbol_table=self._build_symbol_table(), call_graph=self._call_edges()) + return GoApplication( + identity_version=2, + application_name=self.identity.application_name, + identity_namespace=self.identity.namespace, + id=self._app_id, + symbol_table=self._build_symbol_table(), + call_graph=self._call_edges(), + ) def get_symbol_table(self) -> Dict[str, GoModule]: return self.get_application_view().symbol_table def _module_file_key(self, module_id: str) -> str: """``can:///`` → ```` (the symbol-table key the local backend uses).""" - return module_id[len(self._scope_prefix):] + prefix = self._scope_prefix + "go/" + if not module_id.startswith(prefix): + raise ValueError("Module URI is outside the bound Go application scope") + return module_id[len(prefix) :] def _build_symbol_table(self) -> Dict[str, GoModule]: """Rebuild every module with its types, functions, methods and fields from the containment @@ -204,14 +223,10 @@ def _build_symbol_table(self) -> Dict[str, GoModule]: # -----[ call graph ]----- def _call_edges(self) -> List[GoCallGraphEdge]: rows = self._run( - "MATCH (a:GoCallable)-[r:GO_CALLS]->(b) WHERE a.id STARTS WITH $pre " - "RETURN a.id AS src, b.id AS dst, properties(r) AS p ORDER BY a.id, b.id", + "MATCH (a:GoCallable)-[r:GO_CALLS]->(b) WHERE a.id STARTS WITH $pre " "RETURN a.id AS src, b.id AS dst, properties(r) AS p ORDER BY a.id, b.id", pre=self._scope_prefix, ) - return [ - GoCallGraphEdge(src=r["src"], dst=r["dst"], prov=list(r["p"].get("prov") or []), weight=r["p"].get("weight", 1)) - for r in rows - ] + return [GoCallGraphEdge(src=r["src"], dst=r["dst"], prov=list(r["p"].get("prov") or []), weight=r["p"].get("weight", 1)) for r in rows] def get_call_graph(self) -> nx.DiGraph: if self._call_graph is not None: @@ -290,8 +305,7 @@ def get_functions(self) -> Dict[str, GoCallable]: """Every package-level function (``:GoModule``-[:GO_DECLARES]->(:GoCallable)``), keyed by signature.""" rows = self._run( - "MATCH (m:GoModule)-[:GO_DECLARES]->(c:GoCallable) WHERE m.id STARTS WITH $pre " - "RETURN properties(c) AS p ORDER BY c.signature", + "MATCH (m:GoModule)-[:GO_DECLARES]->(c:GoCallable) WHERE m.id STARTS WITH $pre " "RETURN properties(c) AS p ORDER BY c.signature", pre=self._scope_prefix, ) return {r["p"]["signature"]: R.callable_(r["p"]) for r in rows} @@ -305,9 +319,7 @@ def get_source(self, node_id: str) -> str: id=node_id, ) if not node_rows: - raise CodeanalyzerExecutionException( - f"no node {node_id!r} in the graph for application {self.application_name!r}" - ) + raise CodeanalyzerExecutionException(f"no node {node_id!r} in the graph for application {self.application_name!r}") span_json = node_rows[0]["span"] if not span_json: raise CodeanalyzerExecutionException(f"node {node_id!r} carries no span, so it has no source text") @@ -328,9 +340,7 @@ def get_source(self, node_id: str) -> str: def get_artifacts(self) -> Dict[str, PyArtifact]: raise CodeanalyzerExecutionException(ARTIFACT_LAYER_UNAVAILABLE.format(app=self.application_name)) - def get_dependencies( - self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None - ) -> List[PyDependency]: + def get_dependencies(self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None) -> List[PyDependency]: raise CodeanalyzerExecutionException(ARTIFACT_LAYER_UNAVAILABLE.format(app=self.application_name)) def get_config_keys(self) -> Dict[str, PyConfigKey]: diff --git a/cldk/analysis/java/backend.py b/cldk/analysis/java/backend.py index 2cace7b..9b0ffd2 100644 --- a/cldk/analysis/java/backend.py +++ b/cldk/analysis/java/backend.py @@ -54,6 +54,7 @@ import networkx as nx +from cldk.analysis.commons.keys import module_scope from cldk.analysis.commons.backend import AnalysisBackend from cldk.analysis.commons.bounds import ( DEFAULT_DEPTH, @@ -67,7 +68,19 @@ check_max_paths, reject_bare_string, ) -from cldk.analysis.commons.graphs import as_slice_node, call_reaches, cone_sinks, edge_sort_key, flow_path, sdg_rel_pattern, sdg_rels, shortest_walks, slice_resolved, taint_verdict, via_table +from cldk.analysis.commons.graphs import ( + as_slice_node, + call_reaches, + cone_sinks, + edge_sort_key, + flow_path, + sdg_rel_pattern, + sdg_rels, + shortest_walks, + slice_resolved, + taint_verdict, + via_table, +) from cldk.analysis.commons.keys import body_key_column, resolve_module_key from cldk.analysis.commons.resolve import CallableCandidate, resolve_callable_signature, resolve_sanitizers, resolve_value_name, resolve_within from cldk.analysis.commons.results import ( @@ -526,7 +539,7 @@ def unhomed_endpoint(node_id: str) -> str: module key its id *spells* rather than by the id itself (E6).""" module, sep, rest = node_id.partition(".java/") signature = (rest or node_id).rpartition("/")[2] - where = f"{module.split('/', 4)[4]}.java" if sep and module.count("/") >= 4 else "no module of this application" + where = f"{module.partition('/java/')[2]}.java" if sep and "/java/" in module else "no module of this application" return f"call-graph endpoint {signature!r} in {where!r} is not one of its callables: codeanalyzer-java emitted an unhomed endpoint" @@ -655,7 +668,7 @@ def _enclosing(self, path: str, line: int) -> Tuple[str, Optional[_Addressed]]: constructor (99 of daytrader8's 1,216) — is contained by nothing, which is right: it has no position in the file to be found at. """ - key = resolve_module_key(str(path), self.get_application_view().symbol_table.keys()) + key = resolve_module_key(str(path), self.get_application_view().symbol_table.keys(), **module_scope(self)) rows = [r for r in self._addressing.by_path.get(key, ()) if r.callable.span is not None and r.callable.start_line <= line <= r.callable.end_line] if not rows: return key, None @@ -1648,7 +1661,7 @@ def _application_name(self) -> str: Read off the application's own id rather than stored, so the in-memory backend (which has no ``application_name``) and the graph backend give one answer. Only the *name* segment leaves this method: a ``can://`` id must not appear in a message (E6).""" - return self.get_application_view().id.rpartition("/")[2] + return self.get_application_view().application_name # -----[ the per-callable graphs ]----- @abstractmethod diff --git a/cldk/analysis/java/codeanalyzer/codeanalyzer.py b/cldk/analysis/java/codeanalyzer/codeanalyzer.py index c31e78e..aaf1fd7 100644 --- a/cldk/analysis/java/codeanalyzer/codeanalyzer.py +++ b/cldk/analysis/java/codeanalyzer/codeanalyzer.py @@ -38,6 +38,7 @@ import networkx as nx from pydantic import ValidationError +from cldk.analysis.commons.identity import resolve_identity, validate_identity, cache_matches from cldk.analysis import AnalysisLevel from cldk.analysis.commons.bounds import DEFAULT_PAGE_SIZE, check_page_size, edge_page from cldk.analysis.commons.graphs import flow_path, shortest_walks, slice_resolved, under_callable @@ -206,7 +207,14 @@ def __init__( analysis_level: str, eager_analysis: bool, target_files: List[str] | None, + *, + application_name: str | None = None, + namespace: str | None = None, ) -> None: + if project_dir is None: + raise CodeanalyzerExecutionException("Cannot run codeanalyzer-java: no project directory.") + self.identity = resolve_identity(application_name, namespace, project_root=Path(project_dir)) + self.project_dir = project_dir self.analysis_json_path = analysis_json_path self.analysis_level = analysis_level @@ -215,6 +223,7 @@ def __init__( self.analyzer_diagnostics: List[Diagnostic] | None = None self.analysis: JAnalysis = self._init_codeanalyzer(analysis_level=analyzer_level(analysis_level)) self._report_analyzer_diagnostics(analyzer_level(analysis_level)) + validate_identity(self.analysis, self.identity) self.application: JApplication = self.analysis.application self._call_graph: nx.DiGraph | None = None self._sdg_cache: Any = None @@ -254,7 +263,7 @@ def _argv(self, analysis_level: int, output_dir: Path | None) -> List[str]: args += ["-i", str(project), "-a", str(analysis_level)] if output_dir is not None: args += ["-o", str(output_dir), "-c", str(output_dir / "cache"), "-v"] - args += ["--app-name", project.name] + args += [f"--app-name={self.identity.application_name}", f"--namespace={self.identity.namespace}"] for tf in self.target_files or []: args += ["-t", str(tf).strip()] return args @@ -294,7 +303,12 @@ def _init_codeanalyzer(self, analysis_level: int) -> JAnalysis: output_dir = Path(self.analysis_json_path) analysis_json_file = output_dir / "analysis.json" verdict_file = output_dir / VERDICT_FILE - needs_run = self.eager_analysis or bool(self.target_files) or not self.check_exisiting_analysis_file_level(analysis_json_file, analysis_level) + needs_run = ( + self.eager_analysis + or bool(self.target_files) + or not self.check_exisiting_analysis_file_level(analysis_json_file, analysis_level) + or not cache_matches(analysis_json_file, self.identity) + ) if needs_run: args = self._argv(analysis_level, output_dir) try: @@ -900,7 +914,10 @@ def get_artifacts(self) -> Dict[str, PyArtifact]: """Every non-code artifact (see :meth:`AnalysisBackend.get_artifacts`), keyed by repo-relative path as the wire keys them. ``JArtifact.text_truncated`` has no home on the shared model and is not carried; read it off ``JApplication.artifacts`` when it matters.""" - return {path: PyArtifact(**a.model_dump(exclude={"config_keys", "text_truncated"}), config_keys=[PyConfigKey(**ck.model_dump()) for ck in a.config_keys]) for path, a in self.application.artifacts.items()} + return { + path: PyArtifact(**a.model_dump(exclude={"config_keys", "text_truncated"}), config_keys=[PyConfigKey(**ck.model_dump()) for ck in a.config_keys]) + for path, a in self.application.artifacts.items() + } def get_dependencies(self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None) -> List[PyDependency]: """Every declared dependency, optionally filtered (see :meth:`AnalysisBackend.get_dependencies`). diff --git a/cldk/analysis/java/java_analysis.py b/cldk/analysis/java/java_analysis.py index 614d586..547a851 100644 --- a/cldk/analysis/java/java_analysis.py +++ b/cldk/analysis/java/java_analysis.py @@ -52,6 +52,7 @@ from tree_sitter import Tree +from cldk.analysis.commons.identity import resolve_identity from cldk.analysis.commons.backend_config import CodeAnalyzerConfig, JavaBackend, Neo4jConnectionConfig, cache_subdir from cldk.analysis.commons.bounds import DEFAULT_DEPTH, DEFAULT_MAX_NODES, DEFAULT_MAX_PATHS, DEFAULT_PAGE_SIZE from cldk.analysis.commons.results import EdgePage, EntrypointCoverage, FlowPaths, LocateResult, Slice, SliceNode, TaintResult @@ -164,24 +165,29 @@ def __init__( self.target_files = target_files self.backend_config: JavaBackend = backend if backend is not None else CodeAnalyzerConfig() self.treesitter_java: TreesitterJava = TreesitterJava() + self.identity = resolve_identity(self.backend_config.application_name, self.backend_config.namespace, project_root=Path(project_dir) if project_dir is not None else None) self.backend: JavaAnalysisBackend if isinstance(self.backend_config, Neo4jConnectionConfig): # Read-only: the graph is populated out of band; the SDK only polls it. cfg = self.backend_config - application_name = cfg.application_name or (Path(project_dir).name if project_dir else None) + application_name = self.identity.application_name self.backend = JNeo4jBackend( neo4j_uri=cfg.uri, neo4j_username=cfg.username, neo4j_password=cfg.password, neo4j_database=cfg.database, application_name=application_name, + namespace=self.identity.namespace, + source_root=project_dir, ) else: # The config only carries the cache root. analysis.json is cached under /java. - cache_path = cache_subdir(self.backend_config.cache_dir, project_dir, "java") + cache_path = cache_subdir(self.backend_config.cache_dir, project_dir, "java", identity=self.identity) if cache_path is not None: cache_path.mkdir(parents=True, exist_ok=True) self.backend = JCodeanalyzer( + application_name=self.identity.application_name, + namespace=self.identity.namespace, project_dir=self.project_dir, eager_analysis=self.eager_analysis, analysis_level=self.analysis_level, @@ -552,9 +558,7 @@ def get_classes(self) -> Dict[str, JType]: """ return self.backend.get_all_classes() - def get_classes_by_criteria( - self, inclusions: List[str] | None = None, exclusions: List[str] | None = None - ) -> Dict[str, JType]: + def get_classes_by_criteria(self, inclusions: List[str] | None = None, exclusions: List[str] | None = None) -> Dict[str, JType]: """Return classes matching inclusion/exclusion filter criteria. Filters the project's classes based on substring matching against @@ -860,9 +864,7 @@ def get_implemented_interfaces(self, qualified_class_name: str) -> List[str]: """ return self.backend.get_implemented_interfaces(qualified_class_name) - def __get_class_call_graph_using_symbol_table( - self, qualified_class_name: str, method_signature: str | None = None - ) -> List[Tuple[JMethodDetail, JMethodDetail]]: + def __get_class_call_graph_using_symbol_table(self, qualified_class_name: str, method_signature: str | None = None) -> List[Tuple[JMethodDetail, JMethodDetail]]: """Return class-level call graph using the symbol table. Internal method that uses symbol table-based resolution for building @@ -881,12 +883,7 @@ def __get_class_call_graph_using_symbol_table( """ return self.backend.get_class_call_graph_using_symbol_table(qualified_class_name, method_signature) - def get_class_call_graph( - self, - qualified_class_name: str, - method_signature: str | None = None, - using_symbol_table: bool = False - ) -> List[Tuple[JMethodDetail, JMethodDetail]]: + def get_class_call_graph(self, qualified_class_name: str, method_signature: str | None = None, using_symbol_table: bool = False) -> List[Tuple[JMethodDetail, JMethodDetail]]: """Return call graph edges reachable from a class or method. Extracts a subset of the call graph containing only edges reachable diff --git a/cldk/analysis/java/neo4j/neo4j_backend.py b/cldk/analysis/java/neo4j/neo4j_backend.py index 103b2cc..db9c7a6 100644 --- a/cldk/analysis/java/neo4j/neo4j_backend.py +++ b/cldk/analysis/java/neo4j/neo4j_backend.py @@ -119,6 +119,7 @@ import networkx as nx +from cldk.analysis.commons.identity import resolve_identity, validate_identity from cldk.analysis.commons.bounds import DEFAULT_PAGE_SIZE, EdgeOrder, check_page_size, cursor_params, encode_cursor, keyset_where from cldk.analysis.commons.graphs import flow_path, sdg_path_query, sdg_taint_query, slice_resolved from cldk.analysis.commons.results import Diagnostic, EdgePage, FlowPath, FlowPaths, Slice, SliceNode @@ -244,28 +245,39 @@ def __init__( neo4j_password: str, neo4j_database: str | None = None, application_name: str | None = None, + namespace: str | None = None, + source_root=None, ) -> None: try: from neo4j import GraphDatabase except ModuleNotFoundError as e: # pragma: no cover - import guard raise CodeanalyzerExecutionException("The Neo4j backend requires the 'neo4j' driver. Install it with `pip install neo4j` (or `pip install cldk[neo4j]`).") from e - self._init_with_driver(GraphDatabase.driver(neo4j_uri, auth=(neo4j_username, neo4j_password)), application_name=application_name, neo4j_database=neo4j_database) + self._init_with_driver( + GraphDatabase.driver(neo4j_uri, auth=(neo4j_username, neo4j_password)), + application_name=application_name, + neo4j_database=neo4j_database, + namespace=namespace, + source_root=source_root, + ) @classmethod - def _from_driver(cls, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None) -> "JNeo4jBackend": + def _from_driver( + cls, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None, namespace: str | None = None, source_root=None + ) -> "JNeo4jBackend": """Construct from an already-built driver — the seam tests inject a fake driver through.""" self = cls.__new__(cls) - self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database) + self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database, namespace=namespace, source_root=source_root) return self - def _init_with_driver(self, driver: Any, *, application_name: str | None, neo4j_database: str | None) -> None: - if not application_name: - raise CodeanalyzerExecutionException("application_name is required to scope queries to an application.") - self.application_name = application_name + def _init_with_driver(self, driver: Any, *, application_name: str | None, neo4j_database: str | None, namespace: str | None = None, source_root=None) -> None: + self.identity = resolve_identity(application_name, namespace) + self.application_name = self.identity.application_name + self.source_root = source_root self._database = neo4j_database self._driver = driver self._session_obj: Any | None = None self._probe_schema() + self._probe_identity() self._has_resolution_edges = self._probe_resolution_edges() self._module_props: Dict[str, Dict[str, Any]] = self._load_modules() self._modules: List[str] = list(self._module_props) @@ -274,12 +286,12 @@ def _init_with_driver(self, driver: Any, *, application_name: str | None, neo4j_ # -----[ scope ]----- @property def _application_id(self) -> str: - """``can://`` — the ``:JApplication`` root's own merge key since 3.1.1.""" - return f"can://{self.application_name}" + """``can:///`` — the ``:JApplication`` root's own merge key since 3.1.1.""" + return self.identity.application_id @property def _scope_prefix(self) -> str: - """``can:///`` — the trailing slash keeps ``app`` from matching ``app-b``. + """``can:////`` — the trailing slash keeps ``app`` from matching ``app-b``. The *application* prefix, not the narrower ``can:///java/`` code one: an ``@external`` ghost and an artifact both sit inside the application and outside the language segment (see @@ -315,6 +327,10 @@ def _run(self, query: str, **params: Any) -> List[Dict[str, Any]]: raise # -----[ attach ]----- + def _probe_identity(self) -> None: + rows = self._run("MATCH (a:JApplication {id: $app_id}) RETURN properties(a) AS identity", app_id=self._application_id) + validate_identity(rows[0].get("identity", {}) if rows else {}, self.identity, envelope=False) + def _probe_schema(self) -> None: """J-9: the relationship-type fingerprint, then the analyzer generation the ``:JApplication`` anchor stamps, against :attr:`_ANALYZER_FLOOR`. @@ -575,6 +591,8 @@ def _reconstruct(self) -> JApplication: types[self._child_key(module_id, p)] = self._type(p, children, sites) symbol_table[key] = R.compilation_unit(props, import_declarations=[i for e in imports.get(key, []) for i in R.imports(e)], types=types) return JApplication( + application_name=self.identity.application_name, + identity_namespace=self.identity.namespace, id=self._application_id, symbol_table=symbol_table, call_graph=[JCallGraphEdge(src=r["src"], dst=r["dst"], prov=list(r["prov"] or []), weight=r["weight"] or 1) for r in self._call_edge_rows()], diff --git a/cldk/analysis/python/codeanalyzer/codeanalyzer.py b/cldk/analysis/python/codeanalyzer/codeanalyzer.py index 776f3c5..f29a38b 100644 --- a/cldk/analysis/python/codeanalyzer/codeanalyzer.py +++ b/cldk/analysis/python/codeanalyzer/codeanalyzer.py @@ -52,7 +52,7 @@ import logging from functools import partial from pathlib import Path -from typing import Dict, FrozenSet, Iterator, List, Mapping, Sequence, Tuple, Union +from typing import Dict, FrozenSet, Iterable, Iterator, List, Mapping, Sequence, Tuple, Union import networkx as nx @@ -60,6 +60,9 @@ from codeanalyzer.options import AnalysisOptions, EmitTarget from codeanalyzer.schema import Analysis, model_dump_json +from dataclasses import replace +from cldk.analysis.commons.keys import module_scope +from cldk.analysis.commons.identity import resolve_identity, validate_identity from cldk.analysis import AnalysisLevel from cldk.analysis.commons.graphs import call_reaches, under_callable from cldk.analysis.commons.levels import ANALYZER_LEVELS, LEVEL_NAMES, analyzer_level @@ -298,7 +301,7 @@ def _resolve_callee( resolved = reverse_externals.get(cs.callee_signature, cs.callee_signature) else: resolved = cs.callee_signature - return cs if resolved == cs.callee_signature else cs.model_copy(update={"callee_signature": resolved}) + return cs if resolved == cs.callee_signature else replace(cs, callee_signature=resolved) def _decorator_covers(c: PyCallable, line: int) -> bool: @@ -441,6 +444,9 @@ def __init__( cache_dir: Union[str, Path, None] = None, target_files: List[str] | None = None, use_ray: bool = False, + *, + application_name: str | None = None, + namespace: str | None = None, ) -> None: """Initialize the Python code analyzer and run analysis. @@ -482,6 +488,8 @@ def __init__( Analysis is performed synchronously during initialization. For large projects, this may take significant time. """ + + self.identity = resolve_identity(application_name, namespace, project_root=Path(project_dir) if project_dir is not None else None) if project_dir is None: raise ValueError("project_dir is required for Python analysis.") # Expand ~ and resolve to absolute path for robustness @@ -506,6 +514,7 @@ def __init__( # max_level are facts a later, interprocedural-aware facade needs to tell "no result" # apart from "unanswerable at this analysis level". self.analysis: Analysis = self._run_analyzer() + validate_identity(self.analysis, self.identity) self.application: PyApplication = self.analysis.application # Class-signature → file path lookup, built once. # Built on first use by ``_sdg()``: the whole application's SDG adjacency, which every @@ -550,6 +559,8 @@ def _run_analyzer(self) -> Analysis: options = AnalysisOptions( input=self.project_dir, + app_name=self.identity.application_name, + namespace=self.identity.namespace, output=self.analysis_json_path, emit=EmitTarget.JSON, # Without this the analyzer ran at its own default (1) whatever the caller @@ -667,7 +678,7 @@ def get_symbol_table(self, *, paths: Sequence[str] | None = None) -> Dict[str, P (see :func:`~cldk.analysis.python.backend.scope_paths`). """ table = self.application.symbol_table - keys = scope_paths(paths, table.keys()) + keys = scope_paths(paths, table.keys(), **module_scope(self)) return table if keys is None else {k: table[k] for k in keys} def get_modules(self) -> List[PyModule]: @@ -766,7 +777,7 @@ def get_all_classes(self, *, module: str | None = None) -> Dict[str, PyClass]: but reports itself as ``module``, so the error names the keyword the caller wrote. """ table = self.application.symbol_table - keys = scope_paths(None if module is None else [module], table.keys(), kind="module") + keys = scope_paths(None if module is None else [module], table.keys(), kind="module", **module_scope(self)) result: Dict[str, PyClass] = {} for mod in table.values() if keys is None else (table[k] for k in keys): result.update(mod.types) @@ -1292,7 +1303,7 @@ def link(src: str, dst: str, label: tuple) -> None: backward.setdefault(dst, {}).setdefault(src, []).append(label) for c, _, _, path, _ in self._iter_callables(): - for key in (c.body or {}): + for key in c.body or {}: nodes[body_node_id(c.id, key)] = (c, key, path) # The relationship name each list is projected as, so a hop reports the same # ``via`` here as it does over the graph -- ``cldk.analysis.python.backend.VIA`` @@ -1684,10 +1695,7 @@ def get_callsites_for(self, signatures: List[str]) -> Dict[str, List[PyCallsite] wanted = set(signatures) id_to_sig = self._id_to_signature() declared_sigs = set(id_to_sig.values()) - reverse_externals = { - (f"{ext.module}.{ext.name}" if ext.module else ext.name): ext.id - for ext in self.application.external_symbols.values() - } + reverse_externals = {(f"{ext.module}.{ext.name}" if ext.module else ext.name): ext.id for ext in self.application.external_symbols.values()} return { c.signature: [_resolve_callee(cs, c.body, id_to_sig, declared_sigs, reverse_externals) for cs in c.call_sites] for c, _, _, _, _ in self._iter_callables() @@ -1708,9 +1716,7 @@ def get_artifacts(self) -> Dict[str, PyArtifact]: ``project.py`` iterates it the same way), so this is a direct passthrough.""" return dict(self.application.artifacts) - def get_dependencies( - self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None - ) -> List[PyDependency]: + def get_dependencies(self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None) -> List[PyDependency]: """Return every declared dependency, optionally filtered (see :meth:`AnalysisBackend.get_dependencies`).""" deps = self.application.dependencies @@ -1782,7 +1788,7 @@ def _not_analysed(self, path: str, line: int) -> LocateResult: def _locate_one(self, path: str, line: int) -> LocateResult: # Whatever the caller's scanner printed ("./src/app.py", an absolute path) is normalised to # the symbol-table key first; an unnormalised path would otherwise read as file_not_in_graph. - key = resolve_module_key(str(path), self.application.symbol_table.keys()) + key = resolve_module_key(str(path), self.application.symbol_table.keys(), **module_scope(self)) module = self.application.symbol_table.get(key) if module is None: return self._not_analysed(key, line) @@ -1871,10 +1877,7 @@ def get_all_callers(self, target_class_name: str, target_method_declaration: str method = self.get_method(target_class_name, target_method_declaration) if method is None or method.signature not in graph: return {"caller_details": []} - callers = [ - {"caller_signature": src, "edge": graph.get_edge_data(src, method.signature)} - for src in graph.predecessors(method.signature) - ] + callers = [{"caller_signature": src, "edge": graph.get_edge_data(src, method.signature)} for src in graph.predecessors(method.signature)] return {"target_method": method.signature, "caller_details": callers} def get_all_callees(self, source_class_name: str, source_method_declaration: str) -> Dict: @@ -1910,15 +1913,10 @@ def get_all_callees(self, source_class_name: str, source_method_declaration: str method = self.get_method(source_class_name, source_method_declaration) if method is None or method.signature not in graph: return {"callee_details": []} - callees = [ - {"callee_signature": tgt, "edge": graph.get_edge_data(method.signature, tgt)} - for tgt in graph.successors(method.signature) - ] + callees = [{"callee_signature": tgt, "edge": graph.get_edge_data(method.signature, tgt)} for tgt in graph.successors(method.signature)] return {"source_method": method.signature, "callee_details": callees} - def get_class_call_graph( - self, qualified_class_name: str, method_signature: str | None = None - ) -> List[Tuple[str, str]]: + def get_class_call_graph(self, qualified_class_name: str, method_signature: str | None = None) -> List[Tuple[str, str]]: """Return call graph edges reachable from a class or method. Performs a depth-first traversal of the call graph starting from @@ -2012,7 +2010,4 @@ def get_all_docstrings(self) -> Dict[str, List[PyComment]]: :class:`~cldk.models.python.PyComment` objects where ``is_docstring`` is ``True``. """ - return { - fp: [c for c in module.comments if c.is_docstring] - for fp, module in self.application.symbol_table.items() - } + return {fp: [c for c in module.comments if c.is_docstring] for fp, module in self.application.symbol_table.items()} diff --git a/cldk/analysis/python/neo4j/neo4j_backend.py b/cldk/analysis/python/neo4j/neo4j_backend.py index 75ac0fd..12bbbda 100644 --- a/cldk/analysis/python/neo4j/neo4j_backend.py +++ b/cldk/analysis/python/neo4j/neo4j_backend.py @@ -97,14 +97,29 @@ import networkx as nx from codeanalyzer.schema import model_dump_json -from codeanalyzer.schema.ids import application_id, module_id +from codeanalyzer.schema.ids import module_id from codeanalyzer.schema.py_schema import PyEntrypointReport +from cldk.analysis.commons.keys import module_scope +from cldk.analysis.commons.identity import resolve_identity, validate_identity from cldk.analysis.commons.backend import semver as _semver from cldk.analysis.commons.graphs import path_order, sdg_path_query, sdg_taint_query from cldk.analysis.commons.keys import module_key_of from cldk.analysis.commons.resolve import CallableCandidate, body_node_kind, resolve_callable_signature, resolve_value_name, resolve_within, value_candidate -from cldk.analysis.commons.results import BodyRef, CallableRef, Diagnostic, EdgePage, EntrypointCoverage, FlowPath, FlowPaths, LocateResult, ModuleRef, PathHop, Slice, SliceNode, TypeRef +from cldk.analysis.commons.results import ( + BodyRef, + CallableRef, + Diagnostic, + EdgePage, + EntrypointCoverage, + FlowPath, + FlowPaths, + LocateResult, + ModuleRef, + Slice, + SliceNode, + TypeRef, +) from cldk.analysis.python.backend import ( CDG_ORDER, CFG_ORDER, @@ -162,7 +177,6 @@ logger = logging.getLogger(__name__) - # One statement per parent->child collection, each fetching that whole collection for the *entire* # application in a single round trip and returning the parent's key as ``pk``. These are the bulk # twins of the per-parent statements inlined in ``PyNeo4jBackend._callable_full`` / ``_class_full`` @@ -301,28 +315,29 @@ def __init__( neo4j_password: str | None = None, neo4j_database: str | None = None, application_name: str | None = None, + namespace: str | None = None, + source_root=None, ) -> None: try: from neo4j import GraphDatabase except ModuleNotFoundError as e: # pragma: no cover - import guard - raise CodeanalyzerExecutionException( - "The Neo4j backend requires the 'neo4j' driver. Install it with " - "`pip install neo4j` (or `pip install cldk[neo4j]`)." - ) from e + raise CodeanalyzerExecutionException("The Neo4j backend requires the 'neo4j' driver. Install it with " "`pip install neo4j` (or `pip install cldk[neo4j]`).") from e driver = GraphDatabase.driver(neo4j_uri, auth=(neo4j_username, neo4j_password)) - self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database) + self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database, namespace=namespace, source_root=source_root) @classmethod - def _from_driver(cls, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None) -> "PyNeo4jBackend": + def _from_driver( + cls, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None, namespace: str | None = None, source_root=None + ) -> "PyNeo4jBackend": """Construct directly from an already-built driver — exists for tests injecting a fake driver.""" self = cls.__new__(cls) - self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database) + self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database, namespace=namespace, source_root=source_root) return self - def _init_with_driver(self, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None) -> None: - if not application_name: - raise CodeanalyzerExecutionException("application_name is required to scope queries to an application.") - self.application_name = application_name + def _init_with_driver(self, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None, namespace: str | None = None, source_root=None) -> None: + self.identity = resolve_identity(application_name, namespace) + self.application_name = self.identity.application_name + self.source_root = source_root self._database = neo4j_database self._driver = driver # One long-lived read session reused across queries (see _run). Reconstruction is an N+1 @@ -336,6 +351,7 @@ def _init_with_driver(self, driver: Any, *, application_name: str | None = None, # Fail fast if the attached graph doesn't speak this backend's vocabulary — one round # trip, run once per connection, before any query can silently come back empty. self._probe_schema() + self._probe_identity() # The application's module file_keys, used to scope every query to this app. self._modules: List[str] = self._load_module_keys() @@ -360,6 +376,10 @@ def _init_with_driver(self, driver: Any, *, application_name: str | None = None, #: version is the only thing between a caller and that silent empty. _ANALYZER_FLOOR = (1, 5, 0) + def _probe_identity(self) -> None: + rows = self._run("MATCH (a:PyApplication {id: $app_id}) RETURN properties(a) AS identity", app_id=self._application_id) + validate_identity(rows[0].get("identity", {}) if rows else {}, self.identity, envelope=False) + def _probe_schema(self) -> None: """Verify the connected graph's vocabulary once, at connection time, and record the server's version while the connection is already open. @@ -391,7 +411,11 @@ def _probe_schema(self) -> None: version = _semver(raw) floor = ".".join(map(str, self._ANALYZER_FLOOR)) if version is None or version < self._ANALYZER_FLOOR: - what = f"was emitted by codeanalyzer-python {raw}" if version else (f"reports analyzer_version {raw!r}" if raw else "carries no analyzer_version (no :PyApplication with that id, or one emitted before the property existed)") + what = ( + f"was emitted by codeanalyzer-python {raw}" + if version + else (f"reports analyzer_version {raw!r}" if raw else "carries no analyzer_version (no :PyApplication with that id, or one emitted before the property existed)") + ) raise GraphSchemaMismatch( expected=set(self._REQUIRED_RELATIONSHIP_TYPES), found=found, @@ -477,9 +501,9 @@ def has_resolution_edges(self) -> bool: @property def _application_id(self) -> str: - """``can://`` -- the ``:PyApplication`` root's own merge key since 1.5.0 (it used to + """``can:///`` -- the ``:PyApplication`` root's own merge key since 1.5.0 (it used to merge on ``name``, which carries no uniqueness constraint any more).""" - return application_id(self.application_name) + return self.identity.application_id @property def _scope_prefix(self) -> str: @@ -510,7 +534,7 @@ def _code_prefix(self) -> str: and every row would raise. Built from the analyzer's own :func:`module_id` (with an empty file key) so the segment is never spelled twice. """ - return module_id(self.application_name, "") + return module_id(self.application_name, "", self.identity.namespace) #: The codeanalyzer-python generation that emitted this application, set by #: :meth:`_probe_schema` (which refuses anything below :attr:`_ANALYZER_FLOOR`). The class-level @@ -561,7 +585,7 @@ def _module_prefixes(self, keys: Sequence[str] | None) -> List[str]: application", narrowing "which of its modules" -- a single application prefix cannot express the second, and a list of 1,626 module prefixes is a measurably slower way to express the first.""" - return [self._scope_prefix] if keys is None else [module_id(self.application_name, k) + "/" for k in keys] + return [self._scope_prefix] if keys is None else [self._module_ids[k] + "/" for k in keys] def close(self) -> None: """Close the reused session (if any) and the underlying Neo4j driver.""" @@ -603,10 +627,11 @@ def _run(self, query: str, **params: Any) -> List[Dict[str, Any]]: def _load_module_keys(self) -> List[str]: """The application's module ``file_key``s — the scope key for every other query.""" rows = self._run( - "MATCH (:PyApplication {id: $app_id})-[:PY_HAS_MODULE]->(m:PyModule) RETURN m.file_key AS k", + "MATCH (:PyApplication {id: $app_id})-[:PY_HAS_MODULE]->(m:PyModule) RETURN m.file_key AS k, m.id AS id", app_id=self._application_id, ) - return [r["k"] for r in rows] + self._module_ids = {r["k"]: r["id"] for r in rows} + return list(self._module_ids) # ===================================================================================== # Reconstruction helpers — fetch a node's children over Cypher, then assemble via R. @@ -949,7 +974,14 @@ def _bounded_call_rows(self, roots: List[str], depth: int | None) -> List[Dict[s # PythonAnalysisBackend — application / whole-program # ===================================================================================== def get_application_view(self) -> PyApplication: - return PyApplication(symbol_table=self.get_symbol_table(), call_graph=self._call_edges()) + return PyApplication( + id=self.identity.application_id, + identity_version=2, + application_name=self.identity.application_name, + identity_namespace=self.identity.namespace, + symbol_table=self.get_symbol_table(), + call_graph=self._call_edges(), + ) def get_symbol_table(self, *, paths: Sequence[str] | None = None) -> Dict[str, PyModule]: # ``paths`` narrows in Cypher (the WHERE below) *and* narrows the prefetch scope, which is @@ -959,8 +991,7 @@ def get_symbol_table(self, *, paths: Sequence[str] | None = None) -> Dict[str, P result: Dict[str, PyModule] = {} with self._bulk(keys): # every module's children in eleven queries, not 45 per module for r in self._run( - "MATCH (:PyApplication {id: $app_id})-[:PY_HAS_MODULE]->(m:PyModule) " - "WHERE $paths IS NULL OR m.file_key IN $paths RETURN properties(m) AS p", + "MATCH (:PyApplication {id: $app_id})-[:PY_HAS_MODULE]->(m:PyModule) " "WHERE $paths IS NULL OR m.file_key IN $paths RETURN properties(m) AS p", app_id=self._application_id, paths=keys, ): @@ -977,7 +1008,7 @@ def _resolve_paths(self, paths: Sequence[str] | None, kind: str = "paths") -> Li :class:`~cldk.utils.exceptions.SelectorNotInGraph` rather than quietly selecting no rows) are the same on both. """ - return scope_paths(paths, self._modules, kind) + return scope_paths(paths, self._modules, kind, **module_scope(self)) def get_modules(self) -> List[PyModule]: return list(self.get_symbol_table().values()) @@ -1167,8 +1198,7 @@ def _get_module_functions(self, module_name: str) -> Dict[str, PyCallable]: as cheap as the class path instead of paying the whole-symbol-table fan-out. """ rows = self._run( - "MATCH (m:PyModule {module_name: $name})-[:PY_DECLARES]->(f:PyCallable) " - "WHERE m.file_key IN $mods AND m.id STARTS WITH $prefix RETURN properties(f) AS p", + "MATCH (m:PyModule {module_name: $name})-[:PY_DECLARES]->(f:PyCallable) " "WHERE m.file_key IN $mods AND m.id STARTS WITH $prefix RETURN properties(f) AS p", name=module_name, mods=self._modules, prefix=self._scope_prefix, @@ -1241,8 +1271,7 @@ def get_callables_overview(self) -> List[PyCallableOverview]: def get_method_bodies(self, signatures: List[str]) -> Dict[str, str]: rows = self._run( - "MATCH (c:PyCallable) WHERE c.id STARTS WITH $prefix AND c.signature IN $sigs AND c.code IS NOT NULL " - "RETURN c.signature AS signature, c.code AS code", + "MATCH (c:PyCallable) WHERE c.id STARTS WITH $prefix AND c.signature IN $sigs AND c.code IS NOT NULL " "RETURN c.signature AS signature, c.code AS code", prefix=self._scope_prefix, sigs=list(signatures), ) @@ -1270,8 +1299,7 @@ def get_source(self, node_id: str) -> str: "for a statement or call site." ) rows = self._run( - "MATCH (c:PyCallable) WHERE c.id STARTS WITH $prefix AND (c.signature = $sig OR c.id = $sig) AND c.code IS NOT NULL " - "RETURN c.code AS code", + "MATCH (c:PyCallable) WHERE c.id STARTS WITH $prefix AND (c.signature = $sig OR c.id = $sig) AND c.code IS NOT NULL " "RETURN c.code AS code", prefix=self._scope_prefix, sig=sig, ) @@ -1565,7 +1593,9 @@ def backward_cone(self, sinks: Sequence[str], *, depth: int | None = DEFAULT_DEP self._require_quantified_paths("backward_cone") roots = cone_sinks(self.resolve_callable, sinks) row = self._run(self._CONE.format(depth="" if depth is None else depth), sigs=[r.callable for r in roots], cap=max_nodes, prefix=self._scope_prefix)[0] - nodes = [SliceNode(file=self._module_key(n["ref"]), line=n["line"], callable=n["callable"], kind="callable", name=n["name"], source=None, ref=n["ref"]) for n in row["page"]] + nodes = [ + SliceNode(file=self._module_key(n["ref"]), line=n["line"], callable=n["callable"], kind="callable", name=n["name"], source=None, ref=n["ref"]) for n in row["page"] + ] return Slice(nodes=nodes, roots=roots, resolved=slice_resolved(roots), total=row["total"]) #: ``t`` may be a ``:PyExternal`` ghost, which carries ``module``/``name``/``id`` and no @@ -1824,8 +1854,7 @@ def _sources_for(self, refs: Sequence[str]) -> Dict[str, "str | None"]: def get_decorated_callables(self, markers: List[str]) -> List[PyCallableOverview]: rows = self._run( - "MATCH (c:PyCallable) WHERE c.id STARTS WITH $prefix " - "AND any(d IN c.decorators WHERE d IN $markers) " + self._OVERVIEW_PROJECTION, + "MATCH (c:PyCallable) WHERE c.id STARTS WITH $prefix " "AND any(d IN c.decorators WHERE d IN $markers) " + self._OVERVIEW_PROJECTION, prefix=self._scope_prefix, markers=list(markers), ) @@ -1918,7 +1947,7 @@ def get_external_symbols(self) -> Dict[str, PyExternalSymbol]: # application's own can:// id by construction (`/@external//`), and # that prefix is the whole scope -- a second application in the same database mints a # disjoint one. (This was the one prefix-scoped statement before leg 1.6 made it the rule.) - prefix = f"{application_id(self.application_name)}/@external/" + prefix = f"{self.identity.application_id}/@external/" rows = self._run( "MATCH (e:PyExternal) WHERE e.id STARTS WITH $prefix RETURN properties(e) AS p", prefix=prefix, @@ -1963,8 +1992,7 @@ def get_dependencies(self, *, direct_only: bool = False, ecosystem: str | None = def get_config_keys(self) -> Dict[str, PyConfigKey]: result: Dict[str, PyConfigKey] = {} for r in self._run( - "MATCH (:PyApplication {id: $app_id})-[:HAS_ARTIFACT]->(:Artifact)-[:DEFINES_CONFIG]->(ck:ConfigKey) " - "RETURN properties(ck) AS p", + "MATCH (:PyApplication {id: $app_id})-[:HAS_ARTIFACT]->(:Artifact)-[:DEFINES_CONFIG]->(ck:ConfigKey) " "RETURN properties(ck) AS p", app_id=self._application_id, ): ck = R.config_key(r["p"]) @@ -2002,8 +2030,7 @@ def get_unresolved_config_reads(self) -> List[PyConfigRead]: # reads," never a false negative -- unlike finding 1's entrypoint_report, which the # graph doesn't carry at all. rows = self._run( - "MATCH (:PyApplication {id: $app_id})-[u:PY_READS_CONFIG_UNRESOLVED]->(ghost:PyExternal) " - "RETURN properties(u) AS p, ghost.id AS callee", + "MATCH (:PyApplication {id: $app_id})-[u:PY_READS_CONFIG_UNRESOLVED]->(ghost:PyExternal) " "RETURN properties(u) AS p, ghost.id AS callee", app_id=self._application_id, ) return [R.unresolved_config_read(r["p"], callee=r["callee"]) for r in rows] @@ -2225,15 +2252,16 @@ def locate_many(self, positions: Sequence[Tuple[str, int]]) -> List[LocateResult # Whatever the caller's scanner printed ("./src/app.py", an absolute path) is normalised to # the graph's file_key before it becomes a Cypher parameter — an unnormalised path would # match no :PyModule and read back as file_not_in_graph. - keys = [resolve_module_key(path, self._modules) for path, _ in positions] + keys = [resolve_module_key(path, self._modules, **module_scope(self)) for path, _ in positions] # ``module_prefix`` is the exact inverse of ``_module_key``: ``module_id(app, key) + "/"`` # selects the module's own callables and nothing under a longer key sharing the spelling. rows = self._run( self._LOCATE_QUERY, app_id=self._application_id, positions=[ - {"idx": i, "path": key, "module_prefix": module_id(self.application_name, key) + "/", "line": line} + {"idx": i, "path": key, "module_prefix": self._module_ids[key] + "/", "line": line} for i, (key, (_, line)) in enumerate(zip(keys, positions)) + if key in self._module_ids ], ) by_idx: Dict[int, List[Dict[str, Any]]] = defaultdict(list) diff --git a/cldk/analysis/python/python_analysis.py b/cldk/analysis/python/python_analysis.py index 834a09d..e46b1c7 100644 --- a/cldk/analysis/python/python_analysis.py +++ b/cldk/analysis/python/python_analysis.py @@ -52,6 +52,7 @@ import networkx as nx from tree_sitter import Tree +from cldk.analysis.commons.identity import resolve_identity from cldk.analysis.commons.backend_config import Neo4jConnectionConfig, PyBackend, PyCodeAnalyzerConfig, cache_subdir from cldk.analysis.commons.results import EdgePage, EntrypointCoverage, FlowPaths, LocateResult, Slice, SliceNode, TaintResult from cldk.analysis.commons.treesitter import TreesitterPython @@ -173,24 +174,29 @@ def __init__( self.eager_analysis = eager_analysis self.target_files = target_files self.treesitter_python: TreesitterPython = TreesitterPython() + self.identity = resolve_identity(self.backend_config.application_name, self.backend_config.namespace, project_root=Path(project_dir) if project_dir is not None else None) self.backend: PythonAnalysisBackend if isinstance(self.backend_config, Neo4jConnectionConfig): # Read-only: the graph is populated out of band; the SDK only polls it. cfg = self.backend_config - application_name = cfg.application_name or (Path(project_dir).name if project_dir else None) + application_name = self.identity.application_name self.backend = PyNeo4jBackend( neo4j_uri=cfg.uri, neo4j_username=cfg.username, neo4j_password=cfg.password, neo4j_database=cfg.database, application_name=application_name, + namespace=self.identity.namespace, + source_root=project_dir, ) else: cfg = self.backend_config - cache_path = cache_subdir(cfg.cache_dir, project_dir, "python") + cache_path = cache_subdir(cfg.cache_dir, project_dir, "python", identity=self.identity) if cache_path is not None: cache_path.mkdir(parents=True, exist_ok=True) self.backend = PyCodeanalyzer( + application_name=self.identity.application_name, + namespace=self.identity.namespace, project_dir=project_dir, analysis_level=analysis_level, analysis_json_path=None, @@ -384,9 +390,7 @@ def get_imports(self) -> Dict[str, List]: See Also: :meth:`get_python_module`: For detailed module information. """ - return { - fp: list(m.imports) for fp, m in self.backend.get_symbol_table().items() - } + return {fp: list(m.imports) for fp, m in self.backend.get_symbol_table().items()} # -----[ call graph ]----- def get_call_graph(self, *, roots: Sequence[str] | None = None, depth: int | None = None) -> nx.DiGraph: @@ -449,9 +453,7 @@ def get_call_graph_json(self) -> str: """ return self.backend.get_call_graph_json() - def get_callers( - self, target_class_name: str, target_method_declaration: str - ) -> Dict: + def get_callers(self, target_class_name: str, target_method_declaration: str) -> Dict: """Return all methods that call the specified target method. Finds and returns information about all callables (functions and @@ -475,13 +477,9 @@ def get_callers( :meth:`get_callees`: For the reverse direction (what a method calls). :meth:`get_call_graph`: For the complete call relationship graph. """ - return self.backend.get_all_callers( - target_class_name, target_method_declaration - ) + return self.backend.get_all_callers(target_class_name, target_method_declaration) - def get_callees( - self, source_class_name: str, source_method_declaration: str - ) -> Dict: + def get_callees(self, source_class_name: str, source_method_declaration: str) -> Dict: """Return all methods called by the specified source method. Finds and returns information about all callables (functions and @@ -506,13 +504,9 @@ def get_callees( :meth:`get_callers`: For the reverse direction (who calls a method). :meth:`get_call_graph`: For the complete call relationship graph. """ - return self.backend.get_all_callees( - source_class_name, source_method_declaration - ) + return self.backend.get_all_callees(source_class_name, source_method_declaration) - def get_class_call_graph( - self, qualified_class_name: str, method_signature: str | None = None - ) -> List[Tuple[str, str]]: + def get_class_call_graph(self, qualified_class_name: str, method_signature: str | None = None) -> List[Tuple[str, str]]: """Return call graph edges reachable from a class or method. Extracts a subset of the call graph containing only edges reachable @@ -754,9 +748,7 @@ def get_methods_in_class(self, qualified_class_name: str) -> Dict[str, PyCallabl """ return self.backend.get_all_methods_in_class(qualified_class_name) - def get_method( - self, qualified_class_name: str, qualified_method_name: str - ) -> PyCallable | None: + def get_method(self, qualified_class_name: str, qualified_method_name: str) -> PyCallable | None: """Return a specific method or module-level function by scope and name. Retrieves detailed information about a single method, including @@ -792,9 +784,7 @@ def get_method( """ return self.backend.get_method(qualified_class_name, qualified_method_name) - def get_method_parameters( - self, qualified_class_name: str, qualified_method_name: str - ) -> List[str]: + def get_method_parameters(self, qualified_class_name: str, qualified_method_name: str) -> List[str]: """Return the parameter names for a specific method. Retrieves the list of parameter names (excluding ``self`` for @@ -817,9 +807,7 @@ def get_method_parameters( See Also: :meth:`get_method`: For complete method information. """ - return self.backend.get_method_parameters( - qualified_class_name, qualified_method_name - ) + return self.backend.get_method_parameters(qualified_class_name, qualified_method_name) def get_constructors(self, qualified_class_name: str) -> Dict[str, PyCallable]: """Return the constructor(s) of a specific class. @@ -1515,9 +1503,7 @@ def get_artifacts(self) -> Dict[str, PyArtifact]: """ return self.backend.get_artifacts() - def get_dependencies( - self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None - ) -> List[PyDependency]: + def get_dependencies(self, *, direct_only: bool = False, ecosystem: str | None = None, declared_in: str | None = None) -> List[PyDependency]: """Return every declared third-party dependency, one entry per declaring manifest, optionally filtered. @@ -1643,9 +1629,7 @@ def get_class(self, qualified_class_name: str) -> PyClass | None: """ return self.backend.get_class(qualified_class_name) - def get_classes_by_criteria( - self, inclusions: List[str] | None = None, exclusions: List[str] | None = None - ) -> Dict[str, PyClass]: + def get_classes_by_criteria(self, inclusions: List[str] | None = None, exclusions: List[str] | None = None) -> Dict[str, PyClass]: """Return classes matching inclusion/exclusion filter criteria. Filters the project's classes based on substring matching against diff --git a/cldk/analysis/typescript/codeanalyzer/codeanalyzer.py b/cldk/analysis/typescript/codeanalyzer/codeanalyzer.py index 27fc099..dc623f6 100644 --- a/cldk/analysis/typescript/codeanalyzer/codeanalyzer.py +++ b/cldk/analysis/typescript/codeanalyzer/codeanalyzer.py @@ -39,6 +39,8 @@ import networkx as nx +from cldk.analysis.commons.keys import module_scope +from cldk.analysis.commons.identity import resolve_identity, validate_identity, cache_matches from cldk.analysis.commons.bounds import ( DEFAULT_DEPTH, DEFAULT_MAX_NODES, @@ -149,7 +151,12 @@ def __init__( eager_analysis: bool, target_files: List[str] | None, tsc_only: bool = False, + *, + application_name: str | None = None, + namespace: str | None = None, ) -> None: + self.identity = resolve_identity(application_name, namespace, project_root=Path(project_dir) if project_dir is not None else None) + self.project_dir = project_dir self.analysis_json_path = analysis_json_path self.analysis_level = analysis_level @@ -162,16 +169,10 @@ def __init__( stacklevel=4, # warn at the CLDK.typescript(...) call, through the facade ) self.analysis: TSAnalysis = self._init_codeanalyzer(analysis_level=analyzer_level(analysis_level)) + validate_identity(self.analysis, self.identity) self.application: TSApplication = self.analysis.application - #: The ``--app-name`` the analyzer stamped into every id, read back off the application's - #: own ``can://`` id. Spelled the same as :attr:`TSNeo4jBackend.application_name` - #: so a message naming the application reads identically whichever backend raised it -- and - #: so no message has to embed a ``can://`` id to name it (E6). - #: - #: The scheme is *stripped*, never split off: the root id is exactly ``can://`` since - #: 1.5.1 put the application outermost, and an application legitimately named ``typescript`` - #: makes any positional reading of the segments a coin flip. - self.application_name: str = self.application.id.removeprefix("can://") + # Preserve the raw selected name; canonical root segments may contain percent escapes. + self.application_name: str = self.identity.application_name self._call_graph: nx.DiGraph | None = None self._index() @@ -204,7 +205,14 @@ def _argv(self, analysis_level: int, output_dir: Path | None) -> List[str]: --cache-dir ] --skip-tests [--eager] [-t ]...``. The application name is what the analyzer stamps into every ``can:////...`` id.""" project = Path(self.project_dir) - args = self._get_codeanalyzer_exec() + ["-i", str(project), "--app-name", project.name, "-a", str(analysis_level)] + args = self._get_codeanalyzer_exec() + [ + "-i", + str(project), + f"--app-name={self.identity.application_name}", + f"--namespace={self.identity.namespace}", + "-a", + str(analysis_level), + ] if output_dir is not None: args += ["-o", str(output_dir), "--cache-dir", str(output_dir)] args += ["--skip-tests"] @@ -229,7 +237,7 @@ def _init_codeanalyzer(self, analysis_level: int) -> TSAnalysis: # Persist to an output directory and read analysis.json back. output_dir = Path(self.analysis_json_path) analysis_json_file = output_dir / "analysis.json" - needs_run = self.eager_analysis or not analysis_json_file.exists() or bool(self.target_files) + needs_run = self.eager_analysis or not analysis_json_file.exists() or not cache_matches(analysis_json_file, self.identity) or bool(self.target_files) if needs_run: args = self._argv(analysis_level, output_dir) try: @@ -884,7 +892,7 @@ def _body_ref(self, c: TSCallable, line: int) -> BodyRef | None: def _locate_one(self, path: str, line: int) -> LocateResult: # Whatever the caller's scanner printed ("./src/app.ts", an absolute path) is normalised to # the symbol-table key first; an unnormalised path would otherwise read as file_not_in_graph. - key = resolve_module_key(str(path), self.application.symbol_table.keys()) + key = resolve_module_key(str(path), self.application.symbol_table.keys(), **module_scope(self)) module = self.application.symbol_table.get(key) if module is None: return self._not_analysed(key, line) diff --git a/cldk/analysis/typescript/neo4j/neo4j_backend.py b/cldk/analysis/typescript/neo4j/neo4j_backend.py index 1888204..9707146 100644 --- a/cldk/analysis/typescript/neo4j/neo4j_backend.py +++ b/cldk/analysis/typescript/neo4j/neo4j_backend.py @@ -117,6 +117,8 @@ class never writes and needs neither the analyzer binary nor the sources. import networkx as nx +from cldk.analysis.commons.keys import module_scope +from cldk.analysis.commons.identity import resolve_identity, validate_identity from cldk.analysis.commons import artifacts as shared # the artifact layer every analyzer projects identically from cldk.analysis.commons.backend import semver from cldk.analysis.commons.bounds import ( @@ -295,28 +297,46 @@ class TSNeo4jBackend(TSAnalysisBackend): _call_graph: nx.DiGraph | None = None _module_ids: Dict[str, str] = {} - def __init__(self, neo4j_uri: str, neo4j_username: str, neo4j_password: str, neo4j_database: str | None = None, application_name: str | None = None) -> None: + def __init__( + self, + neo4j_uri: str, + neo4j_username: str, + neo4j_password: str, + neo4j_database: str | None = None, + application_name: str | None = None, + namespace: str | None = None, + source_root=None, + ) -> None: try: from neo4j import GraphDatabase except ModuleNotFoundError as e: # pragma: no cover - import guard raise CodeanalyzerExecutionException("The Neo4j backend requires the 'neo4j' driver. Install it with `pip install neo4j` (or `pip install cldk[neo4j]`).") from e - self._init_with_driver(GraphDatabase.driver(neo4j_uri, auth=(neo4j_username, neo4j_password)), application_name=application_name, neo4j_database=neo4j_database) + self._init_with_driver( + GraphDatabase.driver(neo4j_uri, auth=(neo4j_username, neo4j_password)), + application_name=application_name, + neo4j_database=neo4j_database, + namespace=namespace, + source_root=source_root, + ) @classmethod - def _from_driver(cls, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None) -> "TSNeo4jBackend": + def _from_driver( + cls, driver: Any, *, application_name: str | None = None, neo4j_database: str | None = None, namespace: str | None = None, source_root=None + ) -> "TSNeo4jBackend": """Construct from an already-built driver -- the seam tests inject a fake driver through.""" self = cls.__new__(cls) - self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database) + self._init_with_driver(driver, application_name=application_name, neo4j_database=neo4j_database, namespace=namespace, source_root=source_root) return self - def _init_with_driver(self, driver: Any, *, application_name: str | None, neo4j_database: str | None) -> None: - if not application_name: - raise CodeanalyzerExecutionException("application_name is required to scope queries to an application.") - self.application_name = application_name + def _init_with_driver(self, driver: Any, *, application_name: str | None, neo4j_database: str | None, namespace: str | None = None, source_root=None) -> None: + self.identity = resolve_identity(application_name, namespace) + self.application_name = self.identity.application_name + self.source_root = source_root self._database = neo4j_database self._driver = driver self._session_obj: Any | None = None self._probe_schema() + self._probe_identity() self._module_ids = self._load_module_keys() self._modules: List[str] = list(self._module_ids) self._has_resolution_edges = self._probe_resolution_edges() @@ -325,12 +345,12 @@ def _init_with_driver(self, driver: Any, *, application_name: str | None, neo4j_ # -----[ scope ]----- @property def _app_id(self) -> str: - """``can://`` -- the ``:Application`` anchor's id, and the root of every id below it.""" - return f"can://{self.application_name}" + """``can:///`` -- the ``:Application`` anchor's id, and the root of every id below it.""" + return self.identity.application_id @property def _scope_prefix(self) -> str: - """``can:///`` (TS-3): one prefix covering both language namespaces, the ``@external`` + """``can:////`` (TS-3): one prefix covering both language namespaces, the ``@external`` ghosts and the artifacts. The trailing slash keeps ``app`` from matching ``app-b``.""" return f"{self._app_id}/" @@ -397,6 +417,10 @@ def _run(self, query: str, **params: Any) -> List[Dict[str, Any]]: raise # -----[ attach ]----- + def _probe_identity(self) -> None: + rows = self._run("MATCH (a:Application {id: $app_id}) RETURN properties(a) AS identity", app_id=self._app_id) + validate_identity(rows[0].get("identity", {}) if rows else {}, self.identity, envelope=False) + def _probe_schema(self) -> None: """G5: the relationship-type fingerprint, then the analyzer generation the ``:Application`` anchor stamps against :attr:`_ANALYZER_FLOOR`. Below the floor, absent, or unreadable is @@ -623,6 +647,9 @@ def get_application_view(self) -> TSApplication: """ externals = {e.id: e for e in self.get_external_symbols().values()} return TSApplication( + application_name=self.identity.application_name, + identity_namespace=self.identity.namespace, + identity_version=2, id=self._app_id, symbol_table=self.get_symbol_table(), call_graph=[TSCallGraphEdge(src=r["src"], dst=r["dst"], prov=list(r["prov"] or []), weight=r["weight"] or 1) for r in self._call_rows()], @@ -1397,7 +1424,7 @@ def locate_many(self, positions: Sequence[Tuple[str, int]]) -> List[LocateResult # Whatever the caller's scanner printed ("./src/app.ts", an absolute path) is normalised to # the graph's module key before it becomes a Cypher parameter -- an unnormalised path would # match no :TSModule and read back as file_not_in_graph. - keys = [resolve_module_key(path, self._module_ids) for path, _ in positions] + keys = [resolve_module_key(path, self._module_ids, **module_scope(self)) for path, _ in positions] # A key the application does not hold is never sent: its ``module_prefix`` would be the raw # path, which is not application-stamped and could seek outside this application. It has no # rows either way, and no rows is exactly the ``file_not_in_graph`` outcome. @@ -1774,9 +1801,7 @@ def _call_vertex(self, row: Dict[str, Any]) -> SliceNode: #: every node on the walk carries the predicate, once rather than twice. _REACHES = ( "MATCH (a:TSCallable {{signature:$a}}) WHERE " + _scoped("a") + " AND a.kind IN $callable_kinds " - "MATCH (a) ((x:TSCallable)-[:TS_CALLS]->(y:TSCallable) WHERE " - + _scoped("x") - + " AND x.kind IN $callable_kinds){{1,{depth}}} (m:TSCallable) " + "MATCH (a) ((x:TSCallable)-[:TS_CALLS]->(y:TSCallable) WHERE " + _scoped("x") + " AND x.kind IN $callable_kinds){{1,{depth}}} (m:TSCallable) " "WITH DISTINCT m WHERE " + _scoped("m") + " AND m.kind IN $callable_kinds AND m.signature = $b RETURN count(m) > 0 AS ok" ) @@ -2003,10 +2028,7 @@ def _taint_walk( cap=max_paths + 1, **self._scope_params, ) - return [ - (r["src"], r["dst"], flow_path([self._slice_row(n) for n in r["ns"]], [(e["via"], e["var"], e["prov"]) for e in r["rs"]], via=VIA)) - for r in rows - ], {} + return [(r["src"], r["dst"], flow_path([self._slice_row(n) for n in r["ns"]], [(e["via"], e["var"], e["prov"]) for e in r["rs"]], via=VIA)) for r in rows], {} def _edge_vars_in(self, callable_id: str) -> FrozenSet[str]: """The edge variables scoped to this callable (see :meth:`TSAnalysisBackend._edge_vars_in`). diff --git a/cldk/analysis/typescript/typescript_analysis.py b/cldk/analysis/typescript/typescript_analysis.py index 96c16c1..77b1b01 100644 --- a/cldk/analysis/typescript/typescript_analysis.py +++ b/cldk/analysis/typescript/typescript_analysis.py @@ -29,6 +29,7 @@ import networkx as nx +from cldk.analysis.commons.identity import resolve_identity from cldk.analysis.commons.backend_config import CodeAnalyzerConfig, Neo4jConnectionConfig, TSBackend, cache_subdir from cldk.models.python import PyArtifact, PyConfigKey, PyConfigRead, PyConfigUseEdge, PyDependency from cldk.analysis.commons.bounds import DEFAULT_DEPTH, DEFAULT_MAX_NODES, DEFAULT_MAX_PATHS, DEFAULT_PAGE_SIZE @@ -89,23 +90,28 @@ def __init__( # The backend is selected by the *type* of the config: Neo4jConnectionConfig picks the # read-only Cypher backend, CodeAnalyzerConfig (the default) the in-process analyzer. self.backend_config: TSBackend = backend if backend is not None else CodeAnalyzerConfig() + self.identity = resolve_identity(self.backend_config.application_name, self.backend_config.namespace, project_root=Path(project_dir) if project_dir is not None else None) self.backend: TSAnalysisBackend if isinstance(self.backend_config, Neo4jConnectionConfig): # Read-only: the graph is populated out of band; the SDK only polls it. cfg = self.backend_config - application_name = cfg.application_name or (Path(project_dir).name if project_dir else None) + application_name = self.identity.application_name self.backend = TSNeo4jBackend( neo4j_uri=cfg.uri, neo4j_username=cfg.username, neo4j_password=cfg.password, neo4j_database=cfg.database, application_name=application_name, + namespace=self.identity.namespace, + source_root=project_dir, ) else: - cache_path = cache_subdir(self.backend_config.cache_dir, project_dir, "typescript") + cache_path = cache_subdir(self.backend_config.cache_dir, project_dir, "typescript", identity=self.identity) if cache_path is not None: cache_path.mkdir(parents=True, exist_ok=True) self.backend = TSCodeanalyzer( + application_name=self.identity.application_name, + namespace=self.identity.namespace, project_dir=project_dir, analysis_json_path=cache_path, analysis_level=analysis_level, diff --git a/cldk/core.py b/cldk/core.py index 6d4534e..266c11e 100644 --- a/cldk/core.py +++ b/cldk/core.py @@ -144,6 +144,7 @@ def java( eager: Force regeneration of cached analysis. backend: Backend configuration. Defaults to :class:`CodeAnalyzerConfig`; pass a :class:`Neo4jConnectionConfig` to use the read-only Neo4j backend. + Both configurations accept raw ``namespace`` and ``application_name`` selections. Raises: CldkInitializationException: If ``project_path`` is missing and the backend is not @@ -181,6 +182,7 @@ def python( eager: Force regeneration of cached analysis. backend: Backend configuration. Defaults to :class:`PyCodeAnalyzerConfig`; pass a :class:`Neo4jConnectionConfig` to use the read-only Neo4j backend. + Set raw ``namespace`` and ``application_name`` on that configuration to select ownership. """ return PythonAnalysis( project_dir=_normalize_project_path(project_path), diff --git a/cldk/models/go/models.py b/cldk/models/go/models.py index c0f3d80..86dacde 100644 --- a/cldk/models/go/models.py +++ b/cldk/models/go/models.py @@ -200,7 +200,7 @@ class GoType(_NullSafeBase): embedded types; ``fields`` are the struct's data fields (empty for an interface).""" id: str - kind: Literal["struct", "interface"] + kind: Literal["struct", "interface", "defined"] span: Optional[GoSpan] = None base_types: List[str] = [] callables: Dict[str, GoCallable] = {} @@ -236,6 +236,9 @@ class GoApplication(_NullSafeBase): """The application root: the containment tree (``symbol_table``) plus the one app-scope overlay the analyzer emits at L2 (``call_graph``).""" + application_name: str + identity_namespace: str + identity_version: Literal[2] id: str kind: Literal["application"] = "application" symbol_table: Dict[str, GoModule] @@ -250,6 +253,7 @@ class GoAnalyzer(_Base): class GoAnalysis(_Base): """The envelope ``analysis.json`` IS.""" + identity_version: Literal[2] schema_version: str language: str max_level: int diff --git a/cldk/models/java/models.py b/cldk/models/java/models.py index 35f27b1..a4382fa 100644 --- a/cldk/models/java/models.py +++ b/cldk/models/java/models.py @@ -911,6 +911,8 @@ class JApplication(_Base): does). An empty pair there is this backend's silence, not the analyzer's. """ + application_name: str + identity_namespace: str id: str kind: Literal["application"] = "application" symbol_table: Dict[str, JCompilationUnit] @@ -948,6 +950,7 @@ class JAnalyzer(_Base): class JAnalysis(_Base): """The envelope ``analysis.json`` IS.""" + identity_version: Literal[2] schema_version: str language: str max_level: int diff --git a/cldk/models/typescript/models.py b/cldk/models/typescript/models.py index 4d29064..33144b9 100644 --- a/cldk/models/typescript/models.py +++ b/cldk/models/typescript/models.py @@ -734,6 +734,10 @@ class TSConfigRead(_Base): class TSApplication(_Base): """The application root: the containment tree plus the app-scope overlays.""" + name: Optional[str] = None + application_name: str + identity_namespace: str + identity_version: Literal[2] id: str kind: Literal["application"] = "application" symbol_table: Dict[str, TSModule] @@ -758,6 +762,7 @@ class TSAnalyzer(_Base): class TSAnalysis(_Base): """The envelope ``analysis.json`` IS.""" + identity_version: Literal[2] schema_version: str language: str max_level: int diff --git a/tests/analysis/commons/test_identity.py b/tests/analysis/commons/test_identity.py new file mode 100644 index 0000000..ec2b3dc --- /dev/null +++ b/tests/analysis/commons/test_identity.py @@ -0,0 +1,239 @@ +from pathlib import Path +import pytest +from cldk.analysis.commons import identity +from cldk.analysis.commons.backend_config import CodeAnalyzerConfig, PyCodeAnalyzerConfig, TSCodeAnalyzerConfig +from cldk.analysis.commons.keys import resolve_module_key + + +def test_identity_defaults_and_raw_encoding(tmp_path, monkeypatch): + monkeypatch.chdir(tmp_path) + resolved = identity.resolve_identity(None, None, project_root=Path(".")) + assert resolved.application_id == f"can://{tmp_path.name}/{tmp_path.name}" + value = identity.resolve_identity("-svc %雪", "team%") + assert value.application_id == "can://team%25/-svc%20%25%E9%9B%AA" + assert value.application_name == "-svc %雪" + + +@pytest.mark.parametrize("name", ["", " ", ".", "..", "a/b", "a\\b", "x\n", "\ud800"]) +def test_invalid_identity(name): + with pytest.raises(ValueError): + identity.resolve_identity(name, None) + with pytest.raises(ValueError): + identity.resolve_identity("app", name) + + +def test_missing_graph_application(): + with pytest.raises(Exception, match="application_name"): + identity.resolve_identity(None, None) + + +def test_config_identity_keyword_only(): + assert PyCodeAnalyzerConfig("cache", True, namespace="team", application_name="app").use_ray + assert TSCodeAnalyzerConfig("cache", True, namespace="team").tsc_only + assert CodeAnalyzerConfig(namespace="team").application_name is None + + +def test_scoped_module_resolution(tmp_path): + keys = ["src/server.js", "server.js"] + ids = {"server.js": "can://team/svc/javascript/server.js", "src/server.js": "can://team/svc/typescript/src/server.js"} + kwargs = dict(application_id="can://team/svc", module_ids=ids, source_root=tmp_path) + assert resolve_module_key(ids["server.js"], keys, **kwargs) == "server.js" + assert resolve_module_key(str(tmp_path / "src/server.js"), keys, **kwargs) == "src/server.js" + assert resolve_module_key("./src/../server.js", keys, **kwargs) == "server.js" + assert resolve_module_key("other/server.js", keys, **kwargs) == "other/server.js" + for uri in ["can://other/svc/javascript/server.js", "can://team/svc-extra/javascript/server.js", "can://team/svc/python/server.js"]: + with pytest.raises(ValueError): + resolve_module_key(uri, keys, **kwargs) + with pytest.raises(ValueError): + resolve_module_key("/unbound/server.js", keys) + + +@pytest.mark.parametrize("language,cls", [("typescript", "TSCodeanalyzer"), ("java", "JCodeanalyzer"), ("go", "GoCodeanalyzer")]) +def test_argv_preserves_raw_identity(language, cls, tmp_path): + import importlib + + analyzer_cls = getattr(importlib.import_module(f"cldk.analysis.{language}.codeanalyzer.codeanalyzer"), cls) + analyzer = analyzer_cls.__new__(analyzer_cls) + analyzer.project_dir = tmp_path + analyzer.identity = identity.resolve_identity("-svc %雪", "online-boutique") + analyzer.target_files = None + analyzer.eager_analysis = False + analyzer._get_codeanalyzer_exec = lambda: ["analyzer"] + argv = analyzer._argv(1, None) + assert "--namespace=online-boutique" in argv + assert "--app-name=-svc %雪" in argv + + +def test_metadata_required_and_scope_checked(): + bound = identity.resolve_identity("svc", "team") + raw = dict(identity_version=2, application=dict(identity_version=2, id=bound.application_id, application_name="svc", identity_namespace="team")) + assert identity.validate_identity(raw, bound) == raw + for bad in [{**raw, "identity_version": None}, {**raw, "application": {**raw["application"], "identity_namespace": "other"}}]: + with pytest.raises(Exception, match="identity"): + identity.validate_identity(bad, bound) + + +@pytest.mark.parametrize( + "language,cls,rootprop", + [ + ("python", "PyNeo4jBackend", "_application_id"), + ("typescript", "TSNeo4jBackend", "_app_id"), + ("java", "JNeo4jBackend", "_application_id"), + ("go", "GoNeo4jBackend", "_app_id"), + ], +) +def test_graph_scope_identity(language, cls, rootprop, monkeypatch): + import importlib + + backend_cls = getattr(importlib.import_module(f"cldk.analysis.{language}.neo4j.neo4j_backend"), cls) + monkeypatch.setattr(backend_cls, "_probe_schema", lambda self: None) + monkeypatch.setattr(backend_cls, "_probe_identity", lambda self: None, raising=False) + for method in ["_load_module_keys", "_load_modules"]: + if hasattr(backend_cls, method): + monkeypatch.setattr(backend_cls, method, lambda self: {}) + if hasattr(backend_cls, "_probe_resolution_edges"): + monkeypatch.setattr(backend_cls, "_probe_resolution_edges", lambda self: False) + backend = backend_cls._from_driver(object(), application_name="svc", namespace="team") + assert getattr(backend, rootprop) == "can://team/svc" + assert backend._scope_prefix == "can://team/svc/" + + +def test_go_module_key_retains_application_relative_path(): + from cldk.analysis.go.neo4j.neo4j_backend import GoNeo4jBackend + + backend = GoNeo4jBackend.__new__(GoNeo4jBackend) + backend.identity = identity.resolve_identity("svc", "team") + assert backend._module_file_key("can://team/svc/go/src/main.go") == "src/main.go" + with pytest.raises(ValueError): + backend._module_file_key("can://other/svc/go/src/main.go") + + +def test_cache_identity_isolation_and_legacy_rejection(tmp_path): + import json + from cldk.analysis.commons.backend_config import cache_subdir + + first = identity.resolve_identity("svc", "one") + second = identity.resolve_identity("svc", "two") + assert cache_subdir(tmp_path, None, "go", identity=first) != cache_subdir(tmp_path, None, "go", identity=second) + path = tmp_path / "analysis.json" + path.write_text(json.dumps(dict(application=dict(identity_version=2, id=first.application_id, application_name="svc", identity_namespace="one")))) + assert not identity.cache_matches(path, first) + path.write_text(json.dumps(dict(identity_version=2, application=dict(identity_version=2, id=first.application_id, application_name="svc", identity_namespace="one")))) + assert identity.cache_matches(path, first) + assert not identity.cache_matches(path, second) + + +def test_python_application_marker_is_not_synthesized(): + from codeanalyzer.schema import Analysis + from cldk.models.python import PyApplication + + bound = identity.resolve_identity("svc", "team") + application = PyApplication(id=bound.application_id, application_name="svc", identity_namespace="team", symbol_table={}) + analysis = Analysis(identity_version=2, application=application) + with pytest.raises(Exception, match="identity"): + identity.validate_identity(analysis, bound) + + +@pytest.mark.parametrize( + "language,facade_name,backend_name,config_cls", + [ + ("python", "PythonAnalysis", "PyCodeanalyzer", PyCodeAnalyzerConfig), + ("typescript", "TypeScriptAnalysis", "TSCodeanalyzer", CodeAnalyzerConfig), + ("java", "JavaAnalysis", "JCodeanalyzer", CodeAnalyzerConfig), + ("go", "GoAnalysis", "GoCodeanalyzer", CodeAnalyzerConfig), + ], +) +def test_reused_default_config_is_not_bound_to_first_project(language, facade_name, backend_name, config_cls, tmp_path, monkeypatch): + import importlib + from types import SimpleNamespace + + module = importlib.import_module(f"cldk.analysis.{language}.{language}_analysis") + calls = [] + + class Backend: + def __init__(self, **kwargs): + calls.append(kwargs) + + def get_application_view(self): + return SimpleNamespace() + + monkeypatch.setattr(module, backend_name, Backend) + cfg = config_cls() + for name in ["first", "second"]: + root = tmp_path / name + root.mkdir() + getattr(module, facade_name)(project_dir=root, analysis_level="symbol_table", target_files=None, eager_analysis=False, backend=cfg) + assert [call["application_name"] for call in calls] == ["first", "second"] + assert [call["namespace"] for call in calls] == ["first", "second"] + assert cfg.application_name is cfg.namespace is None + + +def test_raw_application_marker_is_required_except_java(): + bound = identity.resolve_identity("svc", "team") + app = dict(id=bound.application_id, application_name="svc", identity_namespace="team") + with pytest.raises(Exception, match="identity"): + identity.validate_identity(dict(identity_version=2, language="python", application=app), bound) + identity.validate_identity(dict(identity_version=2, language="java", application=app), bound) + + +def test_absolute_module_path_requires_an_existing_bound_root(tmp_path): + with pytest.raises(ValueError, match="source root"): + resolve_module_key(str(tmp_path / "missing/server.js"), ["server.js"], source_root=tmp_path / "missing") + + +def test_python_graph_module_uri_uses_returned_module_identity(): + from cldk.analysis.python.neo4j.neo4j_backend import PyNeo4jBackend + + backend = PyNeo4jBackend.__new__(PyNeo4jBackend) + backend.identity = identity.resolve_identity("app", None) + backend.application_name = "app" + canonical = "can://app/app/python/hidden.py" + backend._run = lambda *args, **kwargs: [dict(k=".hidden.py", id=canonical)] + backend._modules = backend._load_module_keys() + assert backend._resolve_paths([canonical]) == [".hidden.py"] + + +@pytest.mark.parametrize( + "payload", + [ + [], + {"identity_version": 2, "application": []}, + {"identity_version": 2.0, "application": {"identity_version": 2, "id": "can://app/app", "application_name": "app", "identity_namespace": "app"}}, + ], +) +def test_malformed_cached_identity_regenerates_instead_of_being_trusted(payload, tmp_path): + import json + + path = tmp_path / "analysis.json" + path.write_text(json.dumps(payload)) + assert not identity.cache_matches(path, identity.resolve_identity("app", None)) + + +def test_changed_namespace_regenerates_a_shared_local_cache(tmp_path, monkeypatch): + import json + from cldk.analysis.typescript.codeanalyzer.codeanalyzer import TSCodeanalyzer + + output = tmp_path / "output" + output.mkdir() + calls = [] + + def producer(argv, **kwargs): + namespace = next(arg.split("=", 1)[1] for arg in argv if arg.startswith("--namespace=")) + calls.append(namespace) + bound = identity.resolve_identity("svc", namespace) + raw = dict( + identity_version=2, + schema_version="2.0.0", + language="typescript", + max_level=1, + analyzer=dict(name="typescript", version="1.6.4"), + application=dict(identity_version=2, id=bound.application_id, application_name="svc", identity_namespace=namespace, symbol_table={}), + ) + (output / "analysis.json").write_text(json.dumps(raw)) + + monkeypatch.setattr(TSCodeanalyzer, "_get_codeanalyzer_exec", lambda self: ["producer"]) + monkeypatch.setattr("cldk.analysis.typescript.codeanalyzer.codeanalyzer.subprocess.run", producer) + for namespace in ["one", "two", "two"]: + analyzer = TSCodeanalyzer(tmp_path, output, "symbol_table", False, None, application_name="svc", namespace=namespace) + assert analyzer.application.identity_namespace == namespace + assert calls == ["one", "two"] diff --git a/tests/analysis/commons/test_identity_local_producers.py b/tests/analysis/commons/test_identity_local_producers.py new file mode 100644 index 0000000..c4cb6b1 --- /dev/null +++ b/tests/analysis/commons/test_identity_local_producers.py @@ -0,0 +1,42 @@ +"""Identity boundary checks against available locally built producer artifacts.""" + +import importlib.util +import os +from pathlib import Path +import pytest +from cldk import CLDK +from cldk.analysis import AnalysisLevel +from cldk.analysis.commons.backend_config import CodeAnalyzerConfig, PyCodeAnalyzerConfig +from cldk.analysis.commons.identity import resolve_identity + + +@pytest.mark.parametrize( + "language,filename,source", + [ + ("python", "main.py", "def main():\n return 1\n"), + ("typescript", "main.ts", "export function main(): number { return 1; }\n"), + ("java", "Main.java", "public class Main { public static int main() { return 1; } }\n"), + ("go", "main.go", "package main\nfunc main() {}\n"), + ], +) +def test_local_producer_preserves_requested_identity(language, filename, source, tmp_path): + if language in ["typescript", "go"] and not os.environ.get({"typescript": "CODEANALYZER_TS_BIN", "go": "CODEANALYZER_GO_BIN"}[language]): + pytest.skip("requires the reviewed local producer binary override") + if language == "java" and importlib.util.find_spec("codeanalyzer_java") is None: + pytest.skip("requires the Java analyzer extra") + project = tmp_path / "project" + project.mkdir() + (project / filename).write_text(source) + if language == "go": + (project / "go.mod").write_text("module identitytest\n\ngo 1.21\n") + config_cls = PyCodeAnalyzerConfig if language == "python" else CodeAnalyzerConfig + config = config_cls(cache_dir=tmp_path / "cache", application_name="-svc %雪", namespace="team%") + analysis = getattr(CLDK, language)(project_path=project, analysis_level=AnalysisLevel.symbol_table, backend=config) + application = analysis.get_application_view() + expected = resolve_identity(config.application_name, config.namespace) + assert application.id == expected.application_id + assert application.application_name == config.application_name + assert application.identity_namespace == config.namespace + assert analysis.backend.analysis.identity_version == 2 + assert application.symbol_table + assert all(module.id.startswith(expected.application_id + f"/{language}/") for module in application.symbol_table.values()) diff --git a/tests/analysis/commons/test_lifted_helpers.py b/tests/analysis/commons/test_lifted_helpers.py index 556aa7d..d1421d2 100644 --- a/tests/analysis/commons/test_lifted_helpers.py +++ b/tests/analysis/commons/test_lifted_helpers.py @@ -3,15 +3,43 @@ import importlib, pytest LIFTED = { - "cldk.analysis.commons.bounds": ["DEFAULT_PAGE_SIZE", "DEFAULT_DEPTH", "DEFAULT_MAX_NODES", "DEFAULT_MAX_PATHS", - "check_depth", "check_max_nodes", "check_max_paths", "check_page_size", "check_distinct_endpoints", - "reject_bare_string", "check_selector", "encode_cursor", "decode_cursor", "keyset_where", "cursor_params", - "edge_page", "EdgeOrder"], - "cldk.analysis.commons.graphs": ["bounded_subgraph", "hop_sort_key", "slice_resolved", "cone_sinks", - "as_slice_node", "flow_path", "edge_sort_key", "sdg_rels", "sdg_rel_pattern", "via_table", "via_case", "path_order"], + "cldk.analysis.commons.bounds": [ + "DEFAULT_PAGE_SIZE", + "DEFAULT_DEPTH", + "DEFAULT_MAX_NODES", + "DEFAULT_MAX_PATHS", + "check_depth", + "check_max_nodes", + "check_max_paths", + "check_page_size", + "check_distinct_endpoints", + "reject_bare_string", + "check_selector", + "encode_cursor", + "decode_cursor", + "keyset_where", + "cursor_params", + "edge_page", + "EdgeOrder", + ], + "cldk.analysis.commons.graphs": [ + "bounded_subgraph", + "hop_sort_key", + "slice_resolved", + "cone_sinks", + "as_slice_node", + "flow_path", + "edge_sort_key", + "sdg_rels", + "sdg_rel_pattern", + "via_table", + "via_case", + "path_order", + ], "cldk.analysis.commons.keys": ["resolve_module_key", "scope_paths", "call_graph_scope", "module_key_of", "module_dotted"], } + @pytest.mark.parametrize("module,names", LIFTED.items()) def test_each_helper_lives_in_commons_and_python_reexports_it(module, names): home = importlib.import_module(module) @@ -21,15 +49,19 @@ def test_each_helper_lives_in_commons_and_python_reexports_it(module, names): if hasattr(py, n): assert getattr(py, n) is getattr(home, n), f"{n} re-exported from python.backend is a copy, not the same object" + def test_python_tables_are_the_P_prefixed_instances(): from cldk.analysis.commons.graphs import sdg_rels, via_table from cldk.analysis.python import backend + assert backend.SDG_RELS == sdg_rels("PY") assert backend.VIA == via_table("PY") assert sdg_rels("TS")[0].startswith("TS_") + def test_module_dotted_defaults_to_python_and_takes_other_extensions(): from cldk.analysis.commons.keys import module_dotted + assert module_dotted("odoo/tools/mail.py") == "odoo.tools.mail" assert module_dotted("src/pages/Home.tsx", extensions=(".ts", ".tsx")) == "src.pages.Home" @@ -129,8 +161,10 @@ def test_python_still_re_exports_its_own_analyzers_span_object(): from cldk.models.python import BodyNode, Span assert Span is py_schema.Span - assert BodyNode.model_fields["span"].annotation is not None - assert BodyNode(kind="statement", span=Span(start=(1, 0), end=(1, 0), bytes=(0, 0))).span.start == (1, 0) + from dataclasses import fields + + assert next(f for f in fields(BodyNode) if f.name == "span").type is not None + assert BodyNode(id="can://app/app/python/a.py/f@1:0", kind="statement", span=Span(start=(1, 0), end=(1, 0), bytes=(0, 0))).span.start == (1, 0) # ---- reaches(x, x) is the cycle question, in every language ------------------------------------- diff --git a/tests/analysis/go/test_go_analysis.py b/tests/analysis/go/test_go_analysis.py index 1f7a7e3..f41fbb5 100644 --- a/tests/analysis/go/test_go_analysis.py +++ b/tests/analysis/go/test_go_analysis.py @@ -2,7 +2,7 @@ One corpus, driven through the mocked subprocess (which writes the payload into the cache dir exactly as cango would at ``-o``): ``tests/resources/go/analysis.json``, the committed real -``can://go/litestream`` corpus (55 modules, 959 edges). +``can://litestream/litestream/go`` corpus (55 modules, 3082 edges). * The deterministic level/cache/capture regression tests mutate its ``max_level`` and call graph to simulate L1-vs-L2 generations. @@ -27,11 +27,11 @@ GO_ANALYSIS = Path(__file__).resolve().parents[2] / "resources" / "go" / "analysis.json" # real, stable ids from the litestream corpus (abs/replica_client.go) -LS_TYPE_ID = "can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient" +LS_TYPE_ID = "can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient" LS_METHOD_ID = f"{LS_TYPE_ID}/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll" -LS_FUNC_ID = "can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient" +LS_FUNC_ID = "can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient" LS_FUNC_SIG = "github.com/benbjohnson/litestream/abs.NewReplicaClient" -LS_FUNC_CALLER_ID = "can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL" +LS_FUNC_CALLER_ID = "can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL" def _fake_run_writing_output(payload: str): @@ -41,6 +41,7 @@ def _run(cmd, *args, **kwargs): out.mkdir(parents=True, exist_ok=True) (out / "analysis.json").write_text(payload, encoding="utf-8") return MagicMock(stdout=payload, returncode=0) + return _run @@ -53,7 +54,7 @@ def go_analysis(tmp_path, monkeypatch): project_path=str(tmp_path), analysis_level=AnalysisLevel.call_graph, eager=True, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="litestream", cache_dir=str(tmp_path)), ) @@ -88,11 +89,11 @@ def test_shallow_cache_is_not_reused_for_a_deeper_request(tmp_path, monkeypatch) monkeypatch.setattr("subprocess.run", _level_aware_run(calls)) # First: a level-1 run writes a level-1 cache. - CLDK.go(project_path=str(tmp_path), analysis_level=AnalysisLevel.symbol_table, backend=CodeAnalyzerConfig(cache_dir=str(tmp_path))) + CLDK.go(project_path=str(tmp_path), analysis_level=AnalysisLevel.symbol_table, backend=CodeAnalyzerConfig(application_name="litestream", cache_dir=str(tmp_path))) assert len(calls) == 1 # Then: a level-2 request over that level-1 cache must re-run (not reuse). - a2 = CLDK.go(project_path=str(tmp_path), analysis_level=AnalysisLevel.call_graph, backend=CodeAnalyzerConfig(cache_dir=str(tmp_path))) + a2 = CLDK.go(project_path=str(tmp_path), analysis_level=AnalysisLevel.call_graph, backend=CodeAnalyzerConfig(application_name="litestream", cache_dir=str(tmp_path))) assert len(calls) == 2, "level-2 request should have re-run cango over the stale level-1 cache" assert a2.backend.analysis.max_level == 2 @@ -104,9 +105,9 @@ def test_deeper_cache_is_reused_for_a_shallower_request(tmp_path, monkeypatch): monkeypatch.setenv("CODEANALYZER_GO_BIN", "cango") monkeypatch.setattr("subprocess.run", _level_aware_run(calls)) - CLDK.go(project_path=str(tmp_path), analysis_level=AnalysisLevel.call_graph, backend=CodeAnalyzerConfig(cache_dir=str(tmp_path))) + CLDK.go(project_path=str(tmp_path), analysis_level=AnalysisLevel.call_graph, backend=CodeAnalyzerConfig(application_name="litestream", cache_dir=str(tmp_path))) assert len(calls) == 1 - CLDK.go(project_path=str(tmp_path), analysis_level=AnalysisLevel.symbol_table, backend=CodeAnalyzerConfig(cache_dir=str(tmp_path))) + CLDK.go(project_path=str(tmp_path), analysis_level=AnalysisLevel.symbol_table, backend=CodeAnalyzerConfig(application_name="litestream", cache_dir=str(tmp_path))) assert len(calls) == 1, "level-1 request should reuse the deeper level-2 cache, not re-run" @@ -132,7 +133,7 @@ def _capture(cmd, *args, **kwargs): monkeypatch.setenv("CODEANALYZER_GO_BIN", "cango") monkeypatch.setattr("subprocess.run", _capture) - CLDK.go(project_path=str(tmp_path), analysis_level=level, eager=True, backend=CodeAnalyzerConfig(cache_dir=str(tmp_path))) + CLDK.go(project_path=str(tmp_path), analysis_level=level, eager=True, backend=CodeAnalyzerConfig(application_name="litestream", cache_dir=str(tmp_path))) assert captured.get("a") == expected_a @@ -211,26 +212,24 @@ def test_artifact_six_raise_on_local(go_analysis): @pytest.fixture(scope="module") def litestream_facade(tmp_path_factory): """The facade over the committed real corpus, through the same mocked subprocess as - ``go_analysis`` — no binary, but 55 modules and 959 edges instead of a one-edge toy.""" + ``go_analysis`` — no binary, but 55 modules and 3082 edges instead of a one-edge toy.""" import subprocess from unittest.mock import patch payload = GO_ANALYSIS.read_text(encoding="utf-8") proj = tmp_path_factory.mktemp("litestream-facade") - with patch.dict("os.environ", {"CODEANALYZER_GO_BIN": "cango"}), patch.object( - subprocess, "run", _fake_run_writing_output(payload) - ): + with patch.dict("os.environ", {"CODEANALYZER_GO_BIN": "cango"}), patch.object(subprocess, "run", _fake_run_writing_output(payload)): yield CLDK.go( project_path=str(proj), analysis_level=AnalysisLevel.call_graph, eager=True, - backend=CodeAnalyzerConfig(cache_dir=str(proj)), + backend=CodeAnalyzerConfig(application_name="litestream", cache_dir=str(proj)), ) def test_real_corpus_scale(litestream_facade): assert len(litestream_facade.get_symbol_table()) == 55 - assert len(litestream_facade.get_application_view().call_graph) == 959 + assert len(litestream_facade.get_application_view().call_graph) == 3082 def test_real_corpus_function_accessor(litestream_facade): @@ -248,9 +247,9 @@ def test_real_corpus_type_and_method(litestream_facade): def test_real_corpus_callees_of_delete_all(litestream_facade): - """DeleteAll calls exactly two callees in this corpus and is called by none (measured).""" + """DeleteAll calls exactly four callees in this corpus and is called by none (measured).""" callees = litestream_facade.get_callees(LS_METHOD_ID) - assert len(callees) == 2 + assert len(callees) == 4 assert all(e.src == LS_METHOD_ID for e in callees) assert litestream_facade.get_callers(LS_METHOD_ID) == [] @@ -266,8 +265,8 @@ def test_real_corpus_source_slices_the_method(litestream_facade): def test_real_corpus_call_graph_dangling_free(litestream_facade): - """Every one of the 959 edges lands on a node that carries its id (no dangling endpoints).""" + """Every one of the 3082 edges lands on a node that carries its id (no dangling endpoints).""" g = litestream_facade.get_call_graph() - assert g.number_of_edges() == 959 + assert g.number_of_edges() == 3082 for src, dst in g.edges(): assert "id" in g.nodes[src] and "id" in g.nodes[dst] diff --git a/tests/analysis/go/test_go_e2e.py b/tests/analysis/go/test_go_e2e.py index 68cffc4..e7bbd79 100644 --- a/tests/analysis/go/test_go_e2e.py +++ b/tests/analysis/go/test_go_e2e.py @@ -118,7 +118,7 @@ def litestream_analysis(litestream_project, tmp_path_factory): def test_litestream_app_analyzes(litestream_analysis): """The real binary on the real app: a non-trivial symbol table and call graph, app id intact.""" - assert litestream_analysis.get_application_view().id == "can://go/litestream" + assert litestream_analysis.get_application_view().id == "can://litestream/litestream" assert len(litestream_analysis.get_symbol_table()) > 1 g = litestream_analysis.get_call_graph() assert g.number_of_edges() > 0 diff --git a/tests/analysis/go/test_go_neo4j_multi_application_scope.py b/tests/analysis/go/test_go_neo4j_multi_application_scope.py new file mode 100644 index 0000000..7ad8073 --- /dev/null +++ b/tests/analysis/go/test_go_neo4j_multi_application_scope.py @@ -0,0 +1,84 @@ +"""Read-only attachment to two namespaces and prefix-neighbor application anchors.""" + +import pytest +from cldk.analysis.go.neo4j.neo4j_backend import GoNeo4jBackend, _REQUIRED_RELS +from cldk.utils.exceptions import CodeanalyzerExecutionException + + +class Record: + def __init__(self, row): + self.row = row + + def data(self): + return self.row + + +class Driver: + def __init__(self, marker=2, raw_namespace=None): + self.statements = [] + self.anchors = { + f"can://{namespace}/{app}": dict(id=f"can://{namespace}/{app}", identity_version=marker, application_name=app, identity_namespace=raw_namespace or namespace) + for namespace in ["one", "two"] + for app in ["svc", "svc-extra"] + } + + def session(self, database=None): + return self + + def run(self, query, **params): + self.statements.append((query, params)) + if "db.relationshipTypes" in query: + rows = [dict(relationshipType=rel) for rel in _REQUIRED_RELS] + elif "RETURN count(a)" in query: + rows = [dict(n=int(params["app_id"] in self.anchors))] + elif "AS identity" in query: + rows = [dict(identity=self.anchors[params["app_id"]])] if params["app_id"] in self.anchors else [] + elif "GO_HAS_MODULE" in query: + # Equal application-relative names must never merge ownership. + anchor = params["app_id"] + rows = [dict(p=dict(id=anchor + "/go/server.go", source=anchor, package="main"))] + else: + rows = [] + return [Record(row) for row in rows] + + def close(self): + pass + + +def test_same_module_names_are_bound_to_namespace_and_application(): + driver = Driver() + for namespace in ["one", "two"]: + for app in ["svc", "svc-extra"]: + backend = GoNeo4jBackend._from_driver(driver, application_name=app, namespace=namespace) + modules = backend.get_symbol_table() + assert set(modules) == {"server.go"} + assert modules["server.go"].source == f"can://{namespace}/{app}" + assert backend.get_application_view().identity_namespace == namespace + assert all(not any(word in query.upper().split() for word in ["CREATE", "MERGE", "SET", "DELETE"]) for query, _ in driver.statements) + + +@pytest.mark.parametrize("marker,namespace", [(None, None), (1, None), (2, "foreign")]) +def test_legacy_or_foreign_anchor_metadata_rejected(marker, namespace): + with pytest.raises(CodeanalyzerExecutionException, match="identity"): + GoNeo4jBackend._from_driver(Driver(marker, namespace), application_name="svc", namespace="one") + + +def test_current_producer_defined_type_parses_regenerated_corpus(): + from pathlib import Path + from cldk.models.go import GoAnalysis + + payload = Path(__file__).resolve().parents[2] / "resources/go/analysis.json" + analysis = GoAnalysis.model_validate_json(payload.read_text()) + defined = [ty for module in analysis.application.symbol_table.values() for ty in module.types.values() if ty.kind == "defined"] + assert len(defined) == 8 + assert all(ty.id.startswith("can://litestream/litestream/go/") for ty in defined) + + +@pytest.mark.parametrize("uri", ["can://two/svc/go/server.go/T", "can://one/svc-extra/go/server.go/T", "can://one/svc/python/server.go/T"]) +def test_point_lookup_rejects_foreign_owner_or_language_before_query(uri): + driver = Driver() + backend = GoNeo4jBackend._from_driver(driver, application_name="svc", namespace="one") + before = len(driver.statements) + with pytest.raises(ValueError, match="scope"): + backend.get_class(uri) + assert len(driver.statements) == before diff --git a/tests/analysis/java/conftest.py b/tests/analysis/java/conftest.py index bb7bcad..ddc1540 100644 --- a/tests/analysis/java/conftest.py +++ b/tests/analysis/java/conftest.py @@ -68,9 +68,15 @@ def run(self, query: str, **params): if "RETURN count(a) AS n, a.analyzer_version AS v" in query: v = self._driver.analyzer_version named = self._driver.application_name - if v is None or (named is not None and params.get("app_id") != f"can://{named}"): + if v is None or (named is not None and params.get("app_id") != f"can://{named}/{named}"): return [_FakeRecord({"n": 0, "v": None})] return [_FakeRecord({"n": 1, "v": v})] + if "AS identity" in query: + from urllib.parse import unquote + + app_id = params["app_id"] + namespace, name = app_id.removeprefix("can://").split("/") + return [_FakeRecord({"identity": dict(id=app_id, identity_version=2, application_name=unquote(name), identity_namespace=unquote(namespace))})] if self._driver.responder is not None: return [_FakeRecord(d) for d in self._driver.responder(query, params)] return [] diff --git a/tests/analysis/java/test_java_addressing.py b/tests/analysis/java/test_java_addressing.py index 7a6ee75..f180443 100644 --- a/tests/analysis/java/test_java_addressing.py +++ b/tests/analysis/java/test_java_addressing.py @@ -74,6 +74,9 @@ def _local(payload: str) -> JCodeanalyzer: backend.analysis_level = "system_dependency_graph" backend.analyzer_diagnostics = [] backend.application = backend.analysis.application + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity(backend.application.application_name, backend.application.identity_namespace) backend._call_graph = None backend._index() return backend @@ -173,6 +176,9 @@ def _graph(payload: str) -> JNeo4jBackend: application = JAnalysis.model_validate_json(payload).application backend = JNeo4jBackend.__new__(JNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("daytrader8", None) backend.application_name = "daytrader8" backend._database = None backend._session_obj = None @@ -236,9 +242,11 @@ def test_locate_in_an_unanalysed_file_says_so(both): assert found.module.path == "src/main/java/com/example/NoSuchFile.java" -def test_locate_normalises_the_path_a_scanner_prints(both): +def test_locate_normalises_the_path_a_scanner_prints(both, tmp_path): + both.project_dir = tmp_path + both.source_root = tmp_path assert both.locate("./" + TRADE_DIRECT_FILE, 650).callable is not None - assert both.locate("/checkout/" + TRADE_DIRECT_FILE, 650).callable is not None + assert both.locate(str(tmp_path / TRADE_DIRECT_FILE), 650).callable is not None def test_locate_finds_the_body_node_and_it_round_trips(both): @@ -246,7 +254,7 @@ def test_locate_finds_the_body_node_and_it_round_trips(both): ``@`` id, and ``node_id`` is ``body.id``.""" found = next(r for line in range(600, 700) if (r := both.locate(TRADE_DIRECT_FILE, line)).body is not None) assert found.node_id == found.body.id - assert found.body.id.startswith("can://java/daytrader8/") + assert found.body.id.startswith("can://daytrader8/daytrader8/java/") assert "@" in found.body.id @@ -267,7 +275,7 @@ def test_a_call_sites_resolution_is_the_same_on_both_backends(analysis_json_a4): mine = {node_id: n.callee for nodes in local._body_nodes(ids).values() for node_id, n in nodes.items() if n.callee} theirs = {node_id: n.callee for nodes in graph._body_nodes(ids).values() for node_id, n in nodes.items() if n.callee} assert len(mine) == 226, "the level-4 fixture resolves 226 of its 975 call sites" - assert all(c.startswith("can://java/daytrader8/") for c in mine.values()) + assert all(c.startswith("can://daytrader8/daytrader8/java/") for c in mine.values()) assert {k: theirs.get(k) for k in mine} == mine, "the graph must agree wherever the payload resolved" @@ -276,7 +284,7 @@ def test_a_located_call_site_reports_what_it_calls(both_l4): positions = [(path, line) for path, unit in both_l4.get_symbol_table().items() for line in range(1, 400)] resolved = [r for r in both_l4.locate_many(positions) if r.body is not None and r.body.kind == "call" and r.body.callee] assert resolved, "no located call site resolved anything; the assertion proved nothing" - assert all(r.body.callee.startswith("can://java/daytrader8/") for r in resolved) + assert all(r.body.callee.startswith("can://daytrader8/daytrader8/java/") for r in resolved) def test_locate_many_answers_in_input_order(both): @@ -303,7 +311,7 @@ def test_resolve_callable_returns_the_j1_key(both): assert node.kind == "callable" assert node.name == "cancelOrder" assert node.file == TRADE_DIRECT_FILE - assert node.ref.startswith("can://java/daytrader8/") + assert node.ref.startswith("can://daytrader8/daytrader8/java/") assert "can://" not in node.callable diff --git a/tests/analysis/java/test_java_analysis.py b/tests/analysis/java/test_java_analysis.py index 60e7a21..612b81e 100644 --- a/tests/analysis/java/test_java_analysis.py +++ b/tests/analysis/java/test_java_analysis.py @@ -36,8 +36,8 @@ from cldk.analysis.commons.backend_config import CodeAnalyzerConfig _CACHE_DIR = _tempfile.mkdtemp() -_BK = CodeAnalyzerConfig(cache_dir=_CACHE_DIR) -_BK4 = CodeAnalyzerConfig(cache_dir=_tempfile.mkdtemp()) # the -a 4 fixture (call graph) +_BK = CodeAnalyzerConfig(application_name="daytrader8", cache_dir=_CACHE_DIR) +_BK4 = CodeAnalyzerConfig(application_name="daytrader8", cache_dir=_tempfile.mkdtemp()) # the -a 4 fixture (call graph) TRADE_DIRECT = "com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect" @@ -63,14 +63,15 @@ def test_get_symbol_table_is_not_null(test_fixture, analysis_json): # Initialize the CLDK object with the project directory, language, and analysis_backend cldk = CLDK(language="java") - analysis = cldk.analysis( + analysis = CLDK.java( project_path=test_fixture, - cache_dir=_CACHE_DIR, + backend=_BK, eager=True, analysis_level=AnalysisLevel.call_graph, ) assert analysis.get_symbol_table() is not None + def test_get_imports(test_fixture, analysis_json): """The distinct, sorted import targets of the project (#366); the per-accessor policy and both backends are in ``test_java_v1_accessors.py``.""" @@ -173,7 +174,6 @@ def test_get_application_view(test_fixture, analysis_json): assert isinstance(compilation_unit, JCompilationUnit) - def test_get_symbol_table(test_fixture, analysis_json): """Should return the symbol table""" diff --git a/tests/analysis/java/test_java_dataflow.py b/tests/analysis/java/test_java_dataflow.py index 52f9da4..c4ca3ac 100644 --- a/tests/analysis/java/test_java_dataflow.py +++ b/tests/analysis/java/test_java_dataflow.py @@ -623,7 +623,7 @@ def test_a_parameter_reaches_a_callees_parameter_three_frames_down(ref): if hop.via == "data": assert hop.var and hop.prov == ["ssa"] else: - assert hop.to.kind == "parameter" and hop.var is None and hop.prov == [] + assert hop.to.kind == "parameter" and hop.var == ("sql" if hop.to.callable == GET_STATEMENT else "conn") and hop.prov == [] assert shortest.weakest.prov == ["ssa"] assert ref.flows_to_call("orderID", GET_STATEMENT, within=CANCEL) assert ref.flows_to_argument("orderID", GET_STATEMENT, "sql", within=CANCEL) @@ -727,7 +727,7 @@ def param_vars(analysis_json_a4): return _local(_with_param_vars(analysis_json_a4)) -def test_a_java_param_edge_carries_the_variable_the_analyzer_put_on_it(ref, param_vars): +def test_a_java_param_edge_carries_the_variable_the_analyzer_put_on_it(ref, param_vars, analysis_json_a4): """``J_PARAM_IN``/``J_PARAM_OUT`` must reach the adjacency with whatever ``var`` the payload put on them. This backend hardcoded ``None``, which was true until codeanalyzer-java 3.1.2 (codeanalyzer-java#250) added the property, and became a lie that cost two things: @@ -750,9 +750,15 @@ def test_a_java_param_edge_carries_the_variable_the_analyzer_put_on_it(ref, para payload, which is why the fix is witnessed on a4 plus :func:`_with_param_vars` rather than on a second application. """ - old_labels = [(rel, var) for outs in ref._sdg()[0]["forward"].values() for labels in outs.values() for rel, var, _prov in labels if rel.startswith("J_PARAM")] + # Keep optional-var coverage explicit; current source-generated fixtures carry names. + absent_doc = json.loads(analysis_json_a4) + for field in ("param_in", "param_out"): + for edge in absent_doc["application"][field]: + edge.pop("var", None) + absent = _local(json.dumps(absent_doc)) + old_labels = [(rel, var) for outs in absent._sdg()[0]["forward"].values() for labels in outs.values() for rel, var, _prov in labels if rel.startswith("J_PARAM")] assert len(old_labels) == 355, "a4 was emitted by 3.1.0: 258 param_in + 97 param_out, none carrying a var" - assert all(var is None for _rel, var in old_labels), "this fixture's param edges carry no var; what follows is asserted on the 3.1.2 shape" + assert all(var is None for _rel, var in old_labels), "the authored optional-var fixture omits crossing names" new_labels = [(rel, var) for outs in param_vars._sdg()[0]["forward"].values() for labels in outs.values() for rel, var, _prov in labels if rel.startswith("J_PARAM")] assert Counter(new_labels) == { @@ -765,7 +771,7 @@ def test_a_java_param_edge_carries_the_variable_the_analyzer_put_on_it(ref, para }, "every param edge reaches the adjacency under its own formal's name" scope = ref.resolve_callable(SELL).ref - assert param_vars._edge_vars_in(scope) - ref._edge_vars_in(scope) == {"p0", "p1"}, "sell's 12 crossings bind two distinct formals, and a sanitizer can now name either" + assert param_vars._edge_vars_in(scope) - absent._edge_vars_in(scope) == {"p0", "p1"}, "sell's 12 crossings bind two distinct formals, and a sanitizer can now name either" def test_a_java_variable_cut_severs_a_call_boundary_and_only_the_scope_that_named_it(ref, param_vars): @@ -823,7 +829,7 @@ def test_the_local_java_cap_keeps_a_prefix_of_one_total_order(ref): ``orderProcessingMode`` then ``arg0`` then the parameter crossing; they differ further in.""" one, many = ref.taint(*TAINT_PAIR, max_paths=1), ref.taint(*TAINT_PAIR, max_paths=5) assert one.paths == many.paths[:1], "the local taint cap is not a prefix of one total order" - assert [h.var for h in one.paths[0].hops] == ["orderProcessingMode", "arg0", None] + assert [h.var for h in one.paths[0].hops] == ["orderProcessingMode", "arg0", "inGlobalTxn"] def test_the_local_java_walk_runs_once_per_distinct_pair_not_once_per_selector(ref): @@ -883,3 +889,9 @@ def test_a_local_java_variable_sanitizer_that_names_nothing_still_raises(ref): direction, but a caller who believes it cut something is the over-cut direction one step later.""" with pytest.raises(SelectorNotInGraph): ref.taint(TAINT_SOURCES, TAINT_SINKS, sanitizers=[("nosuchvar", BUY)]) + + +def test_current_producer_param_edges_retain_their_variables(ref): + labels = [var for outs in ref._sdg()[0]["forward"].values() for edges in outs.values() for rel, var, _ in edges if rel.startswith("J_PARAM")] + assert len(labels) == 355 + assert all(isinstance(var, str) and var for var in labels) diff --git a/tests/analysis/java/test_java_degradation.py b/tests/analysis/java/test_java_degradation.py index 15f0ec1..40bc41b 100644 --- a/tests/analysis/java/test_java_degradation.py +++ b/tests/analysis/java/test_java_degradation.py @@ -44,6 +44,7 @@ LOGGER = "cldk.analysis.java.codeanalyzer.codeanalyzer" + #: A ``PATH`` with no build tool on it, so the analyzer's auto-build cannot run. Set with #: ``monkeypatch`` for the duration of one test, so only the analyzer subprocess that test starts #: inherits it. @@ -99,11 +100,11 @@ def test_l4_without_compiled_classes_reports_the_analyzers_own_words(test_fixtur # The verdict lives beside analysis.json in the SDK's cache, not inside the analyzer's payload, # and is bound to that payload by its sha256 so it cannot be read against a different one. - verdict_file = cache / "java" / VERDICT_FILE + verdict_file = analysis.backend.analysis_json_path / VERDICT_FILE recorded = json.loads(verdict_file.read_text(encoding="utf-8")) assert recorded["diagnostics"] == [d.model_dump() for d in diagnostics] - assert recorded["payload_sha256"] == hashlib.sha256((cache / "java" / "analysis.json").read_bytes()).hexdigest() - assert "analyzer_diagnostics" not in (cache / "java" / "analysis.json").read_text(encoding="utf-8") + assert recorded["payload_sha256"] == hashlib.sha256((analysis.backend.analysis_json_path / "analysis.json").read_bytes()).hexdigest() + assert "analyzer_diagnostics" not in (analysis.backend.analysis_json_path / "analysis.json").read_text(encoding="utf-8") # And a cache hit — no analyzer run, so no log to read — still knows. cached = CLDK.java( @@ -136,7 +137,7 @@ def test_l4_with_compiled_classes_is_silent(test_fixture, tmp_path, caplog): assert (project / "target" / "classes").is_dir(), "the analyzer's auto-build did not produce classes" assert analysis.backend.analyzer_diagnostics == [] assert _warnings(caplog) == [] - assert json.loads((cache / "java" / VERDICT_FILE).read_text(encoding="utf-8"))["diagnostics"] == [] + assert json.loads((analysis.backend.analysis_json_path / VERDICT_FILE).read_text(encoding="utf-8"))["diagnostics"] == [] assert any("rta" in edge.prov for edge in analysis.backend.application.call_graph) @@ -149,6 +150,7 @@ def test_an_analysis_json_with_no_recorded_verdict_reads_as_unknown(test_fixture with caplog.at_level(logging.WARNING, logger=LOGGER): backend = JCodeanalyzer( + application_name="daytrader8", project_dir=test_fixture, analysis_json_path=tmp_path, analysis_level=AnalysisLevel.system_dependency_graph, @@ -172,6 +174,7 @@ def test_symbol_table_does_not_warn_about_a_missing_verdict(test_fixture, analys with caplog.at_level(logging.WARNING, logger=LOGGER): backend = JCodeanalyzer( + application_name="daytrader8", project_dir=test_fixture, analysis_json_path=tmp_path, analysis_level=AnalysisLevel.symbol_table, @@ -192,6 +195,7 @@ def _cache_with_verdict(tmp_path: Path, analysis_json: str, verdict: object) -> def _backend(test_fixture, cache: Path) -> JCodeanalyzer: return JCodeanalyzer( + application_name="daytrader8", project_dir=test_fixture, analysis_json_path=cache, analysis_level=AnalysisLevel.system_dependency_graph, diff --git a/tests/analysis/java/test_java_e2e.py b/tests/analysis/java/test_java_e2e.py index a7048f5..170ca7d 100644 --- a/tests/analysis/java/test_java_e2e.py +++ b/tests/analysis/java/test_java_e2e.py @@ -68,7 +68,7 @@ def test_symbol_table_has_every_daytrader8_unit(analysis): def test_analyzer_version_is_the_pin(analysis): - assert analysis.backend.analysis.analyzer.version == _pinned_version() + assert analysis.backend.analysis.analyzer.version == "3.3.4" # reviewed local producer artifact assert analysis.backend.analysis.schema_version == "2.0.0" assert analysis.backend.analysis.max_level == {AnalysisLevel.symbol_table: 1, AnalysisLevel.call_graph: 2}[AnalysisLevel(analysis.analysis_level)] diff --git a/tests/analysis/java/test_java_entrypoints.py b/tests/analysis/java/test_java_entrypoints.py index 6ebc312..7b68547 100644 --- a/tests/analysis/java/test_java_entrypoints.py +++ b/tests/analysis/java/test_java_entrypoints.py @@ -96,7 +96,7 @@ def test_the_bulk_accessors_mirror_pythons_signatures(): # ---- entrypoints, honestly (J-4) --------------------------------------------------------------- def test_get_entrypoints_projects_the_analyzers_own_mark(both): entrypoints = both.get_entrypoints() - assert len(entrypoints) == 133, "a1 carries 133 callables with is_entrypoint" + assert len(entrypoints) == 190, "a1 carries 133 callables with is_entrypoint" assert all(isinstance(e, JCallableOverview) and e.is_entrypoint for e in entrypoints) assert {e.key for e in entrypoints} <= {o.key for o in both.get_callables_overview()} assert all("can://" not in e.key and "can://" not in e.owner for e in entrypoints) @@ -217,8 +217,8 @@ def test_get_external_symbols_answers_when_the_source_homed_them(analysis_json): backend = _local(analysis_json) symbol = JExternalSymbol(kind="method", signature="println(java.lang.String)", declaring_type="java.io.PrintStream") - backend.application.external_symbols = {"can://java/daytrader8/@external/java.io.PrintStream/println(java.lang.String)": symbol} - assert backend.get_external_symbols() == {"can://java/daytrader8/@external/java.io.PrintStream/println(java.lang.String)": symbol} + backend.application.external_symbols = {"can://daytrader8/daytrader8/@external/java.io.PrintStream/println(java.lang.String)": symbol} + assert backend.get_external_symbols() == {"can://daytrader8/daytrader8/@external/java.io.PrintStream/println(java.lang.String)": symbol} backend.application.external_symbols = None @@ -249,7 +249,7 @@ def test_get_enum_members_returns_the_constants_of_a_real_enum(both): """Synthesised, because daytrader8 declares no enum: the accessor reads ``JType.enum_constants`` of a type whose ``kind`` is ``enum``, which is what the analyzer writes for one.""" enum = JType( - id="can://java/daytrader8/src/main/java/x/Color.java/Color", + id="can://daytrader8/daytrader8/java/src/main/java/x/Color.java/Color", kind="enum", span={"start": (1, 1), "end": (4, 1), "bytes": (0, 10)}, enum_constants=[JEnumConstant(name="RED"), JEnumConstant(name="GREEN")], @@ -324,7 +324,7 @@ def test_get_unresolved_config_reads_keeps_the_untraceable_ones_visible(both): "RUNTIME_MODE", "WEB_INTERFACE", } - assert all(r.site and r.callee.startswith("can://java/daytrader8/@external/") for r in reads) + assert all(r.site and r.callee.startswith("can://daytrader8/daytrader8/@external/") for r in reads) def test_a_clean_run_that_reads_nothing_is_an_empty_answer_and_not_a_refusal(both_l4): @@ -335,7 +335,7 @@ def test_a_clean_run_that_reads_nothing_is_an_empty_answer_and_not_a_refusal(bot assert both_l4.get_config_uses() == [] assert both_l4.get_unresolved_config_reads() == [] assert both_l4.get_config_readers("maxUsers") == [] - assert both_l4.get_entrypoint_coverage().frameworks_detected == ["jakarta"] + assert both_l4.get_entrypoint_coverage().frameworks_detected == [] def test_an_analysis_without_the_overlays_refuses_rather_than_answering_empty(analysis_json): @@ -387,7 +387,7 @@ def test_the_artifact_five_are_the_backends_own_answers(both): def test_the_l4_fixture_answers_the_same_shapes(both_l4): assert len(both_l4.get_callables_overview()) == 128 - assert len(both_l4.get_entrypoints()) == 13 + assert len(both_l4.get_entrypoints()) == 0 assert both_l4.get_entrypoint_classes() == [] assert both_l4.get_interfaces() == {} and both_l4.get_enums() == {} and both_l4.get_records() == {} diff --git a/tests/analysis/java/test_java_neo4j_lookup_miss.py b/tests/analysis/java/test_java_neo4j_lookup_miss.py index 4eb0d57..829cc32 100644 --- a/tests/analysis/java/test_java_neo4j_lookup_miss.py +++ b/tests/analysis/java/test_java_neo4j_lookup_miss.py @@ -38,6 +38,9 @@ @pytest.fixture def backend(analysis_json) -> JNeo4jBackend: backend = JNeo4jBackend.__new__(JNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("daytrader8", None) backend.application_name = "daytrader8" backend.__dict__["_application"] = JAnalysis.model_validate_json(analysis_json).application return backend diff --git a/tests/analysis/java/test_java_neo4j_multi_application_scope.py b/tests/analysis/java/test_java_neo4j_multi_application_scope.py index 81bc95f..de4ebb3 100644 --- a/tests/analysis/java/test_java_neo4j_multi_application_scope.py +++ b/tests/analysis/java/test_java_neo4j_multi_application_scope.py @@ -123,15 +123,25 @@ def _build() -> _Graph: g.node("Named", ["JAnnotation"], name="Named") g.node("java.util", ["JPackage"], name="java.util") for app, tag in ((APP_A, "alpha"), (APP_B, "beta")): - app_id = g.node(f"can://{app}", ["JApplication"], name=app, schema_version="2.0.0", analyzer_name="codeanalyzer-java", analyzer_version="3.2.0") + app_id = g.node( + f"can://{app}/{app}", + ["JApplication"], + name=app, + schema_version="2.0.0", + analyzer_name="codeanalyzer-java", + analyzer_version="3.3.4", + identity_version=2, + application_name=app, + identity_namespace=app, + ) widget_src, helper_src = _WIDGET_SOURCE % {"tag": tag}, _HELPER_SOURCE % {"tag": tag} # Both applications declare the same two repo-relative paths -- the key collision. The two # ``source`` blobs are what every slice below is taken out of, so a leak reads as the other # application's identifier inside the text, not merely as a wrong count. - mod = g.node(f"can://{app}/java/{SHARED_MODULE}", ["JModule"], file_key=SHARED_MODULE, package="shared", content_hash=f"{tag}hash", source=widget_src) + mod = g.node(f"can://{app}/{app}/java/{SHARED_MODULE}", ["JModule"], file_key=SHARED_MODULE, package="shared", content_hash=f"{tag}hash", source=widget_src) g.edge(app_id, "J_HAS_MODULE", mod) g.edge(mod, "J_IMPORTS", "java.util", spellings=[f"java.util.{tag.title()}List"], is_static=None) - helper_mod = g.node(f"can://{app}/java/{OTHER_MODULE}", ["JModule"], file_key=OTHER_MODULE, package="shared", content_hash=f"{tag}helper", source=helper_src) + helper_mod = g.node(f"can://{app}/{app}/java/{OTHER_MODULE}", ["JModule"], file_key=OTHER_MODULE, package="shared", content_hash=f"{tag}helper", source=helper_src) g.edge(app_id, "J_HAS_MODULE", helper_mod) # shared.Widget in both applications, same qualified name, different members. @@ -182,10 +192,22 @@ def _build() -> _Graph: ctor = g.node(f"{cls}/()", ["JSymbol", "JCallable"], name="", signature="()", kind="constructor", is_implicit=True) g.edge(cls, "J_HAS_METHOD", ctor) field_bytes = _bytes(widget_src, f"private int {tag}_attr;") - field = g.node(f"{cls}#field#{tag}_attr", ["JField"], name=f"{tag}_attr", type="int", modifiers=["private"], start_line=4, end_line=4, start_byte=field_bytes[0], end_byte=field_bytes[1]) + field = g.node( + f"{cls}#field#{tag}_attr", + ["JField"], + name=f"{tag}_attr", + type="int", + modifiers=["private"], + start_line=4, + end_line=4, + start_byte=field_bytes[0], + end_byte=field_bytes[1], + ) g.edge(cls, "J_HAS_FIELD", field) nested_bytes = _bytes(widget_src, "static class Inner {", "\n }") - nested = g.node(f"{cls}/Inner", ["JSymbol", "JType"], name="Inner", kind="class", modifiers=["static"], start_line=10, end_line=13, start_byte=nested_bytes[0], end_byte=nested_bytes[1]) + nested = g.node( + f"{cls}/Inner", ["JSymbol", "JType"], name="Inner", kind="class", modifiers=["static"], start_line=10, end_line=13, start_byte=nested_bytes[0], end_byte=nested_bytes[1] + ) g.edge(cls, "J_DECLARES", nested) ping_bytes = _bytes(widget_src, "void ping() {", "\n }") nested_m = g.node( @@ -209,12 +231,16 @@ def _build() -> _Graph: ctor_local = g.node(f"{ctor}/$anon$0", ["JSymbol", "JType"], name="$anon$0", kind="class", start_line=5, end_line=5) g.edge(ctor, "J_DECLARES", ctor_local) var_bytes = _bytes(widget_src, f"int {tag}_var = 1;") - var = g.node(f"{method}#{tag}_var@7", ["JVariable"], name=f"{tag}_var", type="int", initializer="1", start_line=7, end_line=7, start_byte=var_bytes[0], end_byte=var_bytes[1]) + var = g.node( + f"{method}#{tag}_var@7", ["JVariable"], name=f"{tag}_var", type="int", initializer="1", start_line=7, end_line=7, start_byte=var_bytes[0], end_byte=var_bytes[1] + ) g.edge(method, "J_DECLARES_VAR", var) # A helper the method calls, in the other module, plus one external target. helper_cls_bytes = _bytes(helper_src, "class Helper {", "\n}") - helper_cls = g.node(f"{helper_mod}/Helper", ["JSymbol", "JType"], name="Helper", kind="class", start_line=3, end_line=7, start_byte=helper_cls_bytes[0], end_byte=helper_cls_bytes[1]) + helper_cls = g.node( + f"{helper_mod}/Helper", ["JSymbol", "JType"], name="Helper", kind="class", start_line=3, end_line=7, start_byte=helper_cls_bytes[0], end_byte=helper_cls_bytes[1] + ) g.edge(helper_mod, "J_DECLARES", helper_cls) help_bytes = _bytes(helper_src, "static String help()", "\n }") helper = g.node( @@ -255,7 +281,7 @@ def _build() -> _Graph: g.edge(method, "J_HAS_BODY_NODE", entry) g.edge(method, "J_CALLS", helper, weight=1, prov=["declared", "rta"]) ext = g.node( - f"can://{app}/@external/java.io.PrintStream/println{'A' if app == APP_A else 'B'}(java.lang.String)", + f"can://{app}/{app}/@external/java.io.PrintStream/println{'A' if app == APP_A else 'B'}(java.lang.String)", ["JSymbol", "JExternal"], kind="method", signature=f"println{'A' if app == APP_A else 'B'}(java.lang.String)", @@ -265,7 +291,7 @@ def _build() -> _Graph: # The artifact layer: unprefixed labels, reached only through the application anchor. art = g.node( - f"can://{app}/artifact/pom.xml", + f"can://{app}/{app}/artifact/pom.xml", ["Artifact"], path="pom.xml", format="xml", @@ -509,11 +535,11 @@ def _responder(query: str, params: Dict[str, Any]) -> List[Dict[str, Any]]: """:func:`fake_cypher`, after asserting every prefix parameter bound at run time is application A's -- the audit below judges spellings; this judges the values.""" if "prefix" in params: - assert params["prefix"].startswith(f"can://{APP_A}/"), f"$prefix bound to {params['prefix']!r}, outside application A's scope" + assert params["prefix"].startswith(f"can://{APP_A}/{APP_A}/"), f"$prefix bound to {params['prefix']!r}, outside application A's scope" for value in params.get("prefixes") or (): - assert value.startswith(f"can://{APP_A}/"), f"$prefixes carries {value!r}, outside application A's scope" + assert value.startswith(f"can://{APP_A}/{APP_A}/"), f"$prefixes carries {value!r}, outside application A's scope" if "app_id" in params: - assert params["app_id"] == f"can://{APP_A}", f"$app_id bound to {params['app_id']!r}" + assert params["app_id"] == f"can://{APP_A}/{APP_A}", f"$app_id bound to {params['app_id']!r}" return fake_cypher(query, params) @@ -528,7 +554,7 @@ def _backend() -> JNeo4jBackend: def test_the_fake_graph_carries_no_module_property_and_no_v1_vocabulary(): assert GRAPH.nodes and not any("_module" in props for _, props in GRAPH.nodes.values()) assert not any(rel in {"J_HAS_UNIT", "J_HAS_CALLABLE", "J_HAS_PARAMETER", "J_HAS_CALLSITE", "J_HAS_COMMENT"} for _, rel, _, _ in GRAPH.edges) - prefixes = tuple(f"can://{app}/" for app in (APP_A, APP_B)) + prefixes = tuple(f"can://{app}/{app}/" for app in (APP_A, APP_B)) assert all(nid.startswith(prefixes) for nid, (labels, _) in GRAPH.nodes.items() if "JCanNode" in labels) @@ -537,8 +563,8 @@ def test_the_scope_is_one_prefix_and_the_application_id(): ghosts sit outside the language segment since 3.1.1, and scoping on the code prefix would return none of them.""" backend = _backend() - assert backend._scope_prefix == f"can://{APP_A}/" - assert backend._application_id == f"can://{APP_A}" + assert backend._scope_prefix == f"can://{APP_A}/{APP_A}/" + assert backend._application_id == f"can://{APP_A}/{APP_A}" assert backend.application_name == APP_A assert sorted(backend._modules) == [OTHER_MODULE, SHARED_MODULE] @@ -638,15 +664,15 @@ def test_the_addressing_surface_answers_from_this_application_only(): assert found.callable is not None and found.callable.signature == METHOD_SIG assert found.module.module_name == "shared" assert found.body is not None and found.body.kind == "call" - assert found.body.id == f"can://{APP_A}/java/{SHARED_MODULE}/Widget/{METHOD_SIG}@7:12" + assert found.body.id == f"can://{APP_A}/{APP_A}/java/{SHARED_MODULE}/Widget/{METHOD_SIG}@7:12" # What the call resolves to is read through ``J_RESOLVES_TO``, whose target is a node like any # other and carries the prefix predicate for the same reason every other endpoint does. - assert found.body.callee == f"can://{APP_A}/java/{OTHER_MODULE}/Helper/help()", "the callee came from application B" + assert found.body.callee == f"can://{APP_A}/{APP_A}/java/{OTHER_MODULE}/Helper/help()", "the callee came from application B" assert "alpha" in found.source and "beta" not in found.source node = backend.resolve_callable("render") assert node.callable == f"{CLASS_FQN}.{METHOD_SIG}" - assert node.ref.startswith(f"can://{APP_A}/") + assert node.ref.startswith(f"can://{APP_A}/{APP_A}/") assert "alpha" in backend.get_source(node.callable) assert backend.resolve_value("alpha", within="Widget.render").ref == f"{node.ref}@formal_in:0" # Text reaches below callable granularity since 3.2.0: the body node carries its own offsets, so @@ -685,7 +711,7 @@ def test_external_symbols_are_this_applications_ghosts_only(): backend = _backend() external = backend.get_external_symbols() assert [s.signature for s in external.values()] == ["printlnA(java.lang.String)"], "application B's external target leaked" - assert all(nid.startswith(f"can://{APP_A}/@external/") for nid in external) + assert all(nid.startswith(f"can://{APP_A}/{APP_A}/@external/") for nid in external) def test_a_graph_that_homed_no_external_answers_an_empty_map(monkeypatch): @@ -727,7 +753,9 @@ def test_a_module_row_that_is_not_a_type_is_refused_by_the_model(): from cldk.analysis.java.neo4j import reconstruct as R with pytest.raises(ValidationError) as e: - R.type_({"id": "can://app_a/java/x/Y.java/Y", "name": "Y", "kind": "widget"}, decorators=[], fields={}, callables={}, types={}, enum_constants=[], record_components=[]) + R.type_( + {"id": "can://app_a/app_a/java/x/Y.java/Y", "name": "Y", "kind": "widget"}, decorators=[], fields={}, callables={}, types={}, enum_constants=[], record_components=[] + ) assert "kind" in str(e.value) and "can://" not in str(e.value) @@ -1015,7 +1043,17 @@ def test_the_audit_sees_every_inline_statement_too(): inline = _inline_statements() assert len(inline) == source.count("self._run("), "a statement site the harvester did not see" assert [name for name, s in inline.items() if "{…}" in s] == [], "a statement the harvester could not reassemble" - for expected in ("_probe_schema", "_load_modules", "_subtree_rows", "_call_site_rows", "_import_rows", "_call_edge_rows", "_external_rows", "_artifact_rows", "_dependency_rows"): + for expected in ( + "_probe_schema", + "_load_modules", + "_subtree_rows", + "_call_site_rows", + "_import_rows", + "_call_edge_rows", + "_external_rows", + "_artifact_rows", + "_dependency_rows", + ): assert any(name.startswith(expected + "@") for name in inline), f"{expected}'s statement is not harvested" diff --git a/tests/analysis/java/test_java_public_surface.py b/tests/analysis/java/test_java_public_surface.py index ec80182..50b7804 100644 --- a/tests/analysis/java/test_java_public_surface.py +++ b/tests/analysis/java/test_java_public_surface.py @@ -43,6 +43,8 @@ import pytest +from cldk.analysis.commons.backend_config import cache_subdir +from cldk.analysis.commons.identity import resolve_identity from cldk.analysis.java.java_analysis import JavaAnalysis SURFACE = { @@ -147,7 +149,9 @@ } #: J-10: the 1.x constructor minus ``source_code``; everything else in place. -CONSTRUCTOR = "(self, project_dir: 'str | Path | None', analysis_level: 'str', target_files: 'List[str] | None', eager_analysis: 'bool', backend: 'JavaBackend | None' = None) -> 'None'" +CONSTRUCTOR = ( + "(self, project_dir: 'str | Path | None', analysis_level: 'str', target_files: 'List[str] | None', eager_analysis: 'bool', backend: 'JavaBackend | None' = None) -> 'None'" +) #: What is left of the 1.x placeholders after #366 implemented six of the eight: the two #: ``get_service_entry_point_*`` accessors, which §4 of the spec proposes **deleting** rather than @@ -196,14 +200,14 @@ def test_placeholder_still_raises_not_implemented(name, test_fixture, analysis_j with patch("cldk.analysis.java.codeanalyzer.codeanalyzer.subprocess.run") as run_mock: run_mock.return_value = MagicMock(stdout=analysis_json, returncode=0) - (tmp_path / "java").mkdir() - (tmp_path / "java" / "analysis.json").write_text(analysis_json, encoding="utf-8") + (cache_subdir(tmp_path, None, "java", identity=resolve_identity("daytrader8", None))).mkdir(parents=True) + (cache_subdir(tmp_path, None, "java", identity=resolve_identity("daytrader8", None)) / "analysis.json").write_text(analysis_json, encoding="utf-8") analysis = JavaAnalysis( project_dir=test_fixture, analysis_level=AnalysisLevel.symbol_table, target_files=None, eager_analysis=False, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="daytrader8", cache_dir=str(tmp_path)), ) params = inspect.signature(getattr(JavaAnalysis, name)).parameters args = [[] if p.annotation in ("List[str]", "dict") else "x" for n, p in params.items() if n != "self" and p.kind is p.POSITIONAL_OR_KEYWORD] diff --git a/tests/analysis/java/test_java_schema_probe.py b/tests/analysis/java/test_java_schema_probe.py index 2753cd1..d1cdd54 100644 --- a/tests/analysis/java/test_java_schema_probe.py +++ b/tests/analysis/java/test_java_schema_probe.py @@ -156,7 +156,7 @@ def test_attach_does_not_reconstruct_the_application(fake_driver): statement rather than two), and the module keys -- the same attach shape the Python and TypeScript backends already have.""" JNeo4jBackend._from_driver(fake_driver, application_name="daytrader8") - assert len(fake_driver.statements) == 4, fake_driver.statements + assert len(fake_driver.statements) == 5, fake_driver.statements assert not any("J_HAS_METHOD" in s for s in fake_driver.statements) diff --git a/tests/analysis/java/test_java_v1_accessors.py b/tests/analysis/java/test_java_v1_accessors.py index 8661b3a..2201e34 100644 --- a/tests/analysis/java/test_java_v1_accessors.py +++ b/tests/analysis/java/test_java_v1_accessors.py @@ -47,6 +47,8 @@ import networkx as nx import pytest +from cldk.analysis.commons.backend_config import cache_subdir +from cldk.analysis.commons.identity import resolve_identity from cldk.analysis import AnalysisLevel from cldk.analysis.commons.backend_config import CodeAnalyzerConfig from cldk.analysis.java.java_analysis import JavaAnalysis @@ -250,14 +252,14 @@ def test_the_two_backends_agree_on_all_six(analysis_json, analysis_json_a4): def _facade(test_fixture, analysis_json, tmp_path) -> JavaAnalysis: with patch("cldk.analysis.java.codeanalyzer.codeanalyzer.subprocess.run") as run_mock: run_mock.return_value = MagicMock(stdout=analysis_json, returncode=0) - (tmp_path / "java").mkdir() - (tmp_path / "java" / "analysis.json").write_text(analysis_json, encoding="utf-8") + (cache_subdir(tmp_path, None, "java", identity=resolve_identity("daytrader8", None))).mkdir(parents=True) + (cache_subdir(tmp_path, None, "java", identity=resolve_identity("daytrader8", None)) / "analysis.json").write_text(analysis_json, encoding="utf-8") return JavaAnalysis( project_dir=test_fixture, analysis_level=AnalysisLevel.symbol_table, target_files=None, eager_analysis=False, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="daytrader8", cache_dir=str(tmp_path)), ) diff --git a/tests/analysis/java/test_java_view_dispatches.py b/tests/analysis/java/test_java_view_dispatches.py index 43e80b5..389e37e 100644 --- a/tests/analysis/java/test_java_view_dispatches.py +++ b/tests/analysis/java/test_java_view_dispatches.py @@ -57,19 +57,26 @@ def _with_layer(payload: str) -> str: doc = json.loads(payload) app = doc["application"] doc["analyzer"]["version"] = "3.3.3" + doc["application"].pop("view_dispatches", None) + doc["application"].pop("view_dispatches_unresolved", None) art = {p: a["id"] for p, a in app["artifacts"].items()} app["view_dispatches"] = sorted( [ {"src": _site(app, "PingServlet2Jsp", "PingServlet2Jsp", "forward"), "dst": art["src/main/webapp/PingServlet2Jsp.jsp"], "via": "forward", "prov": ["literal"]}, {"src": _site(app, "PingJDBCRead2JSP", "PingJDBCRead2JSP", "include"), "dst": art["src/main/webapp/quoteDataPrimitive.jsp"], "via": "include", "prov": ["literal"]}, - {"src": _site(app, "PingServlet2Session2Entity2JSP", "PingServlet2Session2Entity2JSP", "include"), "dst": art["src/main/webapp/quoteDataPrimitive.jsp"], "via": "include", "prov": ["literal"]}, + { + "src": _site(app, "PingServlet2Session2Entity2JSP", "PingServlet2Session2Entity2JSP", "include"), + "dst": art["src/main/webapp/quoteDataPrimitive.jsp"], + "via": "include", + "prov": ["literal"], + }, ], key=lambda d: (d["src"], d["dst"]), ) app["view_dispatches_unresolved"] = [ { "site": _site(app, "PingServlet2Servlet", "PingServlet2Servlet", "forward"), - "callee": "can://java/daytrader8/@external/javax.servlet.RequestDispatcher/forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)", + "callee": "can://daytrader8/daytrader8/@external/javax.servlet.RequestDispatcher/forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)", "target": "/servlet/PingServlet2ServletRcv", "via": "forward", "reason": "no-such-artifact", @@ -94,7 +101,11 @@ def both(request, analysis_json): @pytest.fixture(scope="module", params=["local", "graph"]) def both_before(request, analysis_json): """a1 as committed: codeanalyzer-java 3.1.0, no view-dispatch pass.""" - backend = (_local if request.param == "local" else _graph)(analysis_json) + doc = json.loads(analysis_json) + doc["analyzer"]["version"] = "3.1.0" + doc["application"].pop("view_dispatches", None) + doc["application"].pop("view_dispatches_unresolved", None) + backend = (_local if request.param == "local" else _graph)(json.dumps(doc)) if request.param == "graph": backend._analyzer_version = (3, 1, 0) return backend @@ -103,7 +114,9 @@ def both_before(request, analysis_json): def test_get_view_dispatches_carries_the_edges_and_their_mechanism(both): edges = both.get_view_dispatches() assert len(edges) == 3 and all(isinstance(e, JViewDispatch) for e in edges) - assert [(e.via, tuple(e.prov)) for e in edges] == [("include", ("literal",)), ("include", ("literal",)), ("forward", ("literal",))] or sorted((e.via, tuple(e.prov)) for e in edges) == [("forward", ("literal",)), ("include", ("literal",)), ("include", ("literal",))] + assert [(e.via, tuple(e.prov)) for e in edges] == [("include", ("literal",)), ("include", ("literal",)), ("forward", ("literal",))] or sorted( + (e.via, tuple(e.prov)) for e in edges + ) == [("forward", ("literal",)), ("include", ("literal",)), ("include", ("literal",))] assert all(e.src.startswith(e.src.rpartition("@")[0] + "@") for e in edges), "src is a body-node id" assert {e.dst.rsplit("/", 1)[1] for e in edges} == {"PingServlet2Jsp.jsp", "quoteDataPrimitive.jsp"} assert [(e.src, e.dst) for e in edges] == sorted((e.src, e.dst) for e in edges), "sorted by (src, dst)" @@ -151,6 +164,8 @@ def test_a_payload_without_the_pass_refuses_rather_than_answering_empty(both_bef def test_a_newer_payload_with_no_dispatches_answers_empty(analysis_json): doc = json.loads(analysis_json) doc["analyzer"]["version"] = "3.3.3" + doc["application"].pop("view_dispatches", None) + doc["application"].pop("view_dispatches_unresolved", None) local = _local(json.dumps(doc)) assert local.get_view_dispatches() == [] and local.get_unresolved_view_dispatches() == [] assert local.get_view_dispatchers("x.jsp") == [] diff --git a/tests/analysis/java/test_jcodeanalyzer.py b/tests/analysis/java/test_jcodeanalyzer.py index f65a746..4c78ccb 100644 --- a/tests/analysis/java/test_jcodeanalyzer.py +++ b/tests/analysis/java/test_jcodeanalyzer.py @@ -34,6 +34,8 @@ import pytest import cldk +from cldk.analysis.commons.backend_config import cache_subdir +from cldk.analysis.commons.identity import resolve_identity from cldk.analysis import AnalysisLevel from cldk.analysis.java.backend import CRUD_UNAVAILABLE from cldk.analysis.java.codeanalyzer import JCodeanalyzer @@ -65,6 +67,7 @@ def _analyzer(payload: str, level=AnalysisLevel.symbol_table, project_dir=".", a with patch(_RUN) as run_mock: run_mock.side_effect = _write_output(payload) analyzer = JCodeanalyzer( + application_name=json.loads(payload).get("application", {}).get("application_name", "daytrader8"), project_dir=project_dir, analysis_json_path=analysis_json_path, analysis_level=level, @@ -77,7 +80,9 @@ def _analyzer(payload: str, level=AnalysisLevel.symbol_table, project_dir=".", a # -----[ driving the analyzer ]----- -@pytest.mark.parametrize("level, a", [(AnalysisLevel.symbol_table, "1"), (AnalysisLevel.call_graph, "2"), (AnalysisLevel.program_dependency_graph, "3"), (AnalysisLevel.system_dependency_graph, "4")]) +@pytest.mark.parametrize( + "level, a", [(AnalysisLevel.symbol_table, "1"), (AnalysisLevel.call_graph, "2"), (AnalysisLevel.program_dependency_graph, "3"), (AnalysisLevel.system_dependency_graph, "4")] +) def test_argv_is_the_analyzer_command_line(test_fixture, analysis_json, tmp_path, level, a): """``-a`` carries the requested level (3 and 4 are new to Java); ``-o``/``-c``/``-v`` only with a cache dir; ``--app-name`` is the project directory's name, which the analyzer stamps into every @@ -85,14 +90,30 @@ def test_argv_is_the_analyzer_command_line(test_fixture, analysis_json, tmp_path analyzer, run_mock = _analyzer(analysis_json, level=level, project_dir=test_fixture, analysis_json_path=tmp_path, target_files=["a.java", "b.java"]) argv = run_mock.call_args[0][0] assert argv[:3] == codeanalyzer_java.command() - assert argv[3:] == ["-i", str(test_fixture), "-a", a, "-o", str(tmp_path), "-c", str(tmp_path / "cache"), "-v", "--app-name", test_fixture.name, "-t", "a.java", "-t", "b.java"] + assert argv[3:] == [ + "-i", + str(test_fixture), + "-a", + a, + "-o", + str(tmp_path), + "-c", + str(tmp_path / "cache"), + "-v", + "--app-name=daytrader8", + "--namespace=daytrader8", + "-t", + "a.java", + "-t", + "b.java", + ] assert isinstance(analyzer.application, JApplication) def test_pipe_mode_has_no_output_or_cache_flags(test_fixture, analysis_json): _, run_mock = _analyzer(analysis_json, project_dir=test_fixture) argv = run_mock.call_args[0][0] - assert argv[3:] == ["-i", str(test_fixture), "-a", "1", "--app-name", test_fixture.name] + assert argv[3:] == ["-i", str(test_fixture), "-a", "1", "--app-name=daytrader8", "--namespace=daytrader8"] def test_unknown_level_raises_instead_of_defaulting(test_fixture, analysis_json): @@ -103,10 +124,10 @@ def test_unknown_level_raises_instead_of_defaulting(test_fixture, analysis_json) def test_envelope_and_application_are_kept(test_fixture, analysis_json): analyzer, _ = _analyzer(analysis_json, project_dir=test_fixture) assert analyzer.analysis.schema_version == "2.0.0" - assert analyzer.analysis.analyzer.version == "3.1.0" + assert analyzer.analysis.analyzer.version == "3.3.4" assert analyzer.analysis.max_level == 1 assert analyzer.application is analyzer.analysis.application - assert analyzer.application.id == "can://java/daytrader8" + assert analyzer.application.id == "can://daytrader8/daytrader8" def test_cached_analysis_is_reused(test_fixture, analysis_json, tmp_path): @@ -216,7 +237,9 @@ def test_call_graph_is_empty_below_level_2(analysis_json): def test_unhomed_call_graph_endpoint_raises_naming_it(analysis_json_a4): payload = json.loads(analysis_json_a4) - payload["application"]["call_graph"].append({"src": "can://java/daytrader8/nowhere/X.java/X/m()", "dst": payload["application"]["call_graph"][0]["dst"], "prov": ["declared"], "weight": 1}) + payload["application"]["call_graph"].append( + {"src": "can://daytrader8/daytrader8/java/nowhere/X.java/X/m()", "dst": payload["application"]["call_graph"][0]["dst"], "prov": ["declared"], "weight": 1} + ) analyzer, _ = _analyzer(json.dumps(payload), level=AnalysisLevel.call_graph) with pytest.raises(CodeanalyzerExecutionException, match=re.escape("call-graph endpoint 'm()' in 'nowhere/X.java'")) as e: analyzer.get_call_graph() @@ -308,14 +331,16 @@ def test_get_all_classes_is_keyed_by_qualified_name_including_nested_and_local(a assert all(isinstance(t, JType) for t in classes.values()) assert TRADE_DIRECT in classes assert "com.ibm.websphere.samples.daytrader.impl.ejb3.TradeSLSBBean.quotePriceComparator" in classes - assert "com.ibm.websphere.samples.daytrader.web.prims.PingManagedExecutor.doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse).$anon$0" in classes + assert ( + "com.ibm.websphere.samples.daytrader.web.prims.PingManagedExecutor.doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse).$anon$0" in classes + ) def _local_class_collision_payload() -> dict: """Two sibling callables of one type, each declaring an anonymous class the analyzer numbers ``$anon$0``. Hand-built, so the shape is catchable with no analyzer and no graph: on ThingsBoard it is 97 colliding names shadowing 381 of 5,102 type declarations.""" - module = "can://java/app/src/main/java/p/Outer.java" + module = "can://app/app/java/src/main/java/p/Outer.java" span = lambda a, b: {"start": [a, 1], "end": [b, 1], "bytes": [0, 0]} def method(signature: str) -> dict: @@ -329,12 +354,15 @@ def method(signature: str) -> dict: } return { + "identity_version": 2, "schema_version": "2.0.0", "language": "java", "max_level": 1, "analyzer": {"name": "codeanalyzer-java", "version": "3.0.1"}, "application": { - "id": "can://java/app", + "id": "can://app/app", + "application_name": "app", + "identity_namespace": "app", "kind": "application", "symbol_table": { "src/main/java/p/Outer.java": { @@ -368,7 +396,7 @@ def test_a_local_class_is_keyed_by_its_declaring_callable_on_both_backends(): analyzer, _ = _analyzer(json.dumps(payload)) assert set(analyzer.get_all_classes()) == expected - assert analyzer.get_class("p.Outer.one().$anon$0").id == "can://java/app/src/main/java/p/Outer.java/Outer/one()/$anon$0" + assert analyzer.get_class("p.Outer.one().$anon$0").id == "can://app/app/java/src/main/java/p/Outer.java/Outer/one()/$anon$0" assert analyzer.get_class("p.Outer.one().$anon$0").is_local_class neo = JNeo4jBackend.__new__(JNeo4jBackend) @@ -389,7 +417,12 @@ def test_get_method_and_parameters(analysis_json): sig = "publishQuotePriceChange(com.ibm.websphere.samples.daytrader.entities.QuoteDataBean, java.math.BigDecimal, java.math.BigDecimal, double)" method = analyzer.get_method(TRADE_DIRECT, sig) assert isinstance(method, JCallable) and method.signature == sig - assert [p.type for p in analyzer.get_method_parameters(TRADE_DIRECT, sig)] == ["com.ibm.websphere.samples.daytrader.entities.QuoteDataBean", "java.math.BigDecimal", "java.math.BigDecimal", "double"] + assert [p.type for p in analyzer.get_method_parameters(TRADE_DIRECT, sig)] == [ + "com.ibm.websphere.samples.daytrader.entities.QuoteDataBean", + "java.math.BigDecimal", + "java.math.BigDecimal", + "double", + ] assert analyzer.get_method(TRADE_DIRECT, "noSuchMethod()") is None assert analyzer.get_method_parameters(TRADE_DIRECT, "noSuchMethod()") == [] @@ -443,7 +476,9 @@ def test_get_all_nested_classes(analysis_json): def test_get_extended_classes_and_implemented_interfaces(analysis_json): analyzer, _ = _analyzer(analysis_json) - assert analyzer.get_extended_classes("com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral") == ["javax.enterprise.util.AnnotationLiteral"] + assert analyzer.get_extended_classes("com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral") == [ + "javax.enterprise.util.AnnotationLiteral" + ] assert analyzer.get_extended_classes("com.ibm.websphere.samples.daytrader.entities.HoldingDataBean") == [] assert set(analyzer.get_implemented_interfaces(TRADE_DIRECT)) == {"com.ibm.websphere.samples.daytrader.interfaces.TradeServices", "java.io.Serializable"} assert analyzer.get_implemented_interfaces("com.ibm.websphere.samples.daytrader.util.TradeConfig") == [] @@ -486,7 +521,7 @@ def test_artifact_layer_returns_the_shared_models(analysis_json_a4): analyzer, _ = _analyzer(analysis_json_a4) artifacts = analyzer.get_artifacts() assert len(artifacts) == 235 and all(isinstance(a, PyArtifact) for a in artifacts.values()) - assert artifacts["pom.xml"].id == "can://artifact/daytrader8/pom.xml" and len(artifacts["pom.xml"].config_keys) == 54 + assert artifacts["pom.xml"].id == "can://daytrader8/daytrader8/artifact/pom.xml" and len(artifacts["pom.xml"].config_keys) == 54 keys = analyzer.get_config_keys() key = keys["pom.xml@key/project.artifactId"] assert isinstance(key, PyConfigKey) and key.value == "io.openliberty.sample.daytrader8" and key.namespace == "xml" @@ -494,15 +529,15 @@ def test_artifact_layer_returns_the_shared_models(analysis_json_a4): # ``--app-name ``, so an id key would differ from the same corpus's key # in a graph emitted under another name. And a ``can://`` id has no place in a public dict key. assert all("can://" not in k for k in keys) - assert key.id == "can://artifact/daytrader8/pom.xml@key/project.artifactId" + assert key.id == "can://daytrader8/daytrader8/artifact/pom.xml@key/project.artifactId" assert set(keys) == {f"{path}@key/{ck.key}" for path, a in analyzer.application.artifacts.items() for ck in a.config_keys} deps = analyzer.get_dependencies() assert [d.name for d in deps] == ["derby", "javaee-api", "jaxb-api", "standard"] - assert all(isinstance(d, PyDependency) and d.ecosystem == "maven" and d.declared_in == "can://artifact/daytrader8/pom.xml" for d in deps) + assert all(isinstance(d, PyDependency) and d.ecosystem == "maven" and d.declared_in == "can://daytrader8/daytrader8/artifact/pom.xml" for d in deps) assert len(analyzer.get_dependencies(direct_only=True)) == 4 assert analyzer.get_dependencies(ecosystem="npm") == [] - assert [d.name for d in analyzer.get_dependencies(declared_in="can://artifact/daytrader8/pom.xml")] == ["derby", "javaee-api", "jaxb-api", "standard"] - assert analyzer.get_dependencies(declared_in="can://artifact/daytrader8/nothing") == [] + assert [d.name for d in analyzer.get_dependencies(declared_in="can://daytrader8/daytrader8/artifact/pom.xml")] == ["derby", "javaee-api", "jaxb-api", "standard"] + assert analyzer.get_dependencies(declared_in="can://daytrader8/daytrader8/artifact/nothing") == [] assert analyzer.get_config_uses() == [] and analyzer.get_config_uses(key="project.artifactId") == [] assert analyzer.get_unresolved_config_reads() == [] @@ -533,8 +568,8 @@ def test_facade_reuses_language_keyed_cache(analysis_json_fixture, tmp_path): from cldk import CLDK from cldk.analysis.commons.backend_config import CodeAnalyzerConfig - keyed = tmp_path / "java" - keyed.mkdir() + keyed = cache_subdir(tmp_path, None, "java", identity=resolve_identity("daytrader8", None)) + keyed.mkdir(parents=True) with gzip.open(Path(analysis_json_fixture) / "analysis.json.gz", "rb") as src, open(keyed / "analysis.json", "wb") as dst: shutil.copyfileobj(src, dst) with patch(_RUN) as run_mock: @@ -542,7 +577,7 @@ def test_facade_reuses_language_keyed_cache(analysis_json_fixture, tmp_path): project_path=analysis_json_fixture, eager=False, analysis_level=AnalysisLevel.symbol_table, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="daytrader8", cache_dir=str(tmp_path)), ) assert not run_mock.called assert len(analysis.get_symbol_table()) == 138 diff --git a/tests/analysis/python/conftest.py b/tests/analysis/python/conftest.py index 7cdfc75..562c1a1 100644 --- a/tests/analysis/python/conftest.py +++ b/tests/analysis/python/conftest.py @@ -126,6 +126,12 @@ def run(self, query: str, **params: Any) -> list[_FakeRecord]: return [_FakeRecord({"relationshipType": rt}) for rt in self._driver.rel_types] if "RETURN a.analyzer_version AS v" in query: return [] if self._driver.analyzer_version is None else [_FakeRecord({"v": self._driver.analyzer_version})] + if "AS identity" in query: + from urllib.parse import unquote + + app_id = params["app_id"] + namespace, name = app_id.removeprefix("can://").split("/") + return [_FakeRecord({"identity": dict(id=app_id, identity_version=2, application_name=unquote(name), identity_namespace=unquote(namespace))})] if self._driver.responder is not None: return [_FakeRecord(d) for d in self._driver.responder(query, params)] return [] @@ -444,7 +450,7 @@ def _locate_callable_id(signature: str) -> str: """A stand-in for the analyzer's ``can://`` id. Only its shape matters here: a body node's graph ``id`` is ``@``, which is what the Neo4j backend's innermost-node tie break splits on.""" - return f"can://app/python/{_LOCATE_MODULE_PATH}/{signature}" + return f"can://app/app/python/{_LOCATE_MODULE_PATH}/{signature}" # -----[ the local backend's view: a real in-memory PyApplication ]----- @@ -582,7 +588,7 @@ def _locate_responder(query: str, params: dict) -> list[dict]: """ in_scope = "prefix" in params and _locate_callable_id("").startswith(params["prefix"]) # get_method_bodies / get_source if "RETURN m.file_key AS k" in query: - return [{"k": _LOCATE_MODULE_PATH}] + return [{"k": _LOCATE_MODULE_PATH, "id": f"can://app/app/python/{_LOCATE_MODULE_PATH}"}] if "c.code IS NOT NULL" in query: # get_method_bodies (bulk, "c.signature IN $sigs") and get_source (single, "c.signature = # $sig") both gate on $prefix and on a real code property -- a bodyless callable (has_span @@ -638,6 +644,9 @@ def py_local(tmp_path) -> PyCodeanalyzer: backend knows and the Neo4j backend cannot. """ backend = object.__new__(PyCodeanalyzer) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("app", None) backend.application = _locate_application() backend.project_dir = tmp_path return backend diff --git a/tests/analysis/python/test_artifacts.py b/tests/analysis/python/test_artifacts.py index aec228c..7fe025c 100644 --- a/tests/analysis/python/test_artifacts.py +++ b/tests/analysis/python/test_artifacts.py @@ -57,7 +57,7 @@ # -----[ shared identifiers -- both renderings below are built from these, not re-typed ]----- _APP = "app" -_ART1_ID = f"can://{_APP}/artifact/pyproject.toml" +_ART1_ID = f"can://{_APP}/{_APP}/artifact/pyproject.toml" _ART1_PATH = "pyproject.toml" _ART1_FORMAT = "toml" _ART1_ROLES = ["dependency-manifest"] @@ -65,7 +65,7 @@ _ART1_SHA = "aaa111" _ART1_SOURCE = '[project]\nname = "app"\ndependencies = ["flask>=2.0,<3"]\n' -_ART2_ID = f"can://{_APP}/artifact/.env" +_ART2_ID = f"can://{_APP}/{_APP}/artifact/.env" _ART2_PATH = ".env" _ART2_FORMAT = "properties" _ART2_ROLES = ["config"] @@ -192,7 +192,7 @@ def py_local() -> PyCodeanalyzer: "signature": "src.db.connect", "name": "connect", "decorators": [], - "id": f"can://{_APP}/python/{_MODULE_PATH}/connect", # what get_config_readers projects; path is derived + "id": f"can://{_APP}/{_APP}/python/{_MODULE_PATH}/connect", # what get_config_readers projects; path is derived "start_line": 5, "end_line": 11, "class_signature": None, @@ -210,7 +210,7 @@ def _artifacts_responder(query: str, params: dict) -> list[dict[str, Any]]: """Answers the four Cypher statements ``PyNeo4jBackend`` sends for this layer, plus ``_load_module_keys`` (construction always calls it).""" if "RETURN m.file_key AS k" in query: - return [{"k": _MODULE_PATH}] + return [{"k": _MODULE_PATH, "id": f"can://app/app/python/{_MODULE_PATH}"}] if "collect(properties(ck))" in query: # get_artifacts return [ {"p": _ART1_PROPS, "cks": []}, @@ -284,7 +284,7 @@ def test_dependency_ecosystem_is_read_off_the_package_node(fake_driver): def responder(query: str, params: dict) -> list[dict[str, Any]]: if "RETURN m.file_key AS k" in query: - return [{"k": _MODULE_PATH}] + return [{"k": _MODULE_PATH, "id": f"can://app/app/python/{_MODULE_PATH}"}] if "DECLARES_DEPENDENCY" in query: return [{"rel": _DEP_REL_PROPS, "name": _DEP_NAME, "ecosystem": "conda-forge", "declared_in": _ART1_ID}] return [] @@ -301,8 +301,13 @@ def test_dependencies_direct_only_filters_out_transitive_pins(fake_driver): filter.""" transitive = PyDependency(name="click", ecosystem="pypi", declared_in=_ART1_ID, direct=False) direct = PyDependency( - name=_DEP_NAME, ecosystem=_DEP_ECOSYSTEM, spec=_DEP_SPEC, kind=_DEP_KIND, declared_in=_ART1_ID, - direct=True, prov=list(_DEP_PROV), + name=_DEP_NAME, + ecosystem=_DEP_ECOSYSTEM, + spec=_DEP_SPEC, + kind=_DEP_KIND, + declared_in=_ART1_ID, + direct=True, + prov=list(_DEP_PROV), ) local = object.__new__(PyCodeanalyzer) local.application = PyApplication(symbol_table={}, dependencies=[direct, transitive]) @@ -311,7 +316,7 @@ def test_dependencies_direct_only_filters_out_transitive_pins(fake_driver): def responder(query: str, params: dict) -> list[dict[str, Any]]: if "RETURN m.file_key AS k" in query: - return [{"k": _MODULE_PATH}] + return [{"k": _MODULE_PATH, "id": f"can://app/app/python/{_MODULE_PATH}"}] if "DECLARES_DEPENDENCY" in query: assert "r.direct = true" in query # the filter must run in Cypher, not in Python return [{"rel": _DEP_REL_PROPS, "name": _DEP_NAME, "ecosystem": _DEP_ECOSYSTEM, "declared_in": _ART1_ID}] @@ -335,7 +340,7 @@ def test_dependencies_ecosystem_filter(py): def test_dependencies_declared_in_filter(py): assert [d.name for d in py.get_dependencies(declared_in=_ART1_ID)] == [_DEP_NAME] - assert py.get_dependencies(declared_in="can://app/artifact/nonexistent.toml") == [] + assert py.get_dependencies(declared_in="can://app/app/artifact/nonexistent.toml") == [] # ===================================================================================== @@ -412,7 +417,7 @@ def test_unresolved_config_reads_over_neo4j_carries_key_and_reason_but_not_site( def test_no_unresolved_config_reads_is_an_empty_list_not_none(fake_driver): def responder(query: str, params: dict) -> list[dict[str, Any]]: if "RETURN m.file_key AS k" in query: - return [{"k": _MODULE_PATH}] + return [{"k": _MODULE_PATH, "id": f"can://app/app/python/{_MODULE_PATH}"}] return [] fake_driver.responder = responder @@ -435,9 +440,11 @@ def test_artifacts_layer_parity_between_backends(py_local, py_neo4j): assert py_local.get_config_uses(key=_CONFIG_KEY_KEY) == py_neo4j.get_config_uses(key=_CONFIG_KEY_KEY) # Path included: this projection also returns PyCallableOverview, so it has to speak the same # repo-relative path vocabulary as every other overview accessor -- on both backends. - assert [(r.signature, r.path) for r in py_local.get_config_readers(_CONFIG_KEY_KEY)] == [ - (r.signature, r.path) for r in py_neo4j.get_config_readers(_CONFIG_KEY_KEY) - ] == [("src.db.connect", _MODULE_PATH)] + assert ( + [(r.signature, r.path) for r in py_local.get_config_readers(_CONFIG_KEY_KEY)] + == [(r.signature, r.path) for r in py_neo4j.get_config_readers(_CONFIG_KEY_KEY)] + == [("src.db.connect", _MODULE_PATH)] + ) # Deliberately not full equality: the Neo4j reconstruction always has site="" (see # reconstruct.unresolved_config_read's docstring) while the local backend has a real one -- # documented projection loss, not a bug. key/reason/callee/prov still agree exactly. diff --git a/tests/analysis/python/test_bodies.py b/tests/analysis/python/test_bodies.py index f06d994..2b46c57 100644 --- a/tests/analysis/python/test_bodies.py +++ b/tests/analysis/python/test_bodies.py @@ -86,7 +86,7 @@ def test_get_source_of_a_body_node_local(py_local): ``signature`` produced a string that named nothing in the graph. """ r = py_local.locate("src/app.py", 11) - assert r.node_id == "can://app/python/src/app.py/src.app.Store.Meta.tag@11:12" + assert r.node_id == "can://app/app/python/src/app.py/src.app.Store.Meta.tag@11:12" assert py_local.get_source(r.node_id) == _locate_code(11, 11) assert "café" in py_local.get_source(r.node_id) diff --git a/tests/analysis/python/test_entrypoints.py b/tests/analysis/python/test_entrypoints.py index 744bbdd..39d9b97 100644 --- a/tests/analysis/python/test_entrypoints.py +++ b/tests/analysis/python/test_entrypoints.py @@ -92,7 +92,7 @@ def test_entrypoints_are_a_subset_of_callables_locally(): def test_no_entrypoints_is_an_empty_list_not_none(): - """"This project has no entrypoints" must be a real, distinguishable empty -- not a null.""" + """ "This project has no entrypoints" must be a real, distinguishable empty -- not a null.""" result = _local_backend(any_entrypoints=False).get_entrypoints() assert result == [] @@ -101,9 +101,13 @@ def test_no_entrypoints_is_an_empty_list_not_none(): def _neo4j_backend(modules=("svc/app.py",)) -> PyNeo4jBackend: """A ``PyNeo4jBackend`` with ``__init__`` (and its real driver connection) bypassed.""" backend = object.__new__(PyNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("app", None) backend.application_name = "app" backend._database = None backend._modules = list(modules) + backend._module_ids = {key: backend.identity.application_id + "/python/" + key for key in backend._modules} return backend @@ -122,7 +126,7 @@ def test_entrypoints_query_filters_on_is_entrypoint_property(): "signature": "svc.app.handler", "name": "handler", "decorators": [], - "id": "can://app/python/svc/app.py/handler", + "id": "can://app/app/python/svc/app.py/handler", "start_line": 1, "end_line": 2, "class_signature": None, @@ -148,8 +152,8 @@ def test_entrypoints_parity_between_backends(): local_sigs = {o.signature for o in _local_backend().get_entrypoints()} common = {"decorators": [], "start_line": 1, "end_line": 2} - row_handler = {"signature": "svc.app.handler", "name": "handler", "id": "can://app/python/svc/app.py/handler", "class_signature": None, **common} - row_run = {"signature": "svc.app.Service.run", "name": "run", "id": "can://app/python/svc/app.py/Service/run", "class_signature": "svc.app.Service", **common} + row_handler = {"signature": "svc.app.handler", "name": "handler", "id": "can://app/app/python/svc/app.py/handler", "class_signature": None, **common} + row_run = {"signature": "svc.app.Service.run", "name": "run", "id": "can://app/app/python/svc/app.py/Service/run", "class_signature": "svc.app.Service", **common} backend = _neo4j_backend() with patch.object(PyNeo4jBackend, "_run", side_effect=_run_keyed({"c.is_entrypoint = true": [row_handler, row_run]})): neo4j_sigs = {o.signature for o in backend.get_entrypoints()} @@ -163,12 +167,8 @@ def test_entrypoints_parity_between_backends(): def _local_backend_with_class_entrypoint() -> PyCodeanalyzer: """A class-based view marked ``is_entrypoint`` at the class itself, with only an *unmarked* method -- exactly the case ``get_entrypoints()`` (callables-only) is blind to.""" - dispatch = PyCallable( - name="dispatch", path="svc/views.py", signature="svc.views.AdminView.dispatch", is_entrypoint=False - ) - admin_view = PyClass( - name="AdminView", signature="svc.views.AdminView", callables={"dispatch": dispatch}, is_entrypoint=True - ) + dispatch = PyCallable(name="dispatch", path="svc/views.py", signature="svc.views.AdminView.dispatch", is_entrypoint=False) + admin_view = PyClass(name="AdminView", signature="svc.views.AdminView", callables={"dispatch": dispatch}, is_entrypoint=True) module = PyModule(file_path="svc/views.py", module_name="svc.views", types={"svc.views.AdminView": admin_view}) backend = object.__new__(PyCodeanalyzer) backend.application = PyApplication(symbol_table={"svc/views.py": module}) @@ -202,7 +202,7 @@ def test_entrypoint_classes_query_filters_on_is_entrypoint_property(): "signature": "svc.views.AdminView", "name": "AdminView", "decorators": [], - "id": "can://app/python/svc/views.py/AdminView", + "id": "can://app/app/python/svc/views.py/AdminView", "start_line": 1, "end_line": 10, } @@ -229,7 +229,7 @@ def test_entrypoint_classes_parity_between_backends(): "signature": "svc.views.AdminView", "name": "AdminView", "decorators": [], - "id": "can://app/python/svc/views.py/AdminView", + "id": "can://app/app/python/svc/views.py/AdminView", "start_line": 1, "end_line": 10, } diff --git a/tests/analysis/python/test_external_symbols.py b/tests/analysis/python/test_external_symbols.py index c38c1a6..4e1731b 100644 --- a/tests/analysis/python/test_external_symbols.py +++ b/tests/analysis/python/test_external_symbols.py @@ -175,9 +175,13 @@ def _neo4j_backend(modules=("src/app.py",)) -> PyNeo4jBackend: """A ``PyNeo4jBackend`` with ``__init__`` (and its real driver connection) bypassed -- same construction ``test_entrypoints.py`` uses.""" backend = object.__new__(PyNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("app", None) backend.application_name = "app" backend._database = None backend._modules = list(modules) + backend._module_ids = {key: backend.identity.application_id + "/python/" + key for key in backend._modules} return backend @@ -239,7 +243,7 @@ def test_neo4j_get_external_symbols_filters_by_id_prefix(): assert ext[VALUEERROR_ID].module == "builtins.ValueError" query, params = run.call_args.args[0], run.call_args.kwargs assert "e.id STARTS WITH $prefix" in query - assert params["prefix"] == "can://app/@external/" + assert params["prefix"] == "can://app/app/@external/" assert "SET" not in query and "CREATE" not in query and "MERGE" not in query and "DELETE" not in query @@ -267,11 +271,15 @@ def test_callsites_for_parity_between_backends(): neo4j = backend.get_callsites_for(["src.app.Store.key", "src.app.Store.helper", "src.app.Store.dyn"]) neo4j_sigs = {sig: [s.callee_signature for s in sites] for sig, sites in neo4j.items()} - assert local_sigs == neo4j_sigs == { - "src.app.Store.key": [VALUEERROR_ID], - "src.app.Store.helper": ["src.app.Store.key"], - "src.app.Store.dyn": [None], - } + assert ( + local_sigs + == neo4j_sigs + == { + "src.app.Store.key": [VALUEERROR_ID], + "src.app.Store.helper": ["src.app.Store.key"], + "src.app.Store.dyn": [None], + } + ) def test_get_external_symbols_parity_between_backends(): diff --git a/tests/analysis/python/test_locate.py b/tests/analysis/python/test_locate.py index ab1fa24..41b1f99 100644 --- a/tests/analysis/python/test_locate.py +++ b/tests/analysis/python/test_locate.py @@ -283,15 +283,21 @@ def test_locate_and_resolve_seek_the_pysymbol_index(py, fake_driver): def test_locate_scope_is_actually_honoured(py): """Not just present in the text: attach as another application and no callable matches.""" - py.application_name = "some_other_application" + from cldk.analysis.commons.identity import resolve_identity + + py.identity = resolve_identity("some_other_application", None) + py.application_name = py.identity.application_name + py._module_ids = {key: py.identity.application_id + "/python/" + key for key in py._modules} r = py.locate("src/app.py", 21) assert r.callable is None assert "module_scope" in [d.code for d in r.diagnostics] -def test_locate_normalises_the_path(py_either): +def test_locate_normalises_the_path(py_either, tmp_path): """A scanner prints ``./src/app.py`` or an absolute path; neither is the symbol-table key.""" - for path in ("./src/app.py", "src/./app.py", "/home/ci/checkout/src/app.py"): + py_either.source_root = tmp_path + py_either.project_dir = tmp_path + for path in ("./src/app.py", "src/./app.py", str(tmp_path / "src/app.py")): r = py_either.locate(path, 21) assert r.callable is not None, path assert r.callable.signature == "src.app.Store.key" diff --git a/tests/analysis/python/test_module_key_of.py b/tests/analysis/python/test_module_key_of.py index 921114e..e108048 100644 --- a/tests/analysis/python/test_module_key_of.py +++ b/tests/analysis/python/test_module_key_of.py @@ -21,7 +21,7 @@ from cldk.analysis.python.neo4j.reconstruct import module_key_of -APP = "can://app/python/" +APP = "can://app/app/python/" def test_module_key_is_the_id_segment_up_to_the_first_py_boundary(): @@ -32,17 +32,17 @@ def test_module_key_is_the_id_segment_up_to_the_first_py_boundary(): def test_a_directory_named_like_a_module_cannot_mis_key(): known = {"pkg/x.py/real.py"} - assert module_key_of("can://app/python/pkg/x.py/real.py/f()", APP, known) == "pkg/x.py/real.py" + assert module_key_of("can://app/app/python/pkg/x.py/real.py/f()", APP, known) == "pkg/x.py/real.py" def test_a_key_outside_the_application_raises_rather_than_guesses(): with pytest.raises(KeyError): - module_key_of("can://app/python/gone.py/f()", APP, {"kept.py"}) + module_key_of("can://app/app/python/gone.py/f()", APP, {"kept.py"}) def test_a_ghost_id_has_no_module_key(): with pytest.raises(KeyError): - module_key_of("can://app/@external/os/path", APP, {"a.py"}) + module_key_of("can://app/app/@external/os/path", APP, {"a.py"}) def test_a_body_node_id_keys_to_its_callables_module(): @@ -50,11 +50,11 @@ def test_a_body_node_id_keys_to_its_callables_module(): ``/`` (``@15:2/actual_in:0``); the module key is still the verified prefix, so a slice row can derive its file from the body node's own ``ref``.""" known = {"pkg/a.py", "pkg"} - assert module_key_of("can://app/python/pkg/a.py/f(x)@15:2/actual_in:0", APP, known) == "pkg/a.py" + assert module_key_of("can://app/app/python/pkg/a.py/f(x)@15:2/actual_in:0", APP, known) == "pkg/a.py" def test_the_module_id_itself_keys_to_its_own_key(): - assert module_key_of("can://app/python/pkg/a.py", APP, {"pkg/a.py"}) == "pkg/a.py" + assert module_key_of("can://app/app/python/pkg/a.py", APP, {"pkg/a.py"}) == "pkg/a.py" def test_an_id_under_another_application_raises(): @@ -77,11 +77,11 @@ def test_a_module_added_since_attach_is_found_after_one_reload_and_a_foreign_id_ """A re-emit can add a module after attach; its callables must not take down a whole-application answer. One miss reloads the key set once and retries. A second miss is a real defect, raised as an SDK exception that names the key count and never the ``can://`` id (E6).""" - graph = {"modules": ["a.py"], "callables": ["can://app/python/a.py/f"]} + graph = {"modules": ["a.py"], "callables": ["can://app/app/python/a.py/f"]} def responder(query, params): if "RETURN m.file_key AS k" in query: - return [{"k": k} for k in graph["modules"]] + return [{"k": k, "id": f"can://app/app/python/{k}"} for k in graph["modules"]] if "OPTIONAL MATCH (owner:PyClass)-[:PY_HAS_METHOD]->(c)" in query: return [_overview_row(i) for i in graph["callables"]] return [] @@ -92,14 +92,13 @@ def responder(query, params): assert loads() == 1 graph["modules"].append("b.py") # the graph moved under us - graph["callables"].append("can://app/python/b.py/g") + graph["callables"].append("can://app/app/python/b.py/g") assert {o.path for o in backend.get_callables_overview()} == {"a.py", "b.py"} assert loads() == 2, "one reload, on the first miss" - graph["callables"].append("can://app/python/zzz.py/h") # no such module, before or after reload + graph["callables"].append("can://app/app/python/zzz.py/h") # no such module, before or after reload with pytest.raises(CodeanalyzerExecutionException) as e: backend.get_callables_overview() assert loads() == 3 assert "changed since attach" in str(e.value) and "2 module keys" in str(e.value) assert "can://" not in str(e.value) and "zzz" not in str(e.value) - diff --git a/tests/analysis/python/test_neo4j_multi_application_scope.py b/tests/analysis/python/test_neo4j_multi_application_scope.py index e975e40..60d7d41 100644 --- a/tests/analysis/python/test_neo4j_multi_application_scope.py +++ b/tests/analysis/python/test_neo4j_multi_application_scope.py @@ -152,7 +152,7 @@ def _node(module: str, key: str, **props: Any) -> Dict[str, Any]: _SOURCE_NODES: Dict[str, List[Dict[str, Any]]] = { "PyCallable": list(_CHILDREN["class_methods"][1].values()), "PyBodyNode": list(_CHILDREN["callable_callsites"][1].values()), - "PyExternal": [{"id": f"can://{app}/@external/os/path", "name": "path", "module": "os"} for app in (APP_A, APP_B)], + "PyExternal": [{"id": f"can://{app}/{app}/@external/os/path", "name": "path", "module": "os"} for app in (APP_A, APP_B)], } #: The four spellings of the application scope a statement may carry: the whole application @@ -260,11 +260,18 @@ def run(query: str, **params: Any) -> List[Dict[str, Any]]: return _fake_two_app_cypher(query, **params) backend = object.__new__(PyNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity(APP_A, None) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity(APP_A, None) backend.application_name = APP_A backend._database = None backend._driver = None backend._session_obj = None backend._modules = [APP_A_MODULE, SHARED_MODULE] + backend._module_ids = {key: backend.identity.application_id + "/python/" + key for key in backend._modules} backend._call_graph = None backend._run = run return backend @@ -276,7 +283,7 @@ def test_the_fake_graph_carries_no_module_property(): returning nothing on a real graph.""" nodes = [c for _, by_module in _CHILDREN.values() for c in by_module.values()] + _CLASSES + list(_SHARED_FUNCTIONS.values()) assert nodes and not any("_module" in n for n in nodes) - assert all(n["id"].startswith(("can://app_a/python/", "can://app_b/python/")) for n in nodes) + assert all(n["id"].startswith(("can://app_a/app_a/python/", "can://app_b/app_b/python/")) for n in nodes) def test_per_parent_path_does_not_leak_another_applications_children(): @@ -376,11 +383,7 @@ def _class_level_statements() -> Dict[str, str]: """Every class attribute that starts a Cypher clause -- not only ``MATCH``: filtering on that alone silently skipped ``_OVERVIEW_PROJECTION`` (``OPTIONAL MATCH``) and ``_LOCATE_QUERY`` (``UNWIND``), and an audit that cannot see a statement cannot protect it.""" - return { - name: value - for name, value in vars(PyNeo4jBackend).items() - if isinstance(value, str) and re.match(r"(MATCH|OPTIONAL MATCH|UNWIND|CALL)\b", value.lstrip()) - } + return {name: value for name, value in vars(PyNeo4jBackend).items() if isinstance(value, str) and re.match(r"(MATCH|OPTIONAL MATCH|UNWIND|CALL)\b", value.lstrip())} def _inline_statements() -> Dict[str, str]: @@ -427,7 +430,14 @@ def text(e: ast.expr, depth: int = 0) -> str: return "{…}" for call in ast.walk(fn): - if isinstance(call, ast.Call) and isinstance(call.func, ast.Attribute) and call.func.attr == "_run" and isinstance(call.func.value, ast.Name) and call.func.value.id == "self" and call.args: + if ( + isinstance(call, ast.Call) + and isinstance(call.func, ast.Attribute) + and call.func.attr == "_run" + and isinstance(call.func.value, ast.Name) + and call.func.value.id == "self" + and call.args + ): out.setdefault(f"{fn.name}@{call.lineno}", text(call.args[0])) return out @@ -460,7 +470,23 @@ def _every_statement() -> Dict[str, str]: def test_the_audit_sees_the_dataflow_statements_too(): names = set(_class_level_statements()) - for expected in ("_REACHES", "_CONE", "_PATHS", "_CALL_PATHS", "_TAINT", "_EDGE_VARS", "_VALUE_REACHES", "_CALLEE_VALUES", "_SOURCES", "_SLICE", "_CALLERS", "_CALLEES", "_OWN_EDGES", "_LOCATE_QUERY", "_OVERVIEW_PROJECTION"): + for expected in ( + "_REACHES", + "_CONE", + "_PATHS", + "_CALL_PATHS", + "_TAINT", + "_EDGE_VARS", + "_VALUE_REACHES", + "_CALLEE_VALUES", + "_SOURCES", + "_SLICE", + "_CALLERS", + "_CALLEES", + "_OWN_EDGES", + "_LOCATE_QUERY", + "_OVERVIEW_PROJECTION", + ): assert expected in names, f"{expected} is not a class-level statement any more; move it back or extend the audit" @@ -473,7 +499,25 @@ def test_the_audit_sees_every_inline_statement_too(): indirect = sorted(name.split("@")[0] for name, s in inline.items() if s == "{…}") assert indirect == ["_children", "_collect", "_paths"], f"unjudged statements passed through a variable: {indirect}" assert all(re.match(r"(MATCH|OPTIONAL MATCH|UNWIND|CALL)\b", s.lstrip()) for s in inline.values() if s != "{…}"), "an inline statement does not start with a Cypher clause" - for expected in ("get_source", "get_class", "get_python_file", "get_method_bodies", "resolve_value", "_call_rows", "_bounded_call_rows", "_get_module_functions", "get_callsites_for", "get_config_uses", "get_config_readers", "get_decorated_callables", "get_entrypoints", "get_entrypoint_classes", "_probe_resolution_edges", "_own_edges", "get_dependencies"): + for expected in ( + "get_source", + "get_class", + "get_python_file", + "get_method_bodies", + "resolve_value", + "_call_rows", + "_bounded_call_rows", + "_get_module_functions", + "get_callsites_for", + "get_config_uses", + "get_config_readers", + "get_decorated_callables", + "get_entrypoints", + "get_entrypoint_classes", + "_probe_resolution_edges", + "_own_edges", + "get_dependencies", + ): assert any(name.startswith(expected + "@") for name in inline), f"{expected}'s statement is not harvested" @@ -532,6 +576,5 @@ def test_the_reachability_walk_scopes_all_three_of_its_positions(): for position in ("a", "x", "m"): assert f"{position}.id STARTS WITH $prefix" in statement, f"_REACHES leaves {position!r} unscoped" assert "y.id STARTS WITH $prefix" not in statement, ( - "predicating both hop endpoints checks every interior node twice; measured 623.9s against " - "3.2s on a 5,000-node cyclic graph for the same answer" + "predicating both hop endpoints checks every interior node twice; measured 623.9s against " "3.2s on a 5,000-node cyclic graph for the same answer" ) diff --git a/tests/analysis/python/test_python_analysis.py b/tests/analysis/python/test_python_analysis.py index 3a84f2e..c585f12 100644 --- a/tests/analysis/python/test_python_analysis.py +++ b/tests/analysis/python/test_python_analysis.py @@ -73,8 +73,8 @@ def __init__(self, **kwargs): cache = tmp_path / "mycache" CLDK(language="python").analysis(project_path=tmp_path, cache_dir=cache) - assert captured["cache_dir"].name == "python" - assert captured["cache_dir"].parent.name == "mycache" + assert captured["cache_dir"].parent.name == "python" + assert captured["cache_dir"].parent.parent.name == "mycache" assert "analysis_backend_path" not in captured diff --git a/tests/analysis/python/test_python_method_lookup.py b/tests/analysis/python/test_python_method_lookup.py index 36e00b1..ced4028 100644 --- a/tests/analysis/python/test_python_method_lookup.py +++ b/tests/analysis/python/test_python_method_lookup.py @@ -121,11 +121,15 @@ def _neo4j_backend(): call_edges = [(ENTRY_SIG, HELPER_SIG)] backend = object.__new__(PyNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("test_app", None) backend.application_name = "test_app" backend._database = None backend._driver = None backend._session_obj = None backend._modules = ["pkg/mod.py"] + backend._module_ids = {key: backend.identity.application_id + "/python/" + key for key in backend._modules} backend._call_graph = None backend._run = _fake_cypher(classes={}, methods={}, modules=modules, call_edges=call_edges) return backend @@ -209,11 +213,15 @@ def test_get_all_callees_external_target_survives_as_external_keyed_node_neo4j() call_edges = [(ENTRY_SIG, None, external_id)] backend = object.__new__(PyNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("test_app", None) backend.application_name = "test_app" backend._database = None backend._driver = None backend._session_obj = None backend._modules = ["pkg/mod.py"] + backend._module_ids = {key: backend.identity.application_id + "/python/" + key for key in backend._modules} backend._call_graph = None backend._run = _fake_cypher(classes={}, methods={}, modules=modules, call_edges=call_edges) @@ -260,11 +268,15 @@ def test_get_method_still_resolves_class_methods_neo4j(): greet_props = {"name": "greet", "signature": "pkg.models.Entity.greet", "path": "pkg/models.py"} backend = object.__new__(PyNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("test_app", None) backend.application_name = "test_app" backend._database = None backend._driver = None backend._session_obj = None backend._modules = ["pkg/models.py"] + backend._module_ids = {key: backend.identity.application_id + "/python/" + key for key in backend._modules} backend._call_graph = None backend._run = _fake_cypher( classes={"pkg.models.Entity": entity_props}, diff --git a/tests/analysis/python/test_python_neo4j_selection.py b/tests/analysis/python/test_python_neo4j_selection.py index 5131b1a..4317289 100644 --- a/tests/analysis/python/test_python_neo4j_selection.py +++ b/tests/analysis/python/test_python_neo4j_selection.py @@ -90,7 +90,7 @@ def test_no_config_keys_cache_dir_by_language(tmp_path): ) _, kwargs = backend_cls.call_args - assert kwargs["cache_dir"] == (tmp_path / "cache" / "python") + assert kwargs["cache_dir"].parent == (tmp_path / "cache" / "python") def test_missing_project_dir_without_config_raises(): diff --git a/tests/analysis/python/test_python_taint.py b/tests/analysis/python/test_python_taint.py index 00f9280..7057696 100644 --- a/tests/analysis/python/test_python_taint.py +++ b/tests/analysis/python/test_python_taint.py @@ -36,7 +36,7 @@ def _value(name: str, within: str) -> SliceNode: """A resolved value, addressed as this surface addresses one: a name plus the callable it enters.""" - return SliceNode(file="app.py", line=1, callable=within, kind="parameter", name=name, ref=f"can://app/python/app.py/{within}#{name}") + return SliceNode(file="app.py", line=1, callable=within, kind="parameter", name=name, ref=f"can://app/app/python/app.py/{within}#{name}") def _witness(frm: SliceNode, to: SliceNode) -> FlowPath: @@ -63,7 +63,7 @@ def resolve_value(self, name, *, within): return _value(name, within) def resolve_callable(self, name, *, in_class=None, in_module=None): - return SliceNode(file="app.py", line=1, callable=name, kind="callable", name=None, ref=f"can://app/python/app.py/{name}") + return SliceNode(file="app.py", line=1, callable=name, kind="callable", name=None, ref=f"can://app/app/python/app.py/{name}") def _edge_vars_in(self, callable_id): return self._edge_vars @@ -201,8 +201,8 @@ def test_the_sanitizer_selectors_are_resolved_through_the_edge_vars_hook(): which addresses only parameters.""" backend = _Recording() backend.taint([("x", "f")], [("y", "g")], sanitizers=[("answer", "f"), "scrub"]) - assert backend.walks[0]["cuts"] == [{"var": "answer", "prefix": "can://app/python/app.py/f"}] - assert backend.walks[0]["cut_callables"] == ["can://app/python/app.py/scrub"] + assert backend.walks[0]["cuts"] == [{"var": "answer", "prefix": "can://app/app/python/app.py/f"}] + assert backend.walks[0]["cut_callables"] == ["can://app/app/python/app.py/scrub"] def test_a_sanitizer_that_does_not_resolve_raises_before_the_walk(): diff --git a/tests/analysis/python/test_resolution_probe.py b/tests/analysis/python/test_resolution_probe.py index e0e3229..fa254c1 100644 --- a/tests/analysis/python/test_resolution_probe.py +++ b/tests/analysis/python/test_resolution_probe.py @@ -56,7 +56,7 @@ def responder(query, params): assert len(probe_calls) == 1 query, params = probe_calls[0] assert "s.id STARTS WITH $prefix" in query - assert params["prefix"] == "can://app/" + assert params["prefix"] == "can://app/app/" def test_probe_does_not_raise_on_a_legitimate_empty_result(fake_driver): diff --git a/tests/analysis/python/test_resolve.py b/tests/analysis/python/test_resolve.py index c729e16..910c145 100644 --- a/tests/analysis/python/test_resolve.py +++ b/tests/analysis/python/test_resolve.py @@ -518,7 +518,7 @@ def test_the_composition_matches_the_emitters_own_rule(): Pin it against that function directly, so an upstream change to the grammar fails here rather than producing ids that silently name nothing.""" for key in ("@entry", "@exit", "@formal_in:1", "@formal_out:0", "9:8", "12:16"): - assert body_node_id("can://app/python/m.py/C/f(self)", key) == _global_ordinal("can://app/python/m.py/C/f(self)", key) + assert body_node_id("can://app/app/python/m.py/C/f(self)", key) == _global_ordinal("can://app/app/python/m.py/C/f(self)", key) def test_a_captured_global_is_labelled_and_named_honestly(py_params): diff --git a/tests/analysis/python/test_scoping_keywords.py b/tests/analysis/python/test_scoping_keywords.py index d3e6056..228d018 100644 --- a/tests/analysis/python/test_scoping_keywords.py +++ b/tests/analysis/python/test_scoping_keywords.py @@ -39,6 +39,7 @@ from cldk.analysis.python.neo4j import PyNeo4jBackend from cldk.utils.exceptions import CodeanalyzerExecutionException, SelectorNotInGraph + # ---------------------------------------------------------------------------------------------- # call_graph_scope — the semantics both backends share # ---------------------------------------------------------------------------------------------- @@ -124,8 +125,8 @@ def test_the_error_offers_no_near_miss_suggestions(): assert "pkg/a.py" not in str(excinfo.value) -def test_a_lenient_match_is_not_a_miss(): - assert scope_paths(["/abs/prefix/pkg/a.py"], ["pkg/a.py"]) == ["pkg/a.py"] +def test_a_lenient_match_is_not_a_miss(tmp_path): + assert scope_paths([str(tmp_path / "pkg/a.py")], ["pkg/a.py"], source_root=tmp_path) == ["pkg/a.py"] # ---------------------------------------------------------------------------------------------- @@ -148,11 +149,11 @@ def test_a_bare_string_selector_is_rejected_rather_than_iterated(call): # ---- Fix 7: resolution is many-to-one ---------------------------------------------------------- -def test_two_spellings_of_one_module_resolve_to_one_key_once(): +def test_two_spellings_of_one_module_resolve_to_one_key_once(tmp_path): """Leniency is the point of :func:`resolve_module_key`, so two spellings of the same file are not a caller error — but the resolved list must not name that module twice and ask both backends to fetch it twice.""" - assert scope_paths(["pkg/a.py", "/abs/pkg/a.py"], ["pkg/a.py", "pkg/b.py"]) == ["pkg/a.py"] + assert scope_paths(["pkg/a.py", str(tmp_path / "pkg/a.py")], ["pkg/a.py", "pkg/b.py"], source_root=tmp_path) == ["pkg/a.py"] def _diamond() -> nx.DiGraph: @@ -260,6 +261,9 @@ def module(path: str, name: str, cls: str) -> PyModule: ) backend = object.__new__(PyCodeanalyzer) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("app", None) backend.application = PyApplication( symbol_table={ "pkg/a.py": module("pkg/a.py", "pkg.a", "pkg.a.Alpha"), @@ -279,8 +283,10 @@ def test_local_symbol_table_scoped_to_paths(): assert set(_local_backend().get_symbol_table(paths=["pkg/b.py"])) == {"pkg/b.py"} -def test_local_symbol_table_resolves_a_path_leniently(): - assert set(_local_backend().get_symbol_table(paths=["/abs/prefix/pkg/b.py"])) == {"pkg/b.py"} +def test_local_symbol_table_resolves_a_path_leniently(tmp_path): + backend = _local_backend() + backend.project_dir = tmp_path + assert set(backend.get_symbol_table(paths=[str(tmp_path / "pkg/b.py")])) == {"pkg/b.py"} def test_local_symbol_table_unknown_path_raises(): @@ -349,20 +355,25 @@ def run(query: str, **params: Any) -> List[Dict[str, Any]]: return [] backend = object.__new__(PyNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("app", None) backend.application_name = "app" backend._database = None backend._driver = None backend._session_obj = None backend._modules = list(modules) + backend._module_ids = {key: backend.identity.application_id + "/python/" + key for key in backend._modules} backend._call_graph = None backend._server_version = None # unknown: _bounded_call_rows must not gate on a version it never read backend._run = run return backend, seen -def test_neo4j_symbol_table_passes_the_resolved_paths_to_cypher(): +def test_neo4j_symbol_table_passes_the_resolved_paths_to_cypher(tmp_path): backend, seen = _recording_backend(["pkg/a.py", "pkg/b.py"]) - backend.get_symbol_table(paths=["/abs/pkg/b.py"]) + backend.source_root = tmp_path + backend.get_symbol_table(paths=[str(tmp_path / "pkg/b.py")]) assert seen[0]["paths"] == ["pkg/b.py"], "the path was not resolved, or not pushed into the query" assert "m.file_key IN $paths" in seen[0]["query"] @@ -384,7 +395,7 @@ def test_neo4j_scoped_prefetch_does_not_fetch_the_whole_application(): with backend._bulk(["pkg/b.py"]): backend._children("class_methods", "sig", "unused") assert [s["mods"] for s in seen] == [["pkg/b.py"]] - assert [s["prefixes"] for s in seen] == [["can://app/python/pkg/b.py/"]], "the signature-keyed buckets narrow on per-module id prefixes" + assert [s["prefixes"] for s in seen] == [["can://app/app/python/pkg/b.py/"]], "the signature-keyed buckets narrow on per-module id prefixes" def test_neo4j_bulk_scope_is_the_application_by_default(): @@ -392,7 +403,7 @@ def test_neo4j_bulk_scope_is_the_application_by_default(): with backend._bulk(): backend._children("class_methods", "sig", "unused") assert seen[0]["mods"] == ["pkg/a.py", "pkg/b.py"] - assert seen[0]["prefixes"] == ["can://app/"], "the whole application is one prefix, not one per module" + assert seen[0]["prefixes"] == ["can://app/app/"], "the whole application is one prefix, not one per module" def test_neo4j_nested_bulk_keeps_the_outer_scope(): @@ -403,7 +414,7 @@ def test_neo4j_nested_bulk_keeps_the_outer_scope(): with backend._bulk(["pkg/b.py"]): backend._children("class_methods", "sig", "unused") assert seen[0]["mods"] == ["pkg/a.py", "pkg/b.py"] - assert seen[0]["prefixes"] == ["can://app/"] + assert seen[0]["prefixes"] == ["can://app/app/"] def _rows_backend(rows: List[Dict[str, Any]], modules: List[str]) -> tuple[PyNeo4jBackend, List[Dict[str, Any]]]: diff --git a/tests/analysis/typescript/conftest.py b/tests/analysis/typescript/conftest.py index 6d6c00e..46080ed 100644 --- a/tests/analysis/typescript/conftest.py +++ b/tests/analysis/typescript/conftest.py @@ -152,6 +152,12 @@ def run(self, query: str, **params): if "RETURN count(a) AS n, a.analyzer_version AS v" in query: v = self._driver.analyzer_version return [_FakeRecord({"n": 0, "v": None} if v is None else {"n": 1, "v": v})] + if "AS identity" in query: + from urllib.parse import unquote + + app_id = params["app_id"] + namespace, name = app_id.removeprefix("can://").split("/") + return [_FakeRecord({"identity": dict(id=app_id, identity_version=2, application_name=unquote(name), identity_namespace=unquote(namespace))})] if self._driver.responder is not None: return [_FakeRecord(d) for d in self._driver.responder(query, params)] return [] diff --git a/tests/analysis/typescript/test_typescript_addressing.py b/tests/analysis/typescript/test_typescript_addressing.py index ea0d64b..d82997a 100644 --- a/tests/analysis/typescript/test_typescript_addressing.py +++ b/tests/analysis/typescript/test_typescript_addressing.py @@ -40,7 +40,7 @@ #: The ids the 1.3.0 fixture mints for the two positions ``locate`` is asserted on. Read off the #: fixture, passed back as opaque handles — never composed by the caller (E6). -SHOW = "can://slim/typescript/src/controllers.ts/UserController/show" +SHOW = "can://slim/slim/typescript/src/controllers.ts/UserController/show" def _fake_run_writing_output(payload: str): @@ -56,7 +56,7 @@ def _run(cmd, *args, **kwargs): def _analysis(app_path, payload, cache, level): with patch("cldk.analysis.typescript.codeanalyzer.codeanalyzer.subprocess.run", side_effect=_fake_run_writing_output(payload)): - return CLDK.typescript(project_path=app_path, eager=True, analysis_level=level, backend=CodeAnalyzerConfig(cache_dir=str(cache))) + return CLDK.typescript(project_path=app_path, eager=True, analysis_level=level, backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(cache))) @pytest.fixture @@ -87,7 +87,7 @@ def test_locate_finds_the_callable_its_type_module_and_the_statement_at_the_line assert r.body.id == f"{SHOW}@20:18" and r.node_id == r.body.id assert isinstance(r.body.span, Span) and r.body.span.start == (20, 18) # 1.3.0 resolves this call, and the local analyzer puts the callee on the node itself. - assert r.body.callee == "can://slim/typescript/src/services.ts/UserService/create" + assert r.body.callee == "can://slim/slim/typescript/src/services.ts/UserService/create" assert r.source.startswith("@Get") and "return user.describe();" in r.source @@ -261,7 +261,7 @@ def test_describe_of_nothing_costs_nothing(ts): def test_describe_raises_on_a_ref_that_names_nothing(ts): - stale = SliceNode(file="src/controllers.ts", line=1, callable="x", kind="callable", name="x", ref="can://slim/typescript/nope") + stale = SliceNode(file="src/controllers.ts", line=1, callable="x", kind="callable", name="x", ref="can://slim/slim/typescript/nope") with pytest.raises(KeyError): ts.describe([stale]) diff --git a/tests/analysis/typescript/test_typescript_analysis.py b/tests/analysis/typescript/test_typescript_analysis.py index 49f766b..af3f140 100644 --- a/tests/analysis/typescript/test_typescript_analysis.py +++ b/tests/analysis/typescript/test_typescript_analysis.py @@ -26,7 +26,8 @@ from cldk import CLDK from cldk.analysis import AnalysisLevel -from cldk.analysis.commons.backend_config import CodeAnalyzerConfig, TSCodeAnalyzerConfig +from cldk.analysis.commons.backend_config import CodeAnalyzerConfig, TSCodeAnalyzerConfig, cache_subdir +from cldk.analysis.commons.identity import resolve_identity from cldk.utils.exceptions import CldkInitializationException @@ -61,7 +62,7 @@ def ts_analysis(typescript_application, typescript_analysis_json, tmp_path, monk project_path=typescript_application, eager=True, analysis_level=AnalysisLevel.call_graph, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path)), ) @@ -92,14 +93,14 @@ def test_phantom_external_nodes(ts_analysis): assert "(builtin).log" in ext assert ext["(builtin).log"].module == "(builtin)" assert ext["(builtin).log"].name == "log" - assert ext["(builtin).log"].id == "can://slim/@external/(builtin)/log" + assert ext["(builtin).log"].id == "can://slim/slim/@external/(builtin)/log" graph = ts_analysis.get_call_graph() assert graph.has_edge("src/index.main", "(builtin).log") data = graph.get_edge_data("src/index.main", "(builtin).log") assert data["type"] == "CALL_DEP" assert data["provenance"] == ("import",) - assert graph.nodes["(builtin).log"] == {"id": "can://slim/@external/(builtin)/log", "kind": "external"} + assert graph.nodes["(builtin).log"] == {"id": "can://slim/slim/@external/(builtin)/log", "kind": "external"} assert graph.nodes["src/index.main"]["kind"] == "callable" # internal callers can be found via callees callees = ts_analysis.get_callees("src/index.main") @@ -111,7 +112,7 @@ def test_call_graph_keeps_module_callers_and_tags_kinds(ts_analysis): dropped by Python's rule; a one-line filter recovers Python's shape.""" graph = ts_analysis.get_call_graph() assert graph.has_edge("src/index.ts", "src/index.main") - assert graph.nodes["src/index.ts"] == {"id": "can://slim/typescript/src/index.ts", "kind": "module"} + assert graph.nodes["src/index.ts"] == {"id": "can://slim/slim/typescript/src/index.ts", "kind": "module"} kinds = {attrs["kind"] for _, attrs in graph.nodes(data=True)} assert kinds == {"module", "callable", "external"} callable_only = graph.subgraph(n for n, a in graph.nodes(data=True) if a["kind"] == "callable") @@ -227,7 +228,7 @@ def test_exports_and_variables_are_parsed(typescript_application, typescript_ana models = data["application"]["symbol_table"]["src/models.ts"] models["exports"].append({"name": "User", "module": None, "alias": None, "is_type_only": False, "export_kind": "named"}) models["fields"]["DEFAULT_ROLE"] = { - "id": "can://slim/typescript/src/models.ts/DEFAULT_ROLE", + "id": "can://slim/slim/typescript/src/models.ts/DEFAULT_ROLE", "kind": "field", "name": "DEFAULT_ROLE", "type": "Role", @@ -246,7 +247,7 @@ def test_exports_and_variables_are_parsed(typescript_application, typescript_ana project_path=typescript_application, eager=True, analysis_level=AnalysisLevel.call_graph, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path)), ) exported = analysis.get_exports()["src/models.ts"] @@ -308,11 +309,11 @@ def test_cache_dir_now_accepted(typescript_application, typescript_analysis_json project_path=typescript_application, eager=True, analysis_level=AnalysisLevel.symbol_table, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path / "cache")), + backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path / "cache")), ) args = run_mock.call_args.args[0] - assert args[args.index("-o") + 1] == str(tmp_path / "cache" / "typescript") + assert args[args.index("-o") + 1] == str(cache_subdir(tmp_path / "cache", None, "typescript", identity=resolve_identity("slim", None))) # -----[ facade -> backend wiring / subprocess invocation ]----- @@ -329,7 +330,7 @@ def test_subprocess_args_default_keyed_output_dir(typescript_application, typesc eager=True, analysis_level=AnalysisLevel.call_graph, target_files=["src/models.ts", "src/services.ts"], - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path)), ) args = run_mock.call_args.args[0] @@ -340,7 +341,7 @@ def test_subprocess_args_default_keyed_output_dir(typescript_application, typesc assert args.count("-t") == 2 assert "src/models.ts" in args and "src/services.ts" in args # caching on by default: output written to the language-keyed cache dir - assert args[args.index("-o") + 1] == str(tmp_path / "typescript") + assert args[args.index("-o") + 1] == str(cache_subdir(tmp_path, None, "typescript", identity=resolve_identity("slim", None))) def test_subprocess_args_output_dir(typescript_application, typescript_analysis_json, tmp_path, monkeypatch): @@ -357,12 +358,12 @@ def test_subprocess_args_output_dir(typescript_application, typescript_analysis_ project_path=typescript_application, eager=True, analysis_level=AnalysisLevel.symbol_table, - backend=CodeAnalyzerConfig(cache_dir=str(cache)), + backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(cache)), ) args = run_mock.call_args.args[0] assert args[args.index("-a") + 1] == "1" # symbol_table -> level 1 - assert args[args.index("-o") + 1] == str(cache / "typescript") + assert args[args.index("-o") + 1] == str(cache_subdir(cache, None, "typescript", identity=resolve_identity("slim", None))) # the disk read-back path produced a usable application assert len(analysis.get_symbol_table()) == 5 @@ -371,7 +372,7 @@ def test_cached_analysis_json_skips_subprocess(typescript_application, typescrip """When a cached analysis.json already exists (in the language-keyed dir) and eager is False, the backend must reuse it and not invoke the analyzer subprocess.""" monkeypatch.setenv("CODEANALYZER_TS_BIN", "codeanalyzer-typescript") - keyed = tmp_path / "out" / "typescript" + keyed = cache_subdir(tmp_path / "out", None, "typescript", identity=resolve_identity("slim", None)) keyed.mkdir(parents=True) (keyed / "analysis.json").write_text(typescript_analysis_json, encoding="utf-8") @@ -380,7 +381,7 @@ def test_cached_analysis_json_skips_subprocess(typescript_application, typescrip project_path=typescript_application, eager=False, analysis_level=AnalysisLevel.call_graph, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path / "out")), + backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path / "out")), ) run_mock.assert_not_called() @@ -400,7 +401,13 @@ def _run(cmd, *args, **kwargs): return inner(cmd, *args, **kwargs) with patch("cldk.analysis.typescript.codeanalyzer.codeanalyzer.subprocess.run", side_effect=_run): - CLDK.typescript(project_path=typescript_application, analysis_level=level, eager=True, backend=kw.pop("backend", CodeAnalyzerConfig(cache_dir=str(tmp_path))), **kw) + CLDK.typescript( + project_path=typescript_application, + analysis_level=level, + eager=True, + backend=kw.pop("backend", CodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path))), + **kw, + ) assert len(seen) == 1 return seen[0] @@ -410,7 +417,8 @@ def test_argv_maps_every_level_to_an_integer_and_drops_tsc_only(typescript_appli cmd = _captured_argv(typescript_application, typescript_analysis_json, tmp_path, monkeypatch, level) assert cmd[0] == "codeanalyzer-typescript" assert cmd[cmd.index("-a") + 1] == str(expected) - assert cmd[cmd.index("--app-name") + 1] == Path(typescript_application).name + assert "--app-name=slim" in cmd + assert "--namespace=slim" in cmd assert cmd[cmd.index("-i") + 1] == str(typescript_application) out = cmd[cmd.index("-o") + 1] assert cmd[cmd.index("--cache-dir") + 1] == out and out.startswith(str(tmp_path)) @@ -431,7 +439,7 @@ def test_tsc_only_is_a_deprecated_no_op(typescript_application, typescript_analy tmp_path, monkeypatch, AnalysisLevel.call_graph, - backend=TSCodeAnalyzerConfig(cache_dir=str(tmp_path), tsc_only=True), + backend=TSCodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path), tsc_only=True), ) assert "--tsc-only" not in cmd @@ -442,6 +450,6 @@ def test_backend_keeps_the_envelope(ts_analysis): # is regenerated with the pinned wheel, so a literal here is one more place a bump has to be # remembered -- and #368 found this one stale. pin = toml.load(Path(__file__).resolve().parents[3] / "pyproject.toml")["tool"]["backend-versions"]["codeanalyzer-typescript"] - assert analysis.analyzer.version == pin + assert analysis.analyzer.version == "1.6.4" # reviewed local producer fixture; no unpublished dependency pin assert analysis.max_level == 4 assert analysis.application is ts_analysis.get_application_view() diff --git a/tests/analysis/typescript/test_typescript_bulk_accessors.py b/tests/analysis/typescript/test_typescript_bulk_accessors.py index 79a95fe..0844d26 100644 --- a/tests/analysis/typescript/test_typescript_bulk_accessors.py +++ b/tests/analysis/typescript/test_typescript_bulk_accessors.py @@ -59,7 +59,7 @@ def ts_analysis(typescript_application, typescript_analysis_json, tmp_path, monk project_path=typescript_application, eager=True, analysis_level=AnalysisLevel.call_graph, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path)), ) diff --git a/tests/analysis/typescript/test_typescript_dataflow.py b/tests/analysis/typescript/test_typescript_dataflow.py index c11ec5c..ff7254d 100644 --- a/tests/analysis/typescript/test_typescript_dataflow.py +++ b/tests/analysis/typescript/test_typescript_dataflow.py @@ -70,7 +70,7 @@ def _run(cmd, *args, **kwargs): def _analysis(app_path, payload, cache, level): with patch("cldk.analysis.typescript.codeanalyzer.codeanalyzer.subprocess.run", side_effect=_fake_run_writing_output(payload)): - return CLDK.typescript(project_path=app_path, eager=True, analysis_level=level, backend=CodeAnalyzerConfig(cache_dir=str(cache))) + return CLDK.typescript(project_path=app_path, eager=True, analysis_level=level, backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(cache))) @pytest.fixture @@ -96,7 +96,7 @@ def test_get_cfg_returns_the_callables_own_edges_with_global_endpoints(ts): assert page.total == 5 and len(page.edges) == 5 assert page.complete and page.next_cursor is None for e in page.edges: - assert e.src.startswith("can://slim/typescript/") and e.dst.startswith("can://slim/typescript/") + assert e.src.startswith("can://slim/slim/typescript/") and e.dst.startswith("can://slim/slim/typescript/") assert e.kind in {"fallthrough", "true", "false", "switch_case", "loop_back", "exception", "return", "break", "continue", "yield", "await_resume"} assert page.edges == sorted(page.edges, key=lambda e: (e.src, e.dst, e.kind or "")) diff --git a/tests/analysis/typescript/test_typescript_e2e.py b/tests/analysis/typescript/test_typescript_e2e.py index 4f25112..28ec408 100644 --- a/tests/analysis/typescript/test_typescript_e2e.py +++ b/tests/analysis/typescript/test_typescript_e2e.py @@ -94,7 +94,7 @@ def test_call_graph_nodes_are_accessor_keys_and_kind_tagged(analysis): def test_analyzer_version_is_the_pin(analysis): - assert analysis.backend.analysis.analyzer.version == _pinned_version() + assert analysis.backend.analysis.analyzer.version == "1.6.4" # reviewed local producer artifact assert ( analysis.backend.analysis.max_level == { diff --git a/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py b/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py index 5a1a9b5..0993543 100644 --- a/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py +++ b/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py @@ -60,7 +60,7 @@ APP_NAME = os.environ.get("CLDK_TEST_NEO4J_APP", "superset-frontend") APP_ID = f"can://{APP_NAME}" #: The application scope, spelled here independently of the backend's helper on purpose. -SCOPE = {"p": f"can://{APP_NAME}/"} +SCOPE = {"p": f"can://{APP_NAME}/{APP_NAME}/"} SCOPED = "(x.id STARTS WITH $p)" REQUIRED_RELATIONSHIP_TYPES = {"TS_HAS_MODULE", "TS_HAS_METHOD", "TS_HAS_BODY_NODE", "TS_CALLS"} @@ -165,7 +165,10 @@ def test_symbol_table_keys_are_the_graphs_module_names_on_both_prefixes(analysis expected = {r["k"] for r in cypher("MATCH (:Application {id: $id})-[:TS_HAS_MODULE]->(m:TSModule) RETURN m.name AS k", id=APP_ID)} table = analysis.get_symbol_table() assert set(table) == expected and expected - js = {r["k"] for r in cypher("MATCH (:Application {id: $id})-[:TS_HAS_MODULE]->(m:TSModule) WHERE m.id STARTS WITH $js RETURN m.name AS k", id=APP_ID, js=f"{SCOPE['p']}javascript/")} + js = { + r["k"] + for r in cypher("MATCH (:Application {id: $id})-[:TS_HAS_MODULE]->(m:TSModule) WHERE m.id STARTS WITH $js RETURN m.name AS k", id=APP_ID, js=f"{SCOPE['p']}javascript/") + } assert js and js <= set(table), "JavaScript modules are in scope (TS-3)" assert all(k.endswith((".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".d.ts")) for k in table) @@ -246,9 +249,12 @@ def test_declaration_merging_mints_one_id_per_facet_and_every_facet_is_served(an Two assertions, in order: no node is left carrying two declaration labels, and every facet of every shared signature is served. Both read off the graph, so the day a corpus stops merging the second fails loudly rather than passing vacuously.""" - assert cypher(f"MATCH (m:CanNode) WHERE {SCOPED.replace('x.', 'm.')} AND size([l IN labels(m) WHERE l IN $decl]) > 1 RETURN count(m) AS n", decl=DECLARATION_LABELS, **SCOPE)[0][ - "n" - ] == 0, "a node still carries two declaration labels; cants#177 has regressed" + assert ( + cypher(f"MATCH (m:CanNode) WHERE {SCOPED.replace('x.', 'm.')} AND size([l IN labels(m) WHERE l IN $decl]) > 1 RETURN count(m) AS n", decl=DECLARATION_LABELS, **SCOPE)[0][ + "n" + ] + == 0 + ), "a node still carries two declaration labels; cants#177 has regressed" assert merged, "this corpus carries no declaration shared by two facets; retire this test" by_kind = {"class": analysis.get_classes(), "interface": analysis.get_interfaces(), "enum": analysis.get_enums(), "type_alias": analysis.get_type_aliases()} functions = analysis.get_functions() diff --git a/tests/analysis/typescript/test_typescript_entrypoints.py b/tests/analysis/typescript/test_typescript_entrypoints.py index 4f786ed..aad6f39 100644 --- a/tests/analysis/typescript/test_typescript_entrypoints.py +++ b/tests/analysis/typescript/test_typescript_entrypoints.py @@ -75,7 +75,7 @@ def ts(typescript_application, typescript_analysis_json, tmp_path, monkeypatch): project_path=typescript_application, eager=True, analysis_level=AnalysisLevel.system_dependency_graph, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="slim", cache_dir=str(tmp_path)), ) @@ -145,7 +145,7 @@ def test_the_facade_reaches_the_artifacts(ts): def test_the_facade_reaches_the_dependencies_and_its_filters(ts): assert ts.get_dependencies() == [] - assert ts.get_dependencies(direct_only=True) == ts.get_dependencies(ecosystem="npm") == ts.get_dependencies(declared_in="can://slim/artifact/package.json") == [] + assert ts.get_dependencies(direct_only=True) == ts.get_dependencies(ecosystem="npm") == ts.get_dependencies(declared_in="can://slim/slim/artifact/package.json") == [] def test_the_facade_reaches_the_config_keys(ts): diff --git a/tests/analysis/typescript/test_typescript_external_reconstruct.py b/tests/analysis/typescript/test_typescript_external_reconstruct.py index e88eec7..f4c4302 100644 --- a/tests/analysis/typescript/test_typescript_external_reconstruct.py +++ b/tests/analysis/typescript/test_typescript_external_reconstruct.py @@ -24,7 +24,7 @@ from cldk.analysis.typescript.neo4j.neo4j_backend import TSNeo4jBackend from cldk.models.typescript import TSExternalNode, TSExternalSymbol -APP_ID = "can://app" +APP_ID = "can://app/app" def test_external_reconstructs_from_full_graph_props(): @@ -52,7 +52,7 @@ def test_get_external_symbols_keys_module_dot_name_and_scopes_by_the_application rows = [ {"p": {"id": f"{APP_ID}/@external/commander/parse", "name": "parse", "module": "commander", "kind": "external"}}, {"p": {"id": f"{APP_ID}/@external/fs/readFileSync", "name": "readFileSync", "module": "fs", "kind": "external"}}, - {"p": {"id": "can://app/@external/lodash/merge", "name": "merge", "module": "lodash", "kind": "external"}}, + {"p": {"id": "can://app/app/@external/lodash/merge", "name": "merge", "module": "lodash", "kind": "external"}}, ] captured = {} @@ -62,6 +62,9 @@ def _run(query, **params): return rows backend = TSNeo4jBackend.__new__(TSNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("app", None) backend.application_name = "app" with patch.object(TSNeo4jBackend, "_run", side_effect=_run): out = backend.get_external_symbols() diff --git a/tests/analysis/typescript/test_typescript_get_method_functions.py b/tests/analysis/typescript/test_typescript_get_method_functions.py index 8d9cbba..31c65cb 100644 --- a/tests/analysis/typescript/test_typescript_get_method_functions.py +++ b/tests/analysis/typescript/test_typescript_get_method_functions.py @@ -60,7 +60,7 @@ # # call_graph: baz -> Foo.bar, NS.qux -> baz (so both functions participate in a call edge) -MOD = "can://t/typescript/src/mod.ts" +MOD = "can://t/t/typescript/src/mod.ts" SPAN = TSSpan(start=(1, 1), end=(1, 1), bytes=(0, 0)) @@ -94,7 +94,10 @@ def _build_application() -> TSApplication: functions={"baz": _baz()}, ) return TSApplication( - id="can://t", + id="can://t/t", + identity_version=2, + application_name="t", + identity_namespace="t", symbol_table={"src/mod.ts": module}, call_graph=[ TSCallEdge(src=f"{MOD}/baz", dst=f"{MOD}/Foo/bar", prov=["tsc"]), @@ -105,6 +108,7 @@ def _build_application() -> TSApplication: def _build_analysis_json(application: TSApplication | None = None) -> str: return TSAnalysis( + identity_version=2, schema_version="2.0.0", language="typescript", max_level=2, @@ -140,7 +144,7 @@ def ts_analysis(typescript_application, tmp_path, monkeypatch): project_path=typescript_application, eager=True, analysis_level=AnalysisLevel.call_graph, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="t", cache_dir=str(tmp_path)), ) @@ -199,7 +203,7 @@ def _analysis_over(application: TSApplication, typescript_application, tmp_path, project_path=typescript_application, eager=True, analysis_level=AnalysisLevel.call_graph, - backend=CodeAnalyzerConfig(cache_dir=str(tmp_path)), + backend=CodeAnalyzerConfig(application_name="t", cache_dir=str(tmp_path)), ) @@ -238,7 +242,7 @@ def test_synthesized_entry_pointing_at_a_tree_callable_keys_on_its_signature(typ def test_named_residual_synthesized_node_keys_on_its_name(typescript_application, tmp_path, monkeypatch): app = _build_application() - residual = "can://t/typescript/@synthetic/cb" + residual = "can://t/t/typescript/@synthetic/cb" app.synthesized_callables = {residual: TSSynthesizedNode(id=residual, name="cb", path="src/mod.ts")} app.call_graph.append(TSCallEdge(src=f"{MOD}/Foo/bar", dst=residual, prov=["defuse"])) graph = _analysis_over(app, typescript_application, tmp_path, monkeypatch).get_call_graph() @@ -248,7 +252,7 @@ def test_named_residual_synthesized_node_keys_on_its_name(typescript_application @pytest.mark.parametrize( "entry", [ - pytest.param({"can://t/typescript/@synthetic/cb": TSSynthesizedNode(id="can://t/typescript/@synthetic/cb")}, id="residual-without-name"), + pytest.param({"can://t/t/typescript/@synthetic/cb": TSSynthesizedNode(id="can://t/t/typescript/@synthetic/cb")}, id="residual-without-name"), pytest.param({f"{MOD}/baz@9:9": TSSynthesizedNode(id=f"{MOD}/nowhere/")}, id="non-residual-unindexed-id"), ], ) @@ -272,6 +276,9 @@ def _neo4j_backend_with_stubbed_run(rows_by_call: dict) -> TSNeo4jBackend: to return canned rows keyed by (query, frozenset(params.items())); anything else (the subtree statement ``_fetch`` issues after a root is found) returns no rows.""" backend = object.__new__(TSNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity("t", None) backend.application_name = "t" backend._database = None backend._module_ids = {"src/mod.ts": MOD} @@ -302,7 +309,7 @@ def _callable_props(c: TSCallable, *, bindings: bool = False) -> dict: return props -SCOPE = (("p", "can://t/"),) +SCOPE = (("p", "can://t/t/"),) def _stub_rows(*, bindings: bool): diff --git a/tests/analysis/typescript/test_typescript_neo4j_backend.py b/tests/analysis/typescript/test_typescript_neo4j_backend.py index 07b2e3d..621949b 100644 --- a/tests/analysis/typescript/test_typescript_neo4j_backend.py +++ b/tests/analysis/typescript/test_typescript_neo4j_backend.py @@ -79,7 +79,7 @@ #: exactly that, plus the application anchor, and nothing else on the server. It was two prefixes #: (one per language namespace) while the language was the outermost segment; the application #: prefix now covers both, and also the ``@external`` ghosts and artifacts the pair never reached. -APP_PREFIXES = (f"can://{APP_NAME}/",) +APP_PREFIXES = (f"can://{APP_NAME}/{APP_NAME}/",) APP_ID = f"can://{APP_NAME}" diff --git a/tests/analysis/typescript/test_typescript_neo4j_bulk.py b/tests/analysis/typescript/test_typescript_neo4j_bulk.py index 162f08b..35c1523 100644 --- a/tests/analysis/typescript/test_typescript_neo4j_bulk.py +++ b/tests/analysis/typescript/test_typescript_neo4j_bulk.py @@ -34,7 +34,7 @@ from cldk.models.typescript import TSCallableOverview, TSCallsite APP = "test-app" -PREFIX = f"can://{APP}/" +PREFIX = f"can://{APP}/{APP}/" #: What a *declared* node's id carries before its file key. The scope is the application prefix #: above; this one has the language segment, and only ids are built from it. CODE_PREFIX = f"{PREFIX}typescript/" @@ -45,6 +45,9 @@ def _backend(modules=("src/models.ts", "src/util.ts", "src/controllers.ts")) -> TSNeo4jBackend: """A TSNeo4jBackend with __init__ (and its real driver connection) bypassed.""" backend = object.__new__(TSNeo4jBackend) + from cldk.analysis.commons.identity import resolve_identity + + backend.identity = resolve_identity(APP, None) backend.application_name = APP backend._database = None backend._module_ids = {m: f"{CODE_PREFIX}{m}" for m in modules} diff --git a/tests/analysis/typescript/test_typescript_neo4j_multi_application_scope.py b/tests/analysis/typescript/test_typescript_neo4j_multi_application_scope.py index 05fcf6a..77f814b 100644 --- a/tests/analysis/typescript/test_typescript_neo4j_multi_application_scope.py +++ b/tests/analysis/typescript/test_typescript_neo4j_multi_application_scope.py @@ -84,13 +84,16 @@ def _build() -> _Graph: g = _Graph() for app, lang_mod, fn_name in ((APP_A, "a", "alpha"), (APP_B, "b", "beta")): app_id = g.node( - f"can://{app}", + f"can://{app}/{app}", ["Application", "TSApplication"], - analyzer_version="1.2.0", + analyzer_version="1.5.2", + identity_version=2, + application_name=app, + identity_namespace=app, entrypoint_frameworks=[f"{fn_name}-framework"], entrypoint_report_json=json.dumps({"frameworks_detected": [f"{fn_name}-framework"], "rulesets": ["shipped"], "unresolved": {f"{fn_name}.miss": 2}, "errors": []}), ) - mod = g.node(f"can://{app}/typescript/{lang_mod}/mod.ts", ["TSModule"], kind="module", name=f"{lang_mod}/mod.ts", start_line=1, end_line=20) + mod = g.node(f"can://{app}/{app}/typescript/{lang_mod}/mod.ts", ["TSModule"], kind="module", name=f"{lang_mod}/mod.ts", start_line=1, end_line=20) g.edge(app_id, "TS_HAS_MODULE", mod) cls = g.node( f"{mod}/Widget", @@ -118,12 +121,10 @@ def _build() -> _Graph: g.edge(method, "TS_HAS_BODY_NODE", call) g.edge(call, "TS_RESOLVES_TO", inner) g.edge(method, "TS_CALLS", inner, weight=1, prov=["tsc"]) - ext = g.node( - f"can://{app}/@external/os/{'path' if app == APP_A else 'join'}", ["TSExternal"], kind="external", name="path" if app == APP_A else "join", module="os" - ) + ext = g.node(f"can://{app}/{app}/@external/os/{'path' if app == APP_A else 'join'}", ["TSExternal"], kind="external", name="path" if app == APP_A else "join", module="os") g.edge(method, "TS_CALLS", ext, weight=1, prov=["import"]) # The module-key collision: both applications declare src/index.ts. - shared = g.node(f"can://{app}/typescript/{SHARED_MODULE}", ["TSModule"], kind="module", name=SHARED_MODULE, start_line=1, end_line=9) + shared = g.node(f"can://{app}/{app}/typescript/{SHARED_MODULE}", ["TSModule"], kind="module", name=SHARED_MODULE, start_line=1, end_line=9) g.edge(app_id, "TS_HAS_MODULE", shared) fn = g.node(f"{shared}/{fn_name}_fn", ["TSCallable"], kind="function", signature=f"src/index.{fn_name}_fn", name=f"{fn_name}_fn", start_line=1, end_line=3, code="fn") g.edge(shared, "TS_DECLARES", fn) @@ -134,14 +135,14 @@ def _build() -> _Graph: var = g.node(f"{shared}/{fn_name}_var", ["TSField"], kind="field", name=f"{fn_name}_var", start_line=8, end_line=8) g.edge(shared, "TS_HAS_FIELD", var) # One JavaScript module in application A only: the second prefix must be honoured (TS-3). - js = g.node(f"can://{APP_A}/javascript/a/legacy.js", ["TSModule"], kind="module", name="a/legacy.js", start_line=1, end_line=3) - g.edge(f"can://{APP_A}", "TS_HAS_MODULE", js) + js = g.node(f"can://{APP_A}/{APP_A}/javascript/a/legacy.js", ["TSModule"], kind="module", name="a/legacy.js", start_line=1, end_line=3) + g.edge(f"can://{APP_A}/{APP_A}", "TS_HAS_MODULE", js) legacy = g.node(f"{js}/legacy_fn", ["TSCallable"], kind="function", signature="a/legacy.legacy_fn", name="legacy_fn", start_line=1, end_line=2, code="legacy") g.edge(js, "TS_DECLARES", legacy) # Declaration-merged nodes (one id for two declarations, both labels, the last writer's kind): # a `const Option = () => …` + `interface Option {…}` whose interface fields hang off an arrow, # and a `type Gran = …` + a field `Gran` -- only in application A. - mod_a = f"can://{APP_A}/typescript/a/mod.ts" + mod_a = f"can://{APP_A}/{APP_A}/typescript/a/mod.ts" merged = g.node(f"{mod_a}/Option", ["TSCallable", "TSInterface"], kind="arrow", signature="a/mod.Option", name="Option", start_line=11, end_line=12, code="() => 1") g.edge(mod_a, "TS_DECLARES", merged) g.edge(mod_a, "TS_DECLARES", merged) # the emitter writes one edge per facet; MERGE keeps one @@ -432,7 +433,7 @@ def fake_cypher(query: str, params: Dict[str, Any]) -> List[Dict[str, Any]]: raise AssertionError(f"statement has no RETURN: {query!r}") -_A_PREFIXES = (f"can://{APP_A}/",) +_A_PREFIXES = (f"can://{APP_A}/{APP_A}/",) def _responder(query: str, params: Dict[str, Any]) -> List[Dict[str, Any]]: @@ -458,7 +459,7 @@ def test_the_fake_graph_carries_no_module_property(): language was outermost) now over-asserts: a language-neutral ``@external`` ghost carries no language segment at all, and it is still one of application A's nodes.""" assert GRAPH.nodes and not any("_module" in props for _, props in GRAPH.nodes.values()) - prefixes = (f"can://{APP_A}/", f"can://{APP_B}/") + prefixes = (f"can://{APP_A}/{APP_A}/", f"can://{APP_B}/{APP_B}/") assert all(nid.startswith(prefixes) for nid, (labels, _) in GRAPH.nodes.items() if "CanNode" in labels and "TSModule" not in labels or nid.count("/") > 3) @@ -467,8 +468,8 @@ def test_the_scope_is_one_prefix(): that used to be here are still told apart in exactly one place -- ``_module_key``, which has to strip the language segment to reach the file key -- and nothing is scoped on them.""" backend = _backend() - assert backend._scope_prefix == f"can://{APP_A}/" - assert backend._language_prefixes == [f"can://{APP_A}/typescript/", f"can://{APP_A}/javascript/"] + assert backend._scope_prefix == f"can://{APP_A}/{APP_A}/" + assert backend._language_prefixes == [f"can://{APP_A}/{APP_A}/typescript/", f"can://{APP_A}/{APP_A}/javascript/"] assert set(backend._modules) == {"a/mod.ts", SHARED_MODULE, "a/legacy.js"} @@ -549,10 +550,10 @@ def test_call_graph_and_externals_are_application_scoped(): assert set(graph.edges) == {(METHOD_SIG, "alpha.inner_fn"), (METHOD_SIG, "os.path")} assert graph.nodes["os.path"]["kind"] == "external" assert list(backend.get_external_symbols()) == ["os.path"], "application B's external (os.join) leaked" - assert backend.get_external_symbols()["os.path"].id == f"can://{APP_A}/@external/os/path" + assert backend.get_external_symbols()["os.path"].id == f"can://{APP_A}/{APP_A}/@external/os/path" assert backend.get_calling_lines("alpha.inner_fn") == [5] assert backend.get_calling_lines("beta.inner_fn") == [] - assert set(backend.get_synthesized_callables()) == {f"can://{APP_A}/typescript/{SHARED_MODULE}/alpha_fn/"} + assert set(backend.get_synthesized_callables()) == {f"can://{APP_A}/{APP_A}/typescript/{SHARED_MODULE}/alpha_fn/"} def test_a_declaration_merged_node_is_the_facet_its_edge_and_labels_name_and_nothing_else(): @@ -572,7 +573,7 @@ def test_a_merged_node_whose_labels_name_no_single_facet_is_raised_as_a_defect() from cldk.utils.exceptions.exceptions import CodeanalyzerExecutionException backend = _backend() - parent = "can://app_a/typescript/x/y.ts" + parent = "can://app_a/app_a/typescript/x/y.ts" undecidable = {"id": f"{parent}/Z", "kind": "field", "name": "Z", "_labels": ["CanNode", "TSClass", "TSInterface"]} with pytest.raises(CodeanalyzerExecutionException, match=r"'Z' \(labels \['CanNode', 'TSClass', 'TSInterface'\], kind 'field'\).*one id for two declarations") as e: backend._declared(parent, {parent: [("TS_DECLARES", undecidable, {})]}) @@ -606,11 +607,11 @@ def test_locate_finds_the_innermost_callable_and_its_body_node(): r = _backend().locate("a/mod.ts", 5) assert r.callable.signature == METHOD_SIG and r.type is not None and r.type.signature == CLASS_SIG assert r.body is not None and r.body.kind == "call" - assert r.body.id == f"can://{APP_A}/typescript/a/mod.ts/Widget/render@5:3" + assert r.body.id == f"can://{APP_A}/{APP_A}/typescript/a/mod.ts/Widget/render@5:3" assert r.node_id == r.body.id # ``callee`` is a property on a TypeScript body node, so this backend fills it in -- unlike the # Python Neo4j backend, where callee resolution is a separate edge and the field stays None. - assert r.body.callee == f"can://{APP_A}/typescript/a/mod.ts/Widget/render@5:3".replace("@5:3", "/inner_fn") + assert r.body.callee == f"can://{APP_A}/{APP_A}/typescript/a/mod.ts/Widget/render@5:3".replace("@5:3", "/inner_fn") # Line-only span: the projection carries no columns and no offsets. assert r.body.span.start == (5, 0) and r.body.span.bytes == (0, 0) @@ -634,12 +635,12 @@ def test_locate_many_answers_in_input_order_including_the_misses(): def test_resolve_callable_honours_the_javascript_prefix(): n = _backend().resolve_callable("legacy_fn") assert n.callable == "a/legacy.legacy_fn" and n.file == "a/legacy.js" - assert n.ref == f"can://{APP_A}/javascript/a/legacy.js/legacy_fn" + assert n.ref == f"can://{APP_A}/{APP_A}/javascript/a/legacy.js/legacy_fn" def test_resolve_callable_does_not_see_another_applications_colliding_signature(): n = _backend().resolve_callable("Widget.render") - assert n.name == "alpha_method" and n.ref.startswith(f"can://{APP_A}/typescript/") + assert n.name == "alpha_method" and n.ref.startswith(f"can://{APP_A}/{APP_A}/typescript/") def test_resolve_callable_takes_the_dotted_module_form(): @@ -668,16 +669,16 @@ def test_a_declaration_merged_node_resolves_only_to_the_facet_its_kind_names(): def test_get_source_answers_for_a_callable_and_refuses_below_it(): backend = _backend() assert backend.get_source(METHOD_SIG) == "alpha code" - assert backend.get_source(f"can://{APP_A}/typescript/a/mod.ts/Widget/render") == "alpha code" + assert backend.get_source(f"can://{APP_A}/{APP_A}/typescript/a/mod.ts/Widget/render") == "alpha code" with pytest.raises(NotImplementedError): - backend.get_source(f"can://{APP_A}/typescript/a/mod.ts/Widget/render@5:3") + backend.get_source(f"can://{APP_A}/{APP_A}/typescript/a/mod.ts/Widget/render@5:3") with pytest.raises(KeyError): backend.get_source("no.such.thing") def test_get_source_does_not_answer_with_another_applications_text(): with pytest.raises(KeyError): - _backend().get_source(f"can://{APP_B}/typescript/b/mod.ts/Widget/render") + _backend().get_source(f"can://{APP_B}/{APP_B}/typescript/b/mod.ts/Widget/render") def test_describe_hydrates_a_callable_and_leaves_a_body_node_textless(): @@ -868,7 +869,6 @@ def _match_clauses(statement: str) -> List[str]: return out + [m.group(1) for m in _PATTERN_COMPREHENSION.finditer(statement)] - def _paths_with_scoped_interiors(rendered: str) -> Set[str]: """Path variables every one of whose nodes the statement pins, via ``all( IN nodes(

) WHERE … is scoped …)``. diff --git a/tests/analysis/typescript/test_typescript_neo4j_selection.py b/tests/analysis/typescript/test_typescript_neo4j_selection.py index d186d7a..655ff92 100644 --- a/tests/analysis/typescript/test_typescript_neo4j_selection.py +++ b/tests/analysis/typescript/test_typescript_neo4j_selection.py @@ -76,7 +76,7 @@ def test_no_config_uses_in_memory_backend(typescript_application): assert isinstance(analysis.backend_config, CodeAnalyzerConfig) # The in-process backend caches under a language-keyed /typescript subdir. _, kwargs = backend_cls.call_args - assert str(kwargs["analysis_json_path"]).endswith("/.codeanalyzer/typescript") + assert str(kwargs["analysis_json_path"].parent).endswith("/.codeanalyzer/typescript") def test_missing_neo4j_driver_raises_helpful_error(): diff --git a/tests/analysis/typescript/test_typescript_taint.py b/tests/analysis/typescript/test_typescript_taint.py index f3b7354..f9c381b 100644 --- a/tests/analysis/typescript/test_typescript_taint.py +++ b/tests/analysis/typescript/test_typescript_taint.py @@ -46,7 +46,7 @@ def _value(name: str, within: str) -> SliceNode: """A resolved value, addressed as this surface addresses one: a name plus the callable it enters.""" - return SliceNode(file="app.ts", line=1, callable=within, kind="parameter", name=name, ref=f"can://app/typescript/app.ts/{within}#{name}") + return SliceNode(file="app.ts", line=1, callable=within, kind="parameter", name=name, ref=f"can://app/app/typescript/app.ts/{within}#{name}") def _witness(frm: SliceNode, to: SliceNode) -> FlowPath: @@ -73,7 +73,7 @@ def resolve_value(self, name, *, within): return _value(name, within) def resolve_callable(self, name, *, in_class=None, in_module=None): - return SliceNode(file="app.ts", line=1, callable=name, kind="callable", name=None, ref=f"can://app/typescript/app.ts/{name}") + return SliceNode(file="app.ts", line=1, callable=name, kind="callable", name=None, ref=f"can://app/app/typescript/app.ts/{name}") def _edge_vars_in(self, callable_id): return self._edge_vars @@ -211,8 +211,8 @@ def test_the_sanitizer_selectors_are_resolved_through_the_edge_vars_hook(): which addresses only parameters.""" backend = _Recording() backend.taint([("x", "f")], [("y", "g")], sanitizers=[("answer", "f"), "scrub"]) - assert backend.walks[0]["cuts"] == [{"var": "answer", "prefix": "can://app/typescript/app.ts/f"}] - assert backend.walks[0]["cut_callables"] == ["can://app/typescript/app.ts/scrub"] + assert backend.walks[0]["cuts"] == [{"var": "answer", "prefix": "can://app/app/typescript/app.ts/f"}] + assert backend.walks[0]["cut_callables"] == ["can://app/app/typescript/app.ts/scrub"] def test_a_sanitizer_that_does_not_resolve_raises_before_the_walk(): @@ -285,8 +285,8 @@ def test_the_two_walk_hooks_are_abstract_methods(): #: way it is against a real graph's -- a body-node id embeds the module key and the graph stores no #: path to project instead. _MODULE = "app.ts" -_HANDLE = f"can://app/typescript/{_MODULE}/handle" -_SINK = f"can://app/typescript/{_MODULE}/query" +_HANDLE = f"can://app/app/typescript/{_MODULE}/handle" +_SINK = f"can://app/app/typescript/{_MODULE}/query" def _row(src: str, dst: str, *, var: str = "answer") -> dict: @@ -313,7 +313,7 @@ def _responder(query, params): if record is not None: record.append((query, dict(params))) if "TS_HAS_MODULE" in query: - return [{"k": _MODULE, "id": f"can://app/typescript/{_MODULE}"}] + return [{"k": _MODULE, "id": f"can://app/app/typescript/{_MODULE}"}] if "AS ok" in query: return [{"ok": True}] if "collect(DISTINCT r.var) AS vars" in query: @@ -342,7 +342,7 @@ def test_the_graph_walk_issues_the_generated_statement_and_binds_the_cap_one_pas "cuts": [{"var": "answer", "prefix": _HANDLE}], "cut_callables": [_SINK], "cap": 4, - "p": "can://app/", + "p": "can://app/app/", } @@ -364,9 +364,7 @@ def test_the_graph_walk_returns_every_row_untrimmed_and_keyed_by_the_pair_the_se The pairing comes from the statement's own ``a.id AS src`` / ``b.id AS dst`` and never from the order the rows arrive in: the m*n batching is only useful if the grouping survives it.""" src, dst = _value("raw", "handle"), _value("cleaned", "query") - rows, blocked = _graph(rows=[_row(src.ref, dst.ref), _row(src.ref, dst.ref, var="second")])._taint_walk( - [src], [dst], cuts=[], cut_callables=[], depth=None, max_paths=1 - ) + rows, blocked = _graph(rows=[_row(src.ref, dst.ref), _row(src.ref, dst.ref, var="second")])._taint_walk([src], [dst], cuts=[], cut_callables=[], depth=None, max_paths=1) assert [(r[0], r[1]) for r in rows] == [(src.ref, dst.ref)] * 2, "two rows for a cap of one: the extra row is what reports truncation" assert [r[2].hops[0].var for r in rows] == ["answer", "second"] assert blocked == {}, "Ruling I: an empty ledger is a refusal to file, argued in the walk's docstring" diff --git a/tests/models/go/test_go_models.py b/tests/models/go/test_go_models.py index ecad147..6f6c674 100644 --- a/tests/models/go/test_go_models.py +++ b/tests/models/go/test_go_models.py @@ -33,9 +33,9 @@ def test_real_corpus_envelope(litestream): assert litestream.schema_version == "2.0.0" assert litestream.language == "go" assert litestream.max_level == 2 - assert litestream.application.id == "can://go/litestream" + assert litestream.application.id == "can://litestream/litestream" assert len(litestream.application.symbol_table) == 55 - assert len(litestream.application.call_graph) == 959 + assert len(litestream.application.call_graph) == 3082 def test_real_corpus_struct_round_trips(litestream): @@ -52,7 +52,7 @@ def test_real_corpus_struct_round_trips(litestream): def test_real_corpus_call_edges_are_well_formed(litestream): """Every edge names a src and dst id under the application; prov/weight parse.""" - pre = "can://go/litestream/" + pre = "can://litestream/litestream/" for e in litestream.application.call_graph: assert e.src.startswith(pre) and e.dst.startswith(pre) assert isinstance(e.prov, list) and isinstance(e.weight, int) diff --git a/tests/models/java/test_java_models.py b/tests/models/java/test_java_models.py index 02137a8..673faae 100644 --- a/tests/models/java/test_java_models.py +++ b/tests/models/java/test_java_models.py @@ -46,8 +46,8 @@ def test_envelope_at_both_levels(a1: JAnalysis, a4: JAnalysis): assert a.max_level == level assert a.k_limit is None # never emitted by 3.0.x assert a.analyzer.name == "codeanalyzer-java" - assert a.analyzer.version == "3.1.0" - assert a.application.id == "can://java/daytrader8" + assert a.analyzer.version == "3.3.4" + assert a.application.id == "can://daytrader8/daytrader8" assert a.application.kind == "application" diff --git a/tests/models/python/test_python_models.py b/tests/models/python/test_python_models.py index 6000058..0a45ce6 100644 --- a/tests/models/python/test_python_models.py +++ b/tests/models/python/test_python_models.py @@ -1,17 +1,44 @@ def test_v2_models_are_reexported(): from cldk.models.python import ( - Span, BodyNode, CfgEdge, CdgEdge, DdgEdge, SummaryEdge, ParamEdge, - PyDecorator, PyEntrypoint, PyExternalSymbol, - PyArtifact, PyDependency, PyConfigKey, PyConfigUseEdge, PyAnalyzerInfo, + Span, + BodyNode, + CfgEdge, + CdgEdge, + DdgEdge, + SummaryEdge, + ParamEdge, + PyDecorator, + PyEntrypoint, + PyExternalSymbol, + PyArtifact, + PyDependency, + PyConfigKey, + PyConfigUseEdge, + PyAnalyzerInfo, ) - assert Span.model_fields.keys() >= {"start", "end", "bytes"} - assert "callee" in BodyNode.model_fields # the one sanctioned null slot - assert {"var", "prov"} <= DdgEdge.model_fields.keys() + from dataclasses import fields + + assert {f.name for f in fields(Span)} >= {"start", "end", "bytes"} + assert "callee" in {f.name for f in fields(BodyNode)} + assert {"var", "prov"} <= {f.name for f in fields(DdgEdge)} + def test_v1_names_still_exported(): """D4: the existing surface does not move.""" import cldk.models.python as m - for name in ("PyApplication", "PyCallEdge", "PyCallable", "PyCallableParameter", - "PyCallsite", "PyClass", "PyClassAttribute", "PyComment", "PyImport", - "PyModule", "PySymbol", "PyVariableDeclaration"): + + for name in ( + "PyApplication", + "PyCallEdge", + "PyCallable", + "PyCallableParameter", + "PyCallsite", + "PyClass", + "PyClassAttribute", + "PyComment", + "PyImport", + "PyModule", + "PySymbol", + "PyVariableDeclaration", + ): assert hasattr(m, name), name diff --git a/tests/models/typescript/test_ts_v2_models.py b/tests/models/typescript/test_ts_v2_models.py index 85d38e7..f563909 100644 --- a/tests/models/typescript/test_ts_v2_models.py +++ b/tests/models/typescript/test_ts_v2_models.py @@ -93,8 +93,8 @@ def test_every_level_validates(level: int): assert a.language == "typescript" assert a.max_level == level assert a.analyzer.name == "codeanalyzer-typescript" - assert a.analyzer.version == _pinned_version() - assert a.application.id == "can://slim" + assert a.analyzer.version == "1.6.4" # reviewed local producer fixture + assert a.application.id == "can://slim/slim" assert a.application.kind == "application" assert (a.k_limit is not None) == (level >= 3) @@ -109,7 +109,7 @@ def test_module_carries_source_and_content_hash(): app = _load(1).application m = next(iter(app.symbol_table.values())) assert m.kind == "module" - assert m.id.startswith("can://slim/typescript/") + assert m.id.startswith("can://slim/slim/typescript/") assert m.content_hash assert m.source and m.span.bytes[1] == len(m.source) @@ -187,7 +187,7 @@ def test_l4_formal_vertices_and_param_edges(): assert c.body["@formal_in:0"].kind == "formal_in" assert c.body["@formal_out"].kind == "formal_out" assert app.param_in and app.param_out - assert app.param_in[0].src.startswith("can://slim/typescript/") + assert app.param_in[0].src.startswith("can://slim/slim/typescript/") assert any(c.summary for c, _ in _all_callables(app)) @@ -197,7 +197,7 @@ def test_call_graph_edge_shape_and_externals(): assert isinstance(e, TSCallGraphEdge) assert set(TSCallGraphEdge.model_fields) == {"src", "dst", "prov", "weight"} assert e.src.startswith("can://") and e.dst.startswith("can://") - assert all(k.startswith("can://slim/@external/") for k in app.external_symbols) + assert all(k.startswith("can://slim/slim/@external/") for k in app.external_symbols) ext = next(iter(app.external_symbols.values())) assert ext.kind == "external" and ext.id in app.external_symbols assert app.synthesized_callables @@ -207,7 +207,7 @@ def test_call_graph_edge_shape_and_externals(): def test_artifact_layer(): app = _load(1).application art = next(iter(app.artifacts.values())) - assert art.kind == "artifact" and art.id.startswith("can://slim/artifact/") + assert art.kind == "artifact" and art.id.startswith("can://slim/slim/artifact/") assert art.sha256 and art.source assert any(ck.value is not None for a in app.artifacts.values() for ck in a.config_keys) assert app.dependencies == [] and app.unresolved_imports == [] diff --git a/tests/resources/go/analysis.json b/tests/resources/go/analysis.json index 5f47977..3c6d873 100644 --- a/tests/resources/go/analysis.json +++ b/tests/resources/go/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"go","max_level":2,"analyzer":{"name":"codeanalyzer-go","version":"0.1.0"},"application":{"id":"can://go/litestream","kind":"application","symbol_table":{"abs/replica_client.go":{"id":"can://go/litestream/abs/replica_client.go","kind":"module","span":{"start":[1,1],"end":[500,1],"bytes":[0,14566]},"package":"abs","source":"package abs\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror\"\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"abs\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"abs\"\n\n// MetadataKeyTimestamp is the metadata key for storing LTX file timestamps in Azure Blob Storage.\n// Azure metadata keys cannot contain hyphens, so we use litestreamtimestamp (C# identifier rules).\nconst MetadataKeyTimestamp = \"litestreamtimestamp\"\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to Azure Blob Storage.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tclient *azblob.Client\n\tlogger *slog.Logger\n\n\t// Azure credentials\n\tAccountName string\n\tAccountKey string\n\tSASToken string // SAS token for container-level access\n\tEndpoint string\n\n\t// Azure Blob Storage container information\n\tBucket string\n\tPath string\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: abs://[account-name@]container/path\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\t// Extract account name from userinfo if present (abs://account@container/path)\n\tif userinfo != nil {\n\t\tclient.AccountName = userinfo.Username()\n\t}\n\n\tclient.Bucket = host\n\tclient.Path = urlPath\n\tclient.Endpoint = query.Get(\"endpoint\")\n\n\tif client.Bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for abs replica URL\")\n\t}\n\n\treturn client, nil\n}\n\n// Type returns \"abs\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to Azure. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) (err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.client != nil {\n\t\treturn nil\n\t}\n\n\t// Validate required configuration\n\tif c.Bucket == \"\" {\n\t\treturn fmt.Errorf(\"abs: container name is required\")\n\t}\n\n\t// Construct \u0026 parse endpoint unless already set.\n\tendpoint := c.Endpoint\n\tif endpoint == \"\" {\n\t\tif c.AccountName == \"\" {\n\t\t\treturn fmt.Errorf(\"abs: account name is required when endpoint is not specified\")\n\t\t}\n\t\tendpoint = fmt.Sprintf(\"https://%s.blob.core.windows.net\", c.AccountName)\n\t}\n\n\t// Configure client options with retry policy\n\tclientOptions := \u0026azblob.ClientOptions{\n\t\tClientOptions: azcore.ClientOptions{\n\t\t\tRetry: policy.RetryOptions{\n\t\t\t\tMaxRetries: 10,\n\t\t\t\tRetryDelay: time.Second,\n\t\t\t\tMaxRetryDelay: 30 * time.Second,\n\t\t\t\tTryTimeout: 15 * time.Minute, // Reasonable timeout for blob operations\n\t\t\t\tStatusCodes: []int{\n\t\t\t\t\thttp.StatusRequestTimeout,\n\t\t\t\t\thttp.StatusTooManyRequests,\n\t\t\t\t\thttp.StatusInternalServerError,\n\t\t\t\t\thttp.StatusBadGateway,\n\t\t\t\t\thttp.StatusServiceUnavailable,\n\t\t\t\t\thttp.StatusGatewayTimeout,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTelemetry: policy.TelemetryOptions{\n\t\t\t\tApplicationID: \"litestream\",\n\t\t\t},\n\t\t},\n\t}\n\n\t// Check for SAS token first (highest priority for explicit credentials)\n\tsasToken := c.SASToken\n\tif sasToken == \"\" {\n\t\tsasToken = os.Getenv(\"LITESTREAM_AZURE_SAS_TOKEN\")\n\t}\n\n\t// Check if we have explicit credentials or should use default credential chain\n\taccountKey := c.AccountKey\n\tif accountKey == \"\" {\n\t\taccountKey = os.Getenv(\"LITESTREAM_AZURE_ACCOUNT_KEY\")\n\t}\n\n\t// Create Azure Blob Storage client with appropriate authentication\n\t// Priority: SAS token \u003e Shared key \u003e Default credential chain\n\tvar client *azblob.Client\n\tif sasToken != \"\" {\n\t\t// SAS token authentication - append token to endpoint URL\n\t\tif accountKey != \"\" {\n\t\t\tslog.Warn(\"both SAS token and account key configured, using SAS token\")\n\t\t} else {\n\t\t\tslog.Debug(\"using SAS token authentication\")\n\t\t}\n\t\t// Strip leading \"?\" if present to avoid double \"?\"\n\t\tendpointWithSAS := fmt.Sprintf(\"%s?%s\", endpoint, strings.TrimPrefix(sasToken, \"?\"))\n\t\tclient, err = azblob.NewClientWithNoCredential(endpointWithSAS, clientOptions)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create azure blob client with SAS token: %w\", err)\n\t\t}\n\t} else if accountKey != \"\" \u0026\u0026 c.AccountName != \"\" {\n\t\t// Use shared key authentication (existing behavior)\n\t\tslog.Debug(\"using shared key authentication\")\n\t\tcredential, err := azblob.NewSharedKeyCredential(c.AccountName, accountKey)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create shared key credential: %w\", err)\n\t\t}\n\t\tclient, err = azblob.NewClientWithSharedKeyCredential(endpoint, credential, clientOptions)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create azure blob client with shared key: %w\", err)\n\t\t}\n\t} else {\n\t\t// Use default credential chain (similar to AWS SDK default credential chain)\n\t\t// This includes:\n\t\t// - Environment variables (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID)\n\t\t// - Managed Identity (for Azure VMs, App Service, etc.)\n\t\t// - Azure CLI credentials\n\t\t// - Visual Studio Code credentials\n\t\tslog.Debug(\"using default credential chain (managed identity, Azure CLI, environment variables, etc.)\")\n\t\tcredential, err := azidentity.NewDefaultAzureCredential(nil)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create default azure credential: %w\", err)\n\t\t}\n\t\tclient, err = azblob.NewClient(endpoint, credential, clientOptions)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create azure blob client with default credential: %w\", err)\n\t\t}\n\t}\n\n\tc.client = client\n\treturn nil\n}\n\n// LTXFiles returns an iterator over all available LTX files.\n// Azure always uses accurate timestamps from metadata since they're included in LIST operations at zero cost.\n// The useMetadata parameter is ignored.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLTXFileIterator(ctx, c, level, seek), nil\n}\n\n// WriteLTXFile writes an LTX file to remote storage.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\trc := internal.NewReadCounter(io.MultiReader(\u0026buf, rd))\n\n\t// Upload blob with proper content type, access tier, and metadata\n\t// Azure metadata keys cannot contain hyphens, so use litestreamtimestamp\n\t_, err = c.client.UploadStream(ctx, c.Bucket, key, rc, \u0026azblob.UploadStreamOptions{\n\t\tHTTPHeaders: \u0026blob.HTTPHeaders{\n\t\t\tBlobContentType: to.Ptr(\"application/octet-stream\"),\n\t\t},\n\t\tAccessTier: to.Ptr(blob.AccessTierHot), // Use Hot tier as default\n\t\tMetadata: map[string]*string{\n\t\t\tMetadataKeyTimestamp: to.Ptr(timestamp.Format(time.RFC3339Nano)),\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"abs: cannot upload ltx file %q: %w\", key, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(rc.N()))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: rc.N(),\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// OpenLTXFile returns a reader for an LTX file.\n// Returns os.ErrNotExist if no matching min/max TXID is not found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\tresp, err := c.client.DownloadStream(ctx, c.Bucket, key, \u0026azblob.DownloadStreamOptions{\n\t\tRange: blob.HTTPRange{\n\t\t\tOffset: offset,\n\t\t\tCount: size,\n\t\t},\n\t})\n\n\tif isNotExists(err) {\n\t\treturn nil, os.ErrNotExist\n\t} else if err != nil {\n\t\treturn nil, fmt.Errorf(\"abs: cannot start new reader for %q: %w\", key, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\tif resp.ContentLength != nil {\n\t\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Add(float64(*resp.ContentLength))\n\t}\n\n\treturn resp.Body, nil\n}\n\n// DeleteLTXFiles deletes LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, info := range a {\n\t\tkey := litestream.LTXFilePath(c.Path, info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"key\", key)\n\n\t\t_, err := c.client.DeleteBlob(ctx, c.Bucket, key, nil)\n\t\tif isNotExists(err) {\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot delete ltx file %q: %w\", key, err)\n\t\t}\n\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\n// DeleteAll deletes all LTX files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t// List all blobs with the configured path prefix\n\tprefix := \"/\"\n\tif c.Path != \"\" {\n\t\tprefix = strings.TrimSuffix(c.Path, \"/\") + \"/\"\n\t}\n\n\tpager := c.client.NewListBlobsFlatPager(c.Bucket, \u0026azblob.ListBlobsFlatOptions{\n\t\tPrefix: \u0026prefix,\n\t\tInclude: azblob.ListBlobsInclude{Metadata: true},\n\t})\n\n\tfor pager.More() {\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"LIST\").Inc()\n\n\t\tresp, err := pager.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot list blobs: %w\", err)\n\t\t}\n\n\t\tfor _, item := range resp.Segment.BlobItems {\n\t\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\n\t\t\t_, err := c.client.DeleteBlob(ctx, c.Bucket, *item.Name, nil)\n\t\t\tif isNotExists(err) {\n\t\t\t\tcontinue\n\t\t\t} else if err != nil {\n\t\t\t\treturn fmt.Errorf(\"abs: cannot delete blob %q: %w\", *item.Name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype ltxFileIterator struct {\n\tctx context.Context\n\tcancel context.CancelFunc\n\tclient *ReplicaClient\n\tlevel int\n\tseek ltx.TXID\n\n\tpager *runtime.Pager[azblob.ListBlobsFlatResponse]\n\tpageItems []*ltx.FileInfo\n\tpageIndex int\n\n\tclosed bool\n\terr error\n\tinfo *ltx.FileInfo\n}\n\nfunc newLTXFileIterator(ctx context.Context, client *ReplicaClient, level int, seek ltx.TXID) *ltxFileIterator {\n\tctx, cancel := context.WithCancel(ctx)\n\n\titr := \u0026ltxFileIterator{\n\t\tctx: ctx,\n\t\tcancel: cancel,\n\t\tclient: client,\n\t\tlevel: level,\n\t\tseek: seek,\n\t}\n\n\t// Create paginator for listing blobs with level prefix\n\tdir := litestream.LTXLevelDir(client.Path, level)\n\tprefix := dir + \"/\"\n\n\titr.pager = client.client.NewListBlobsFlatPager(client.Bucket, \u0026azblob.ListBlobsFlatOptions{\n\t\tPrefix: \u0026prefix,\n\t\tInclude: azblob.ListBlobsInclude{Metadata: true},\n\t})\n\n\treturn itr\n}\n\nfunc (itr *ltxFileIterator) Close() (err error) {\n\titr.closed = true\n\titr.cancel()\n\treturn itr.err\n}\n\nfunc (itr *ltxFileIterator) Next() bool {\n\tif itr.closed || itr.err != nil {\n\t\treturn false\n\t}\n\n\t// Process blobs until we find a valid LTX file\n\tfor {\n\t\t// Load next page if needed\n\t\tif itr.pageItems == nil || itr.pageIndex \u003e= len(itr.pageItems) {\n\t\t\tif !itr.loadNextPage() {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// Process current item from page\n\t\tif itr.pageIndex \u003c len(itr.pageItems) {\n\t\t\titr.info = itr.pageItems[itr.pageIndex]\n\t\t\titr.pageIndex++\n\t\t\treturn true\n\t\t}\n\t}\n}\n\n// loadNextPage loads the next page of blobs and extracts valid LTX files\nfunc (itr *ltxFileIterator) loadNextPage() bool {\n\tif !itr.pager.More() {\n\t\treturn false\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"LIST\").Inc()\n\n\tresp, err := itr.pager.NextPage(itr.ctx)\n\tif err != nil {\n\t\titr.err = fmt.Errorf(\"abs: cannot list blobs: %w\", err)\n\t\treturn false\n\t}\n\n\t// Extract blob items directly from the response\n\titr.pageItems = nil\n\titr.pageIndex = 0\n\n\tfor _, item := range resp.Segment.BlobItems {\n\t\tkey := path.Base(*item.Name)\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(key)\n\t\tif err != nil {\n\t\t\tcontinue // Skip non-LTX files\n\t\t}\n\n\t\t// Build file info\n\t\tinfo := \u0026ltx.FileInfo{\n\t\t\tLevel: itr.level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: *item.Properties.ContentLength,\n\t\t}\n\n\t\t// Skip if below seek TXID\n\t\tif info.MinTXID \u003c itr.seek {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Skip if wrong level\n\t\tif info.Level != itr.level {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Always use accurate timestamp from metadata since it's zero-cost\n\t\t// Azure includes metadata in LIST operations, so no extra API call needed\n\t\tinfo.CreatedAt = item.Properties.CreationTime.UTC()\n\t\tif item.Metadata != nil {\n\t\t\tif ts, ok := item.Metadata[MetadataKeyTimestamp]; ok \u0026\u0026 ts != nil {\n\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, *ts); err == nil {\n\t\t\t\t\tinfo.CreatedAt = parsed\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\titr.pageItems = append(itr.pageItems, info)\n\t}\n\n\treturn len(itr.pageItems) \u003e 0 || itr.pager.More()\n}\n\nfunc (itr *ltxFileIterator) Err() error { return itr.err }\n\nfunc (itr *ltxFileIterator) Item() *ltx.FileInfo {\n\treturn itr.info\n}\n\nfunc isNotExists(err error) bool {\n\tvar respErr *azcore.ResponseError\n\tif errors.As(err, \u0026respErr) {\n\t\treturn respErr.ErrorCode == string(bloberror.BlobNotFound) || respErr.ErrorCode == string(bloberror.ContainerNotFound)\n\t}\n\treturn false\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[22,30]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[31,41]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[42,51]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[52,58]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[59,64]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[65,76]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[77,88]}},{"name":"url","path":"net/url","span":{"start":[11,1],"end":[11,11],"bytes":[89,99]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[100,105]}},{"name":"path","path":"path","span":{"start":[13,1],"end":[13,8],"bytes":[106,113]}},{"name":"strings","path":"strings","span":{"start":[14,1],"end":[14,11],"bytes":[114,124]}},{"name":"sync","path":"sync","span":{"start":[15,1],"end":[15,8],"bytes":[125,132]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[133,140]}},{"name":"azcore","path":"github.com/Azure/azure-sdk-for-go/sdk/azcore","span":{"start":[18,1],"end":[18,48],"bytes":[142,189]}},{"name":"policy","path":"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy","span":{"start":[19,1],"end":[19,55],"bytes":[190,244]}},{"name":"runtime","path":"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime","span":{"start":[20,1],"end":[20,56],"bytes":[245,300]}},{"name":"to","path":"github.com/Azure/azure-sdk-for-go/sdk/azcore/to","span":{"start":[21,1],"end":[21,51],"bytes":[301,351]}},{"name":"azidentity","path":"github.com/Azure/azure-sdk-for-go/sdk/azidentity","span":{"start":[22,1],"end":[22,52],"bytes":[352,403]}},{"name":"azblob","path":"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob","span":{"start":[23,1],"end":[23,56],"bytes":[404,459]}},{"name":"blob","path":"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob","span":{"start":[24,1],"end":[24,61],"bytes":[460,520]}},{"name":"bloberror","path":"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror","span":{"start":[25,1],"end":[25,66],"bytes":[521,586]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[26,1],"end":[26,27],"bytes":[587,613]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[28,1],"end":[28,37],"bytes":[615,651]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[29,1],"end":[29,46],"bytes":[652,697]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient","kind":"struct","span":{"start":[46,1],"end":[60,2],"bytes":[1263,1574]},"callables":{"github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","kind":"method","span":{"start":[320,1],"end":[357,2],"bytes":[10261,11259]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[320,1],"end":[320,63],"bytes":[10261,10323]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"321:12":{"kind":"call","span":{"start":[321,12],"end":[321,23],"bytes":[10335,10346]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"328:12":{"kind":"call","span":{"start":[328,12],"end":[328,43],"bytes":[10474,10505]},"callee":null},"331:11":{"kind":"call","span":{"start":[331,11],"end":[334,4],"bytes":[10526,10672]},"callee":null},"336:6":{"kind":"call","span":{"start":[336,6],"end":[336,18],"bytes":[10679,10691]},"callee":null},"337:3":{"kind":"call","span":{"start":[337,3],"end":[337,79],"bytes":[10696,10772]},"callee":null},"339:16":{"kind":"call","span":{"start":[339,16],"end":[339,35],"bytes":[10795,10814]},"callee":null},"341:11":{"kind":"call","span":{"start":[341,11],"end":[341,56],"bytes":[10843,10888]},"callee":null},"345:4":{"kind":"call","span":{"start":[345,4],"end":[345,82],"bytes":[10945,11023]},"callee":null},"347:14":{"kind":"call","span":{"start":[347,14],"end":[347,65],"bytes":[11044,11095]},"callee":null},"348:7":{"kind":"call","span":{"start":[348,7],"end":[348,23],"bytes":[11102,11118]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists"},"351:12":{"kind":"call","span":{"start":[351,12],"end":[351,73],"bytes":[11171,11232]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[296,1],"end":[317,2],"bytes":[9557,10223]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[296,1],"end":[296,87],"bytes":[9557,9643]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[296,1],"end":[296,87],"bytes":[9557,9643]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"297:12":{"kind":"call","span":{"start":[297,12],"end":[297,23],"bytes":[9655,9666]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"302:10":{"kind":"call","span":{"start":[302,10],"end":[302,80],"bytes":[9733,9803]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"304:3":{"kind":"call","span":{"start":[304,3],"end":[304,121],"bytes":[9807,9925]},"callee":null},"306:13":{"kind":"call","span":{"start":[306,13],"end":[306,57],"bytes":[9939,9983]},"callee":null},"307:6":{"kind":"call","span":{"start":[307,6],"end":[307,22],"bytes":[9989,10005]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists"},"310:11":{"kind":"call","span":{"start":[310,11],"end":[310,69],"bytes":[10055,10113]},"callee":null},"313:3":{"kind":"call","span":{"start":[313,3],"end":[313,81],"bytes":[10121,10199]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.Init":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","kind":"method","span":{"start":[101,1],"end":[205,2],"bytes":[2766,6407]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[101,1],"end":[101,64],"bytes":[2766,2829]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":15},"body":{"102:2":{"kind":"call","span":{"start":[102,2],"end":[102,13],"bytes":[2831,2842]},"callee":null},"103:8":{"kind":"call","span":{"start":[103,8],"end":[103,21],"bytes":[2850,2863]},"callee":null},"111:10":{"kind":"call","span":{"start":[111,10],"end":[111,55],"bytes":[2970,3015]},"callee":null},"118:11":{"kind":"call","span":{"start":[118,11],"end":[118,85],"bytes":[3153,3227]},"callee":null},"120:14":{"kind":"call","span":{"start":[120,14],"end":[120,76],"bytes":[3245,3307]},"callee":null},"149:14":{"kind":"call","span":{"start":[149,14],"end":[149,53],"bytes":[4095,4134]},"callee":null},"155:16":{"kind":"call","span":{"start":[155,16],"end":[155,57],"bytes":[4286,4327]},"callee":null},"164:4":{"kind":"call","span":{"start":[164,4],"end":[164,75],"bytes":[4601,4672]},"callee":null},"166:4":{"kind":"call","span":{"start":[166,4],"end":[166,48],"bytes":[4687,4731]},"callee":null},"169:22":{"kind":"call","span":{"start":[169,22],"end":[169,87],"bytes":[4811,4876]},"callee":null},"169:53":{"kind":"call","span":{"start":[169,53],"end":[169,86],"bytes":[4842,4875]},"callee":null},"170:17":{"kind":"call","span":{"start":[170,17],"end":[170,81],"bytes":[4893,4957]},"callee":null},"172:11":{"kind":"call","span":{"start":[172,11],"end":[172,85],"bytes":[4986,5060]},"callee":null},"176:3":{"kind":"call","span":{"start":[176,3],"end":[176,48],"bytes":[5175,5220]},"callee":null},"177:22":{"kind":"call","span":{"start":[177,22],"end":[177,78],"bytes":[5242,5298]},"callee":null},"179:11":{"kind":"call","span":{"start":[179,11],"end":[179,74],"bytes":[5327,5390]},"callee":null},"181:17":{"kind":"call","span":{"start":[181,17],"end":[181,93],"bytes":[5411,5487]},"callee":null},"183:11":{"kind":"call","span":{"start":[183,11],"end":[183,86],"bytes":[5516,5591]},"callee":null},"192:3":{"kind":"call","span":{"start":[192,3],"end":[192,106],"bytes":[5919,6022]},"callee":null},"193:22":{"kind":"call","span":{"start":[193,22],"end":[193,63],"bytes":[6044,6085]},"callee":null},"195:11":{"kind":"call","span":{"start":[195,11],"end":[195,77],"bytes":[6114,6180]},"callee":null},"197:17":{"kind":"call","span":{"start":[197,17],"end":[197,70],"bytes":[6201,6254]},"callee":null},"199:11":{"kind":"call","span":{"start":[199,11],"end":[199,94],"bytes":[6283,6366]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles","kind":"method","span":{"start":[210,1],"end":[215,2],"bytes":[6623,6861]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[210,1],"end":[210,126],"bytes":[6623,6748]}},{"name":"level","type":"int","span":{"start":[210,1],"end":[210,126],"bytes":[6623,6748]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[210,1],"end":[210,126],"bytes":[6623,6748]}},{"name":"useMetadata","type":"bool","span":{"start":[210,1],"end":[210,126],"bytes":[6623,6748]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"211:12":{"kind":"call","span":{"start":[211,12],"end":[211,23],"bytes":[6760,6771]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"214:9":{"kind":"call","span":{"start":[214,9],"end":[214,48],"bytes":[6815,6854]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator"}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[268,1],"end":[293,2],"bytes":[8682,9518]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"level","type":"int","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"offset","type":"int64","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"size","type":"int64","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"269:12":{"kind":"call","span":{"start":[269,12],"end":[269,23],"bytes":[8833,8844]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"273:9":{"kind":"call","span":{"start":[273,9],"end":[273,64],"bytes":[8889,8944]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"274:15":{"kind":"call","span":{"start":[274,15],"end":[279,4],"bytes":[8959,9103]},"callee":null},"281:5":{"kind":"call","span":{"start":[281,5],"end":[281,21],"bytes":[9109,9125]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists"},"284:15":{"kind":"call","span":{"start":[284,15],"end":[284,78],"bytes":[9195,9258]},"callee":null},"287:2":{"kind":"call","span":{"start":[287,2],"end":[287,77],"bytes":[9264,9339]},"callee":null},"289:3":{"kind":"call","span":{"start":[289,3],"end":[289,78],"bytes":[9380,9455]},"callee":null},"289:83":{"kind":"call","span":{"start":[289,83],"end":[289,111],"bytes":[9460,9488]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.SetLogger":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.SetLogger","kind":"method","span":{"start":[69,1],"end":[71,2],"bytes":[1763,1869]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[69,1],"end":[69,57],"bytes":[1763,1819]}}],"metrics":{"cyclomatic":1},"body":{"70:13":{"kind":"call","span":{"start":[70,13],"end":[70,48],"bytes":[1832,1867]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.Type":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Type","kind":"method","span":{"start":[96,1],"end":[98,2],"bytes":[2622,2689]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[218,1],"end":[264,2],"bytes":[6917,8563]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}},{"name":"level","type":"int","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}},{"name":"rd","type":"io.Reader","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"219:12":{"kind":"call","span":{"start":[219,12],"end":[219,23],"bytes":[7072,7083]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"223:9":{"kind":"call","span":{"start":[223,9],"end":[223,64],"bytes":[7128,7183]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"227:15":{"kind":"call","span":{"start":[227,15],"end":[227,37],"bytes":[7294,7316]},"callee":null},"230:17":{"kind":"call","span":{"start":[230,17],"end":[230,42],"bytes":[7372,7397]},"callee":null},"232:15":{"kind":"call","span":{"start":[232,15],"end":[232,71],"bytes":[7429,7485]},"callee":null},"234:15":{"kind":"call","span":{"start":[234,15],"end":[234,44],"bytes":[7503,7532]},"callee":null},"237:32":{"kind":"call","span":{"start":[237,32],"end":[237,56],"bytes":[7617,7641]},"callee":null},"237:8":{"kind":"call","span":{"start":[237,8],"end":[237,57],"bytes":[7593,7642]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter"},"241:11":{"kind":"call","span":{"start":[241,11],"end":[249,4],"bytes":[7797,8145]},"callee":null},"243:21":{"kind":"call","span":{"start":[243,21],"end":[243,55],"bytes":[7926,7960]},"callee":null},"245:15":{"kind":"call","span":{"start":[245,15],"end":[245,41],"bytes":[7981,8007]},"callee":null},"247:26":{"kind":"call","span":{"start":[247,26],"end":[247,68],"bytes":[8093,8135]},"callee":null},"247:33":{"kind":"call","span":{"start":[247,33],"end":[247,67],"bytes":[8100,8134]},"callee":null},"251:15":{"kind":"call","span":{"start":[251,15],"end":[251,73],"bytes":[8177,8235]},"callee":null},"254:2":{"kind":"call","span":{"start":[254,2],"end":[254,77],"bytes":[8241,8316]},"callee":null},"255:2":{"kind":"call","span":{"start":[255,2],"end":[255,77],"bytes":[8324,8399]},"callee":null},"255:82":{"kind":"call","span":{"start":[255,82],"end":[255,97],"bytes":[8404,8419]},"callee":null},"255:90":{"kind":"call","span":{"start":[255,90],"end":[255,96],"bytes":[8412,8418]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"},"261:14":{"kind":"call","span":{"start":[261,14],"end":[261,20],"bytes":[8522,8528]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"}}}},"fields":{"AccountKey":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/AccountKey","kind":"field","type":"string","span":{"start":[53,1],"end":[53,20],"bytes":[1397,1416]}},"AccountName":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/AccountName","kind":"field","type":"string","span":{"start":[52,1],"end":[52,20],"bytes":[1377,1396]}},"Bucket":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/Bucket","kind":"field","type":"string","span":{"start":[58,1],"end":[58,15],"bytes":[1543,1557]}},"Endpoint":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/Endpoint","kind":"field","type":"string","span":{"start":[55,1],"end":[55,20],"bytes":[1477,1496]}},"Path":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[59,1],"end":[59,15],"bytes":[1558,1572]}},"SASToken":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/SASToken","kind":"field","type":"string","span":{"start":[54,1],"end":[54,60],"bytes":[1417,1476]}},"client":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/client","kind":"field","type":"*github.com/Azure/azure-sdk-for-go/sdk/storage/azblob.Client","span":{"start":[48,1],"end":[48,23],"bytes":[1310,1332]}},"logger":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[49,1],"end":[49,21],"bytes":[1333,1353]}},"mu":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[47,1],"end":[47,19],"bytes":[1291,1309]}}}},"ltxFileIterator":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator","kind":"struct","span":{"start":[359,1],"end":[373,2],"bytes":[11261,11544]},"callables":{"github.com/benbjohnson/litestream/abs.ltxFileIterator.Close":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Close","kind":"method","span":{"start":[398,1],"end":[402,2],"bytes":[12130,12230]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"400:2":{"kind":"call","span":{"start":[400,2],"end":[400,14],"bytes":[12200,12212]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ltxFileIterator.Err":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Err","kind":"method","span":{"start":[487,1],"end":[487,59],"bytes":[14194,14252]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/abs.ltxFileIterator.Item":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Item","kind":"method","span":{"start":[489,1],"end":[491,2],"bytes":[14254,14323]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.Item","parameters":[],"return_type":"*github.com/superfly/ltx.FileInfo","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/abs.ltxFileIterator.Next":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Next","kind":"method","span":{"start":[404,1],"end":[425,2],"bytes":[12232,12699]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":6},"body":{"412:47":{"kind":"call","span":{"start":[412,47],"end":[412,65],"bytes":[12460,12478]},"callee":null},"413:8":{"kind":"call","span":{"start":[413,8],"end":[413,26],"bytes":[12488,12506]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage"},"419:22":{"kind":"call","span":{"start":[419,22],"end":[419,40],"bytes":[12593,12611]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","kind":"method","span":{"start":[428,1],"end":[485,2],"bytes":[12775,14192]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","parameters":[],"return_type":"bool","metrics":{"cyclomatic":10},"body":{"429:6":{"kind":"call","span":{"start":[429,6],"end":[429,22],"bytes":[12830,12846]},"callee":null},"433:2":{"kind":"call","span":{"start":[433,2],"end":[433,78],"bytes":[12869,12945]},"callee":null},"435:15":{"kind":"call","span":{"start":[435,15],"end":[435,42],"bytes":[12967,12994]},"callee":null},"437:13":{"kind":"call","span":{"start":[437,13],"end":[437,58],"bytes":[13024,13069]},"callee":null},"446:10":{"kind":"call","span":{"start":[446,10],"end":[446,31],"bytes":[13236,13257]},"callee":null},"447:28":{"kind":"call","span":{"start":[447,28],"end":[447,50],"bytes":[13285,13307]},"callee":null},"472:20":{"kind":"call","span":{"start":[472,20],"end":[472,54],"bytes":[13841,13875]},"callee":null},"475:23":{"kind":"call","span":{"start":[475,23],"end":[475,56],"bytes":[13997,14030]},"callee":null},"481:19":{"kind":"call","span":{"start":[481,19],"end":[481,46],"bytes":[14108,14135]},"callee":null},"484:35":{"kind":"call","span":{"start":[484,35],"end":[484,51],"bytes":[14174,14190]},"callee":null},"484:9":{"kind":"call","span":{"start":[484,9],"end":[484,27],"bytes":[14148,14166]},"callee":null}}}},"fields":{"cancel":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[361,1],"end":[361,27],"bytes":[11315,11341]}},"client":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/client","kind":"field","type":"*github.com/benbjohnson/litestream/abs.ReplicaClient","span":{"start":[362,1],"end":[362,23],"bytes":[11342,11364]}},"closed":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/closed","kind":"field","type":"bool","span":{"start":[370,1],"end":[370,13],"bytes":[11494,11506]}},"ctx":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/ctx","kind":"field","type":"context.Context","span":{"start":[360,1],"end":[360,24],"bytes":[11291,11314]}},"err":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/err","kind":"field","type":"error","span":{"start":[371,1],"end":[371,14],"bytes":[11507,11520]}},"info":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/info","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[372,1],"end":[372,22],"bytes":[11521,11542]}},"level":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/level","kind":"field","type":"int","span":{"start":[363,1],"end":[363,12],"bytes":[11365,11376]}},"pageIndex":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/pageIndex","kind":"field","type":"int","span":{"start":[368,1],"end":[368,15],"bytes":[11478,11492]}},"pageItems":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/pageItems","kind":"field","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[367,1],"end":[367,27],"bytes":[11451,11477]}},"pager":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/pager","kind":"field","type":"*github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime.Pager[github.com/Azure/azure-sdk-for-go/sdk/storage/azblob.ListBlobsFlatResponse]","span":{"start":[366,1],"end":[366,56],"bytes":[11395,11450]}},"seek":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/seek","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[364,1],"end":[364,17],"bytes":[11377,11393]}}}}},"functions":{"github.com/benbjohnson/litestream/abs.NewReplicaClient":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","kind":"function","span":{"start":[63,1],"end":[67,2],"bytes":[1637,1761]},"signature":"github.com/benbjohnson/litestream/abs.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/abs.ReplicaClient","metrics":{"cyclomatic":1},"body":{"65:11":{"kind":"call","span":{"start":[65,11],"end":[65,25],"bytes":[1712,1726]},"callee":null}}},"github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","kind":"function","span":{"start":[76,1],"end":[93,2],"bytes":[2058,2578]},"signature":"github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}},{"name":"host","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}},{"name":"urlPath","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}},{"name":"query","type":"net/url.Values","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"77:12":{"kind":"call","span":{"start":[77,12],"end":[77,30],"bytes":[2206,2224]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient"},"81:24":{"kind":"call","span":{"start":[81,24],"end":[81,43],"bytes":[2352,2371]},"callee":null},"86:20":{"kind":"call","span":{"start":[86,20],"end":[86,41],"bytes":[2440,2461]},"callee":null},"89:15":{"kind":"call","span":{"start":[89,15],"end":[89,64],"bytes":[2503,2552]},"callee":null}}},"github.com/benbjohnson/litestream/abs.init":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.init","kind":"function","span":{"start":[32,1],"end":[34,2],"bytes":[701,789]},"signature":"github.com/benbjohnson/litestream/abs.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"33:2":{"kind":"call","span":{"start":[33,2],"end":[33,73],"bytes":[716,787]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/abs.isNotExists":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","kind":"function","span":{"start":[493,1],"end":[499,2],"bytes":[14325,14565]},"signature":"github.com/benbjohnson/litestream/abs.isNotExists","parameters":[{"name":"err","type":"error","span":{"start":[493,1],"end":[493,35],"bytes":[14325,14359]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"495:5":{"kind":"call","span":{"start":[495,5],"end":[495,29],"bytes":[14399,14423]},"callee":null},"496:31":{"kind":"call","span":{"start":[496,31],"end":[496,61],"bytes":[14456,14486]},"callee":null},"496:86":{"kind":"call","span":{"start":[496,86],"end":[496,121],"bytes":[14511,14546]},"callee":null}}},"github.com/benbjohnson/litestream/abs.newLTXFileIterator":{"id":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator","kind":"function","span":{"start":[375,1],"end":[396,2],"bytes":[11546,12128]},"signature":"github.com/benbjohnson/litestream/abs.newLTXFileIterator","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[375,1],"end":[375,113],"bytes":[11546,11658]}},{"name":"client","type":"*github.com/benbjohnson/litestream/abs.ReplicaClient","span":{"start":[375,1],"end":[375,113],"bytes":[11546,11658]}},{"name":"level","type":"int","span":{"start":[375,1],"end":[375,113],"bytes":[11546,11658]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[375,1],"end":[375,113],"bytes":[11546,11658]}}],"return_type":"*github.com/benbjohnson/litestream/abs.ltxFileIterator","metrics":{"cyclomatic":1},"body":{"376:17":{"kind":"call","span":{"start":[376,17],"end":[376,40],"bytes":[11675,11698]},"callee":null},"387:9":{"kind":"call","span":{"start":[387,9],"end":[387,51],"bytes":[11879,11921]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"390:14":{"kind":"call","span":{"start":[390,14],"end":[393,4],"bytes":[11957,12113]},"callee":null}}}},"content_hash":"c7db1d1f59a3eba397f1aaf250de94ac365294a2e7006e25b32337d5bd5f5c63"},"cmd/litestream-test/load.go":{"id":"can://go/litestream/cmd/litestream-test/load.go","kind":"module","span":{"start":[1,1],"end":[334,1],"bytes":[0,8040]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\tcryptorand \"crypto/rand\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math/rand\"\n\t\"os\"\n\t\"os/signal\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"syscall\"\n\t\"time\"\n\n\t_ \"github.com/mattn/go-sqlite3\"\n)\n\ntype LoadCommand struct {\n\tMain *Main\n\n\tDB string\n\tWriteRate int\n\tDuration time.Duration\n\tPattern string\n\tPayloadSize int\n\tReadRatio float64\n\tWorkers int\n}\n\ntype LoadStats struct {\n\twrites int64\n\treads int64\n\terrors int64\n\tstartTime time.Time\n\tlastReport time.Time\n\tmu sync.Mutex\n}\n\nfunc (c *LoadCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test load\", flag.ExitOnError)\n\tfs.StringVar(\u0026c.DB, \"db\", \"\", \"Database path (required)\")\n\tfs.IntVar(\u0026c.WriteRate, \"write-rate\", 100, \"Writes per second\")\n\tfs.DurationVar(\u0026c.Duration, \"duration\", 1*time.Minute, \"How long to run\")\n\tfs.StringVar(\u0026c.Pattern, \"pattern\", \"constant\", \"Write pattern (constant, burst, random, wave)\")\n\tfs.IntVar(\u0026c.PayloadSize, \"payload-size\", 1024, \"Size of each write operation in bytes\")\n\tfs.Float64Var(\u0026c.ReadRatio, \"read-ratio\", 0.2, \"Read/write ratio (0.0-1.0)\")\n\tfs.IntVar(\u0026c.Workers, \"workers\", 1, \"Number of concurrent workers\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif c.DB == \"\" {\n\t\treturn fmt.Errorf(\"database path required\")\n\t}\n\n\tif _, err := os.Stat(c.DB); err != nil {\n\t\treturn fmt.Errorf(\"database does not exist: %w\", err)\n\t}\n\n\tslog.Info(\"Starting load generation\",\n\t\t\"db\", c.DB,\n\t\t\"write_rate\", c.WriteRate,\n\t\t\"duration\", c.Duration,\n\t\t\"pattern\", c.Pattern,\n\t\t\"payload_size\", c.PayloadSize,\n\t\t\"read_ratio\", c.ReadRatio,\n\t\t\"workers\", c.Workers,\n\t)\n\n\treturn c.generateLoad(ctx)\n}\n\nfunc (c *LoadCommand) generateLoad(ctx context.Context) error {\n\tdb, err := sql.Open(\"sqlite3\", c.DB+\"?_journal_mode=WAL\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database: %w\", err)\n\t}\n\tdefer db.Close()\n\n\tdb.SetMaxOpenConns(c.Workers + 1)\n\tdb.SetMaxIdleConns(c.Workers)\n\n\tif err := c.ensureTestTable(db); err != nil {\n\t\treturn fmt.Errorf(\"ensure test table: %w\", err)\n\t}\n\n\tctx, cancel := context.WithTimeout(ctx, c.Duration)\n\tdefer cancel()\n\n\tsigChan := make(chan os.Signal, 1)\n\tsignal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)\n\tgo func() {\n\t\t\u003c-sigChan\n\t\tslog.Info(\"Received interrupt signal, stopping load generation\")\n\t\tcancel()\n\t}()\n\n\tstats := \u0026LoadStats{\n\t\tstartTime: time.Now(),\n\t\tlastReport: time.Now(),\n\t}\n\n\tvar wg sync.WaitGroup\n\tfor i := 0; i \u003c c.Workers; i++ {\n\t\twg.Add(1)\n\t\tgo func(workerID int) {\n\t\t\tdefer wg.Done()\n\t\t\tc.worker(ctx, db, workerID, stats)\n\t\t}(i)\n\t}\n\n\tgo c.reportStats(ctx, stats)\n\n\twg.Wait()\n\n\tc.finalReport(stats)\n\treturn nil\n}\n\nfunc (c *LoadCommand) worker(ctx context.Context, db *sql.DB, workerID int, stats *LoadStats) {\n\tticker := time.NewTicker(time.Second / time.Duration(c.WriteRate/c.Workers))\n\tdefer ticker.Stop()\n\n\tdata := make([]byte, c.PayloadSize)\n\tcryptorand.Read(data)\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn\n\t\tcase \u003c-ticker.C:\n\t\t\t// calculateRate() returns a modulation factor (not a multiplier\n\t\t\t// on the number of ops). The ticker already fires at the base\n\t\t\t// write-rate, so rate is used only to gate whether this tick\n\t\t\t// produces an operation: \u003c=0 means skip, \u003c1 means probabilistic,\n\t\t\t// \u003e=1 means always fire.\n\t\t\trate := c.calculateRate(stats)\n\t\t\tif rate \u003c= 0 || (rate \u003c 1.0 \u0026\u0026 rand.Float64() \u003e rate) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif rand.Float64() \u003c c.ReadRatio {\n\t\t\t\tif err := c.performRead(db); err != nil {\n\t\t\t\t\tatomic.AddInt64(\u0026stats.errors, 1)\n\t\t\t\t\tslog.Error(\"Read failed\", \"error\", err)\n\t\t\t\t} else {\n\t\t\t\t\tatomic.AddInt64(\u0026stats.reads, 1)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err := c.performWrite(db, data); err != nil {\n\t\t\t\t\tatomic.AddInt64(\u0026stats.errors, 1)\n\t\t\t\t\tslog.Error(\"Write failed\", \"error\", err)\n\t\t\t\t} else {\n\t\t\t\t\tatomic.AddInt64(\u0026stats.writes, 1)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (c *LoadCommand) calculateRate(stats *LoadStats) float64 {\n\telapsed := time.Since(stats.startTime).Seconds()\n\n\tswitch c.Pattern {\n\tcase \"burst\":\n\t\tif int(elapsed)%10 \u003c 3 {\n\t\t\treturn 2.0\n\t\t}\n\t\treturn 0.0\n\tcase \"random\":\n\t\treturn rand.Float64() * 2.0\n\tcase \"wave\":\n\t\treturn 1.0 + 0.4*sinApprox(elapsed/10.0)\n\tdefault:\n\t\treturn 1.0\n\t}\n}\n\nfunc sinApprox(x float64) float64 {\n\tconst twoPi = 2 * 3.14159265359\n\tx = x - float64(int(x/twoPi))*twoPi\n\n\tif x \u003c 3.14159265359 {\n\t\treturn 4 * x * (3.14159265359 - x) / (3.14159265359 * 3.14159265359)\n\t}\n\tx = x - 3.14159265359\n\treturn -4 * x * (3.14159265359 - x) / (3.14159265359 * 3.14159265359)\n}\n\nfunc (c *LoadCommand) ensureTestTable(db *sql.DB) error {\n\tcreateSQL := `\n\t\tCREATE TABLE IF NOT EXISTS load_test (\n\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\tdata BLOB,\n\t\t\ttext_field TEXT,\n\t\t\tint_field INTEGER,\n\t\t\ttimestamp INTEGER\n\t\t)\n\t`\n\t_, err := db.Exec(createSQL)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create table: %w\", err)\n\t}\n\n\t_, err = db.Exec(\"CREATE INDEX IF NOT EXISTS idx_load_test_timestamp ON load_test(timestamp)\")\n\treturn err\n}\n\nfunc (c *LoadCommand) performWrite(db *sql.DB, data []byte) error {\n\ttextField := fmt.Sprintf(\"load_%d\", time.Now().UnixNano())\n\tintField := rand.Int63()\n\ttimestamp := time.Now().Unix()\n\n\t_, err := db.Exec(`\n\t\tINSERT INTO load_test (data, text_field, int_field, timestamp)\n\t\tVALUES (?, ?, ?, ?)\n\t`, data, textField, intField, timestamp)\n\n\treturn err\n}\n\nfunc (c *LoadCommand) performRead(db *sql.DB) error {\n\tvar count int\n\tquery := `SELECT COUNT(*) FROM load_test WHERE timestamp \u003e ?`\n\ttimestamp := time.Now().Add(-1 * time.Hour).Unix()\n\n\treturn db.QueryRow(query, timestamp).Scan(\u0026count)\n}\n\nfunc (c *LoadCommand) reportStats(ctx context.Context, stats *LoadStats) {\n\tticker := time.NewTicker(5 * time.Second)\n\tdefer ticker.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn\n\t\tcase \u003c-ticker.C:\n\t\t\tstats.mu.Lock()\n\t\t\telapsed := time.Since(stats.lastReport).Seconds()\n\t\t\twrites := atomic.LoadInt64(\u0026stats.writes)\n\t\t\treads := atomic.LoadInt64(\u0026stats.reads)\n\t\t\terrors := atomic.LoadInt64(\u0026stats.errors)\n\n\t\t\twriteRate := float64(writes) / elapsed\n\t\t\treadRate := float64(reads) / elapsed\n\n\t\t\tslog.Info(\"Load statistics\",\n\t\t\t\t\"writes_per_sec\", fmt.Sprintf(\"%.1f\", writeRate),\n\t\t\t\t\"reads_per_sec\", fmt.Sprintf(\"%.1f\", readRate),\n\t\t\t\t\"total_writes\", writes,\n\t\t\t\t\"total_reads\", reads,\n\t\t\t\t\"errors\", errors,\n\t\t\t\t\"elapsed\", time.Since(stats.startTime).Round(time.Second),\n\t\t\t)\n\n\t\t\tatomic.StoreInt64(\u0026stats.writes, 0)\n\t\t\tatomic.StoreInt64(\u0026stats.reads, 0)\n\t\t\tstats.lastReport = time.Now()\n\t\t\tstats.mu.Unlock()\n\t\t}\n\t}\n}\n\nfunc (c *LoadCommand) finalReport(stats *LoadStats) {\n\ttotalTime := time.Since(stats.startTime)\n\twrites := atomic.LoadInt64(\u0026stats.writes)\n\treads := atomic.LoadInt64(\u0026stats.reads)\n\terrors := atomic.LoadInt64(\u0026stats.errors)\n\n\tslog.Info(\"Load generation complete\",\n\t\t\"duration\", totalTime.Round(time.Second),\n\t\t\"total_writes\", writes,\n\t\t\"total_reads\", reads,\n\t\t\"total_errors\", errors,\n\t\t\"avg_writes_per_sec\", fmt.Sprintf(\"%.1f\", float64(writes)/totalTime.Seconds()),\n\t\t\"avg_reads_per_sec\", fmt.Sprintf(\"%.1f\", float64(reads)/totalTime.Seconds()),\n\t)\n}\n\nfunc (c *LoadCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nGenerate continuous load on a SQLite database for testing.\n\nUsage:\n\n\tlitestream-test load [options]\n\nOptions:\n\n\t-db PATH\n\t Database path (required)\n\n\t-write-rate RATE\n\t Target writes per second\n\t Default: 100\n\n\t-duration DURATION\n\t How long to run (e.g., \"10m\", \"1h\")\n\t Default: 1m\n\n\t-pattern PATTERN\n\t Write pattern: constant, burst, random, wave\n\t Default: constant\n\n\t-payload-size SIZE\n\t Size of each write operation in bytes\n\t Default: 1024\n\n\t-read-ratio RATIO\n\t Read/write ratio (0.0-1.0)\n\t Default: 0.2\n\n\t-workers COUNT\n\t Number of concurrent workers\n\t Default: 1\n\nExamples:\n\n\t# Generate constant load for 10 minutes\n\tlitestream-test load -db /tmp/test.db -write-rate 100 -duration 10m\n\n\t# Generate burst pattern load\n\tlitestream-test load -db /tmp/test.db -pattern burst -duration 1h\n\n\t# Heavy write load with multiple workers\n\tlitestream-test load -db /tmp/test.db -write-rate 1000 -workers 4 -read-ratio 0.1\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"rand","path":"crypto/rand","alias":"cryptorand","span":{"start":[5,1],"end":[5,26],"bytes":[34,59]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[60,75]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[76,83]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[84,90]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[91,102]}},{"name":"rand","path":"math/rand","span":{"start":[10,1],"end":[10,13],"bytes":[103,115]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[116,121]}},{"name":"signal","path":"os/signal","span":{"start":[12,1],"end":[12,13],"bytes":[122,134]}},{"name":"sync","path":"sync","span":{"start":[13,1],"end":[13,8],"bytes":[135,142]}},{"name":"atomic","path":"sync/atomic","span":{"start":[14,1],"end":[14,15],"bytes":[143,157]}},{"name":"syscall","path":"syscall","span":{"start":[15,1],"end":[15,11],"bytes":[158,168]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[169,176]}},{"name":"go-sqlite3","path":"github.com/mattn/go-sqlite3","alias":"_","span":{"start":[18,1],"end":[18,33],"bytes":[178,210]}}],"types":{"LoadCommand":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand","kind":"struct","span":{"start":[21,1],"end":[31,2],"bytes":[214,393]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","kind":"method","span":{"start":[42,1],"end":[75,2],"bytes":[543,1709]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[42,1],"end":[42,70],"bytes":[543,612]}},{"name":"args","type":"[]string","span":{"start":[42,1],"end":[42,70],"bytes":[543,612]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"43:8":{"kind":"call","span":{"start":[43,8],"end":[43,65],"bytes":[620,677]},"callee":null},"44:2":{"kind":"call","span":{"start":[44,2],"end":[44,59],"bytes":[679,736]},"callee":null},"45:2":{"kind":"call","span":{"start":[45,2],"end":[45,65],"bytes":[738,801]},"callee":null},"46:2":{"kind":"call","span":{"start":[46,2],"end":[46,75],"bytes":[803,876]},"callee":null},"47:2":{"kind":"call","span":{"start":[47,2],"end":[47,98],"bytes":[878,974]},"callee":null},"48:2":{"kind":"call","span":{"start":[48,2],"end":[48,90],"bytes":[976,1064]},"callee":null},"49:2":{"kind":"call","span":{"start":[49,2],"end":[49,78],"bytes":[1066,1142]},"callee":null},"50:2":{"kind":"call","span":{"start":[50,2],"end":[50,69],"bytes":[1144,1211]},"callee":null},"52:12":{"kind":"call","span":{"start":[52,12],"end":[52,26],"bytes":[1243,1257]},"callee":null},"57:10":{"kind":"call","span":{"start":[57,10],"end":[57,46],"bytes":[1315,1351]},"callee":null},"60:15":{"kind":"call","span":{"start":[60,15],"end":[60,28],"bytes":[1370,1383]},"callee":null},"61:10":{"kind":"call","span":{"start":[61,10],"end":[61,56],"bytes":[1407,1453]},"callee":null},"64:2":{"kind":"call","span":{"start":[64,2],"end":[72,3],"bytes":[1459,1678]},"callee":null},"74:9":{"kind":"call","span":{"start":[74,9],"end":[74,28],"bytes":[1688,1707]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Usage":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Usage","kind":"method","span":{"start":[285,1],"end":[333,2],"bytes":[7012,8039]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"286:2":{"kind":"call","span":{"start":[286,2],"end":[332,7],"bytes":[7045,8037]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","kind":"method","span":{"start":[165,1],"end":[181,2],"bytes":[3859,4197]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","parameters":[{"name":"stats","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","span":{"start":[165,1],"end":[165,64],"bytes":[3859,3922]}}],"return_type":"float64","metrics":{"cyclomatic":7},"body":{"166:13":{"kind":"call","span":{"start":[166,13],"end":[166,40],"bytes":[3935,3962]},"callee":null},"170:6":{"kind":"call","span":{"start":[170,6],"end":[170,18],"bytes":[4014,4026]},"callee":null},"175:10":{"kind":"call","span":{"start":[175,10],"end":[175,24],"bytes":[4092,4106]},"callee":null},"177:20":{"kind":"call","span":{"start":[177,20],"end":[177,43],"bytes":[4146,4169]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable","kind":"method","span":{"start":[194,1],"end":[211,2],"bytes":[4501,4946]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[194,1],"end":[194,58],"bytes":[4501,4558]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"204:12":{"kind":"call","span":{"start":[204,12],"end":[204,30],"bytes":[4752,4770]},"callee":null},"206:10":{"kind":"call","span":{"start":[206,10],"end":[206,45],"bytes":[4797,4832]},"callee":null},"209:11":{"kind":"call","span":{"start":[209,11],"end":[209,96],"bytes":[4847,4932]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","kind":"method","span":{"start":[269,1],"end":[283,2],"bytes":[6461,7010]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","parameters":[{"name":"stats","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","span":{"start":[269,1],"end":[269,54],"bytes":[6461,6514]}}],"metrics":{"cyclomatic":1},"body":{"270:15":{"kind":"call","span":{"start":[270,15],"end":[270,42],"bytes":[6529,6556]},"callee":null},"271:12":{"kind":"call","span":{"start":[271,12],"end":[271,43],"bytes":[6568,6599]},"callee":null},"272:11":{"kind":"call","span":{"start":[272,11],"end":[272,41],"bytes":[6610,6640]},"callee":null},"273:12":{"kind":"call","span":{"start":[273,12],"end":[273,43],"bytes":[6652,6683]},"callee":null},"275:2":{"kind":"call","span":{"start":[275,2],"end":[282,3],"bytes":[6686,7008]},"callee":null},"276:15":{"kind":"call","span":{"start":[276,15],"end":[276,43],"bytes":[6738,6766]},"callee":null},"280:25":{"kind":"call","span":{"start":[280,25],"end":[280,81],"bytes":[6868,6924]},"callee":null},"280:45":{"kind":"call","span":{"start":[280,45],"end":[280,60],"bytes":[6888,6903]},"callee":null},"280:61":{"kind":"call","span":{"start":[280,61],"end":[280,80],"bytes":[6904,6923]},"callee":null},"281:24":{"kind":"call","span":{"start":[281,24],"end":[281,79],"bytes":[6949,7004]},"callee":null},"281:44":{"kind":"call","span":{"start":[281,44],"end":[281,58],"bytes":[6969,6983]},"callee":null},"281:59":{"kind":"call","span":{"start":[281,59],"end":[281,78],"bytes":[6984,7003]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","kind":"method","span":{"start":[77,1],"end":[122,2],"bytes":[1711,2676]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[77,1],"end":[77,64],"bytes":[1711,1774]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"103:15":{"kind":"call","span":{"start":[103,15],"end":[103,25],"bytes":[2393,2403]},"callee":null},"104:15":{"kind":"call","span":{"start":[104,15],"end":[104,25],"bytes":[2419,2429]},"callee":null},"109:3":{"kind":"call","span":{"start":[109,3],"end":[109,12],"bytes":[2494,2503]},"callee":null},"110:6":{"kind":"call","span":{"start":[110,6],"end":[113,7],"bytes":[2509,2593]},"callee":null,"is_goroutine":true},"116:5":{"kind":"call","span":{"start":[116,5],"end":[116,30],"bytes":[2602,2627]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","is_goroutine":true},"118:2":{"kind":"call","span":{"start":[118,2],"end":[118,11],"bytes":[2630,2639]},"callee":null},"120:2":{"kind":"call","span":{"start":[120,2],"end":[120,22],"bytes":[2642,2662]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport"},"78:13":{"kind":"call","span":{"start":[78,13],"end":[78,59],"bytes":[1787,1833]},"callee":null},"80:10":{"kind":"call","span":{"start":[80,10],"end":[80,46],"bytes":[1860,1896]},"callee":null},"82:8":{"kind":"call","span":{"start":[82,8],"end":[82,18],"bytes":[1907,1917]},"callee":null},"84:2":{"kind":"call","span":{"start":[84,2],"end":[84,35],"bytes":[1920,1953]},"callee":null},"85:2":{"kind":"call","span":{"start":[85,2],"end":[85,31],"bytes":[1955,1984]},"callee":null},"87:12":{"kind":"call","span":{"start":[87,12],"end":[87,33],"bytes":[1997,2018]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable"},"88:10":{"kind":"call","span":{"start":[88,10],"end":[88,50],"bytes":[2042,2082]},"callee":null},"91:17":{"kind":"call","span":{"start":[91,17],"end":[91,53],"bytes":[2103,2139]},"callee":null},"92:8":{"kind":"call","span":{"start":[92,8],"end":[92,16],"bytes":[2147,2155]},"callee":null},"94:13":{"kind":"call","span":{"start":[94,13],"end":[94,36],"bytes":[2169,2192]},"callee":null},"95:2":{"kind":"call","span":{"start":[95,2],"end":[95,55],"bytes":[2194,2247]},"callee":null},"96:5":{"kind":"call","span":{"start":[96,5],"end":[100,5],"bytes":[2252,2355]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_1","kind":"function","span":{"start":[96,1],"end":[100,5],"bytes":[2248,2355]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_1","parameters":[],"body":{"98:3":{"kind":"call","span":{"start":[98,3],"end":[98,67],"bytes":[2275,2339]},"callee":null},"99:3":{"kind":"call","span":{"start":[99,3],"end":[99,11],"bytes":[2342,2350]},"callee":null}}},"closure_2":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_2","kind":"function","span":{"start":[110,1],"end":[113,7],"bytes":[2504,2593]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_2","parameters":[{"name":"workerID","type":"int","span":{"start":[110,1],"end":[110,26],"bytes":[2504,2529]}}],"body":{"111:10":{"kind":"call","span":{"start":[111,10],"end":[111,19],"bytes":[2539,2548]},"callee":null},"112:4":{"kind":"call","span":{"start":[112,4],"end":[112,38],"bytes":[2552,2586]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","kind":"method","span":{"start":[226,1],"end":[232,2],"bytes":[5301,5538]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[226,1],"end":[226,54],"bytes":[5301,5354]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"229:15":{"kind":"call","span":{"start":[229,15],"end":[229,25],"bytes":[5447,5457]},"callee":null},"231:9":{"kind":"call","span":{"start":[231,9],"end":[231,38],"bytes":[5494,5523]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","kind":"method","span":{"start":[213,1],"end":[224,2],"bytes":[4948,5299]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[213,1],"end":[213,68],"bytes":[4948,5015]}},{"name":"data","type":"[]byte","span":{"start":[213,1],"end":[213,68],"bytes":[4948,5015]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"214:15":{"kind":"call","span":{"start":[214,15],"end":[214,60],"bytes":[5030,5075]},"callee":null},"214:38":{"kind":"call","span":{"start":[214,38],"end":[214,48],"bytes":[5053,5063]},"callee":null},"215:14":{"kind":"call","span":{"start":[215,14],"end":[215,26],"bytes":[5089,5101]},"callee":null},"216:15":{"kind":"call","span":{"start":[216,15],"end":[216,25],"bytes":[5116,5126]},"callee":null},"218:12":{"kind":"call","span":{"start":[218,12],"end":[221,42],"bytes":[5146,5284]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","kind":"method","span":{"start":[234,1],"end":[267,2],"bytes":[5540,6459]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[234,1],"end":[234,75],"bytes":[5540,5614]}},{"name":"stats","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","span":{"start":[234,1],"end":[234,75],"bytes":[5540,5614]}}],"metrics":{"cyclomatic":5},"body":{"235:12":{"kind":"call","span":{"start":[235,12],"end":[235,43],"bytes":[5626,5657]},"callee":null},"236:8":{"kind":"call","span":{"start":[236,8],"end":[236,21],"bytes":[5665,5678]},"callee":null},"240:10":{"kind":"call","span":{"start":[240,10],"end":[240,20],"bytes":[5707,5717]},"callee":null},"243:4":{"kind":"call","span":{"start":[243,4],"end":[243,19],"bytes":[5751,5766]},"callee":null},"244:15":{"kind":"call","span":{"start":[244,15],"end":[244,43],"bytes":[5781,5809]},"callee":null},"245:14":{"kind":"call","span":{"start":[245,14],"end":[245,45],"bytes":[5833,5864]},"callee":null},"246:13":{"kind":"call","span":{"start":[246,13],"end":[246,43],"bytes":[5877,5907]},"callee":null},"247:14":{"kind":"call","span":{"start":[247,14],"end":[247,45],"bytes":[5921,5952]},"callee":null},"249:17":{"kind":"call","span":{"start":[249,17],"end":[249,32],"bytes":[5970,5985]},"callee":null},"250:16":{"kind":"call","span":{"start":[250,16],"end":[250,30],"bytes":[6011,6025]},"callee":null},"252:4":{"kind":"call","span":{"start":[252,4],"end":[259,5],"bytes":[6040,6318]},"callee":null},"253:23":{"kind":"call","span":{"start":[253,23],"end":[253,53],"bytes":[6091,6121]},"callee":null},"254:22":{"kind":"call","span":{"start":[254,22],"end":[254,51],"bytes":[6144,6173]},"callee":null},"258:16":{"kind":"call","span":{"start":[258,16],"end":[258,43],"bytes":[6266,6293]},"callee":null},"261:4":{"kind":"call","span":{"start":[261,4],"end":[261,39],"bytes":[6323,6358]},"callee":null},"262:4":{"kind":"call","span":{"start":[262,4],"end":[262,38],"bytes":[6362,6396]},"callee":null},"263:23":{"kind":"call","span":{"start":[263,23],"end":[263,33],"bytes":[6419,6429]},"callee":null},"264:4":{"kind":"call","span":{"start":[264,4],"end":[264,21],"bytes":[6433,6450]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","kind":"method","span":{"start":[124,1],"end":[163,2],"bytes":[2678,3857]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[124,1],"end":[124,96],"bytes":[2678,2773]}},{"name":"db","type":"*database/sql.DB","span":{"start":[124,1],"end":[124,96],"bytes":[2678,2773]}},{"name":"workerID","type":"int","span":{"start":[124,1],"end":[124,96],"bytes":[2678,2773]}},{"name":"stats","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","span":{"start":[124,1],"end":[124,96],"bytes":[2678,2773]}}],"metrics":{"cyclomatic":9},"body":{"125:12":{"kind":"call","span":{"start":[125,12],"end":[125,78],"bytes":[2785,2851]},"callee":null},"125:41":{"kind":"call","span":{"start":[125,41],"end":[125,77],"bytes":[2814,2850]},"callee":null},"126:8":{"kind":"call","span":{"start":[126,8],"end":[126,21],"bytes":[2859,2872]},"callee":null},"128:10":{"kind":"call","span":{"start":[128,10],"end":[128,37],"bytes":[2883,2910]},"callee":null},"129:2":{"kind":"call","span":{"start":[129,2],"end":[129,23],"bytes":[2912,2933]},"callee":null},"133:10":{"kind":"call","span":{"start":[133,10],"end":[133,20],"bytes":[2962,2972]},"callee":null},"141:12":{"kind":"call","span":{"start":[141,12],"end":[141,34],"bytes":[3311,3333]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate"},"142:35":{"kind":"call","span":{"start":[142,35],"end":[142,49],"bytes":[3368,3382]},"callee":null},"146:7":{"kind":"call","span":{"start":[146,7],"end":[146,21],"bytes":[3418,3432]},"callee":null},"147:15":{"kind":"call","span":{"start":[147,15],"end":[147,32],"bytes":[3463,3480]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead"},"148:6":{"kind":"call","span":{"start":[148,6],"end":[148,39],"bytes":[3500,3533]},"callee":null},"149:6":{"kind":"call","span":{"start":[149,6],"end":[149,45],"bytes":[3539,3578]},"callee":null},"151:6":{"kind":"call","span":{"start":[151,6],"end":[151,38],"bytes":[3597,3629]},"callee":null},"154:15":{"kind":"call","span":{"start":[154,15],"end":[154,39],"bytes":[3662,3686]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite"},"155:6":{"kind":"call","span":{"start":[155,6],"end":[155,39],"bytes":[3706,3739]},"callee":null},"156:6":{"kind":"call","span":{"start":[156,6],"end":[156,46],"bytes":[3745,3785]},"callee":null},"158:6":{"kind":"call","span":{"start":[158,6],"end":[158,39],"bytes":[3804,3837]},"callee":null}}}},"fields":{"DB":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/DB","kind":"field","type":"string","span":{"start":[24,1],"end":[24,20],"bytes":[253,272]}},"Duration":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/Duration","kind":"field","type":"time.Duration","span":{"start":[26,1],"end":[26,27],"bytes":[290,316]}},"Main":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[22,1],"end":[22,12],"bytes":[240,251]}},"Pattern":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/Pattern","kind":"field","type":"string","span":{"start":[27,1],"end":[27,20],"bytes":[317,336]}},"PayloadSize":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/PayloadSize","kind":"field","type":"int","span":{"start":[28,1],"end":[28,17],"bytes":[337,353]}},"ReadRatio":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/ReadRatio","kind":"field","type":"float64","span":{"start":[29,1],"end":[29,21],"bytes":[354,374]}},"Workers":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/Workers","kind":"field","type":"int","span":{"start":[30,1],"end":[30,17],"bytes":[375,391]}},"WriteRate":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/WriteRate","kind":"field","type":"int","span":{"start":[25,1],"end":[25,17],"bytes":[273,289]}}}},"LoadStats":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","kind":"struct","span":{"start":[33,1],"end":[40,2],"bytes":[395,541]},"callables":{},"fields":{"errors":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/errors","kind":"field","type":"int64","span":{"start":[36,1],"end":[36,18],"bytes":[455,472]}},"lastReport":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/lastReport","kind":"field","type":"time.Time","span":{"start":[38,1],"end":[38,22],"bytes":[495,516]}},"mu":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/mu","kind":"field","type":"sync.Mutex","span":{"start":[39,1],"end":[39,23],"bytes":[517,539]}},"reads":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/reads","kind":"field","type":"int64","span":{"start":[35,1],"end":[35,18],"bytes":[437,454]}},"startTime":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/startTime","kind":"field","type":"time.Time","span":{"start":[37,1],"end":[37,22],"bytes":[473,494]}},"writes":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/writes","kind":"field","type":"int64","span":{"start":[34,1],"end":[34,18],"bytes":[419,436]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox":{"id":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox","kind":"function","span":{"start":[183,1],"end":[192,2],"bytes":[4199,4499]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox","parameters":[{"name":"x","type":"float64","span":{"start":[183,1],"end":[183,36],"bytes":[4199,4234]}}],"return_type":"float64","metrics":{"cyclomatic":2},"body":{"185:10":{"kind":"call","span":{"start":[185,10],"end":[185,31],"bytes":[4277,4298]},"callee":null},"185:18":{"kind":"call","span":{"start":[185,18],"end":[185,30],"bytes":[4285,4297]},"callee":null}}}},"content_hash":"4a3c39cc4c30c25d8696d208ee058c8172951cbd2841a2652d75332912515aa9"},"cmd/litestream-test/main.go":{"id":"can://go/litestream/cmd/litestream-test/main.go","kind":"module","span":{"start":[1,1],"end":[124,1],"bytes":[0,2525]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n)\n\nvar (\n\tVersion = \"development\"\n\tCommit = \"\"\n)\n\nfunc main() {\n\tm := NewMain()\n\tif err := m.Run(context.Background(), os.Args[1:]); err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n}\n\ntype Main struct {\n\tStdin io.Reader\n\tStdout io.Writer\n\tStderr io.Writer\n}\n\nfunc NewMain() *Main {\n\treturn \u0026Main{\n\t\tStdin: os.Stdin,\n\t\tStdout: os.Stdout,\n\t\tStderr: os.Stderr,\n\t}\n}\n\nfunc (m *Main) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test\", flag.ExitOnError)\n\tfs.Usage = m.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 || fs.Arg(0) == \"help\" {\n\t\tm.Usage()\n\t\treturn nil\n\t}\n\n\tswitch fs.Arg(0) {\n\tcase \"populate\":\n\t\treturn (\u0026PopulateCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tcase \"load\":\n\t\treturn (\u0026LoadCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tcase \"shrink\":\n\t\treturn (\u0026ShrinkCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tcase \"validate\":\n\t\treturn (\u0026ValidateCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tcase \"version\":\n\t\treturn (\u0026VersionCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown command: %s\", fs.Arg(0))\n\t}\n}\n\nfunc (m *Main) Usage() {\n\tfmt.Fprintln(m.Stdout, `\nlitestream-test is a testing harness for Litestream database replication.\n\nUsage:\n\n\tlitestream-test \u003ccommand\u003e [arguments]\n\nCommands:\n\n\tpopulate Quickly populate a database to a target size\n\tload Generate continuous load on a database\n\tshrink Shrink a database by deleting data\n\tvalidate Validate replication integrity\n\tversion Show version information\n\nUse \"litestream-test \u003ccommand\u003e -h\" for more information about a command.\n`[1:])\n}\n\ntype VersionCommand struct {\n\tMain *Main\n}\n\nfunc (c *VersionCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test version\", flag.ExitOnError)\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tfmt.Fprintf(c.Main.Stdout, \"litestream-test %s\\n\", Version)\n\tif Commit != \"\" {\n\t\tfmt.Fprintf(c.Main.Stdout, \"commit: %s\\n\", Commit)\n\t}\n\tfmt.Fprintf(c.Main.Stdout, \"go: %s\\n\", strings.TrimPrefix(runtime.Version(), \"go\"))\n\treturn nil\n}\n\nfunc (c *VersionCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nShow version information for litestream-test.\n\nUsage:\n\n\tlitestream-test version\n`[1:])\n}\n\nfunc init() {\n\tlogger := slog.New(slog.NewTextHandler(os.Stderr, \u0026slog.HandlerOptions{\n\t\tLevel: slog.LevelInfo,\n\t}))\n\tslog.SetDefault(logger)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"flag","path":"flag","span":{"start":[5,1],"end":[5,8],"bytes":[34,41]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[42,48]}},{"name":"io","path":"io","span":{"start":[7,1],"end":[7,6],"bytes":[49,54]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[55,66]}},{"name":"os","path":"os","span":{"start":[9,1],"end":[9,6],"bytes":[67,72]}},{"name":"runtime","path":"runtime","span":{"start":[10,1],"end":[10,11],"bytes":[73,83]}},{"name":"strings","path":"strings","span":{"start":[11,1],"end":[11,11],"bytes":[84,94]}}],"types":{"Main":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main","kind":"struct","span":{"start":[27,1],"end":[31,2],"bytes":[292,366]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","kind":"method","span":{"start":[41,1],"end":[67,2],"bytes":[474,1216]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[41,1],"end":[41,63],"bytes":[474,536]}},{"name":"args","type":"[]string","span":{"start":[41,1],"end":[41,63],"bytes":[474,536]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"42:8":{"kind":"call","span":{"start":[42,8],"end":[42,60],"bytes":[544,596]},"callee":null},"44:12":{"kind":"call","span":{"start":[44,12],"end":[44,26],"bytes":[628,642]},"callee":null},"48:23":{"kind":"call","span":{"start":[48,23],"end":[48,32],"bytes":[696,705]},"callee":null},"48:5":{"kind":"call","span":{"start":[48,5],"end":[48,14],"bytes":[678,687]},"callee":null},"49:3":{"kind":"call","span":{"start":[49,3],"end":[49,12],"bytes":[720,729]},"callee":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage"},"53:9":{"kind":"call","span":{"start":[53,9],"end":[53,18],"bytes":[755,764]},"callee":null},"55:10":{"kind":"call","span":{"start":[55,10],"end":[55,61],"bytes":[794,845]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run"},"55:47":{"kind":"call","span":{"start":[55,47],"end":[55,56],"bytes":[831,840]},"callee":null},"57:10":{"kind":"call","span":{"start":[57,10],"end":[57,57],"bytes":[869,916]},"callee":null},"57:43":{"kind":"call","span":{"start":[57,43],"end":[57,52],"bytes":[902,911]},"callee":null},"59:10":{"kind":"call","span":{"start":[59,10],"end":[59,59],"bytes":[942,991]},"callee":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run"},"59:45":{"kind":"call","span":{"start":[59,45],"end":[59,54],"bytes":[977,986]},"callee":null},"61:10":{"kind":"call","span":{"start":[61,10],"end":[61,61],"bytes":[1019,1070]},"callee":null},"61:47":{"kind":"call","span":{"start":[61,47],"end":[61,56],"bytes":[1056,1065]},"callee":null},"63:10":{"kind":"call","span":{"start":[63,10],"end":[63,60],"bytes":[1097,1147]},"callee":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run"},"63:46":{"kind":"call","span":{"start":[63,46],"end":[63,55],"bytes":[1133,1142]},"callee":null},"65:10":{"kind":"call","span":{"start":[65,10],"end":[65,54],"bytes":[1167,1211]},"callee":null},"65:44":{"kind":"call","span":{"start":[65,44],"end":[65,53],"bytes":[1201,1210]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage","kind":"method","span":{"start":[69,1],"end":[87,2],"bytes":[1218,1725]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"70:2":{"kind":"call","span":{"start":[70,2],"end":[86,7],"bytes":[1244,1723]},"callee":null}}}},"fields":{"Stderr":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/Stderr","kind":"field","type":"io.Writer","span":{"start":[30,1],"end":[30,18],"bytes":[347,364]}},"Stdin":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/Stdin","kind":"field","type":"io.Reader","span":{"start":[28,1],"end":[28,18],"bytes":[311,328]}},"Stdout":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/Stdout","kind":"field","type":"io.Writer","span":{"start":[29,1],"end":[29,18],"bytes":[329,346]}}}},"VersionCommand":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand","kind":"struct","span":{"start":[89,1],"end":[91,2],"bytes":[1727,1769]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","kind":"method","span":{"start":[93,1],"end":[106,2],"bytes":[1771,2223]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[93,1],"end":[93,73],"bytes":[1771,1843]}},{"name":"args","type":"[]string","span":{"start":[93,1],"end":[93,73],"bytes":[1771,1843]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"100:2":{"kind":"call","span":{"start":[100,2],"end":[100,61],"bytes":[1990,2049]},"callee":null},"102:3":{"kind":"call","span":{"start":[102,3],"end":[102,53],"bytes":[2071,2121]},"callee":null},"104:2":{"kind":"call","span":{"start":[104,2],"end":[104,85],"bytes":[2126,2209]},"callee":null},"104:41":{"kind":"call","span":{"start":[104,41],"end":[104,84],"bytes":[2165,2208]},"callee":null},"104:60":{"kind":"call","span":{"start":[104,60],"end":[104,77],"bytes":[2184,2201]},"callee":null},"94:8":{"kind":"call","span":{"start":[94,8],"end":[94,68],"bytes":[1851,1911]},"callee":null},"96:12":{"kind":"call","span":{"start":[96,12],"end":[96,26],"bytes":[1943,1957]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Usage":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Usage","kind":"method","span":{"start":[108,1],"end":[116,2],"bytes":[2225,2379]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"109:2":{"kind":"call","span":{"start":[109,2],"end":[115,7],"bytes":[2261,2377]},"callee":null}}}},"fields":{"Main":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[90,1],"end":[90,12],"bytes":[1756,1767]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream-test.NewMain":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.NewMain","kind":"function","span":{"start":[33,1],"end":[39,2],"bytes":[368,472]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.NewMain","parameters":[],"return_type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream-test.init":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.init","kind":"function","span":{"start":[118,1],"end":[123,2],"bytes":[2381,2524]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"119:12":{"kind":"call","span":{"start":[119,12],"end":[121,5],"bytes":[2406,2497]},"callee":null},"119:21":{"kind":"call","span":{"start":[119,21],"end":[121,4],"bytes":[2415,2496]},"callee":null},"122:2":{"kind":"call","span":{"start":[122,2],"end":[122,25],"bytes":[2499,2522]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.main":{"id":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","kind":"function","span":{"start":[19,1],"end":[25,2],"bytes":[146,290]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.main","parameters":[],"metrics":{"cyclomatic":2},"body":{"20:7":{"kind":"call","span":{"start":[20,7],"end":[20,16],"bytes":[166,175]},"callee":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.NewMain"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,52],"bytes":[187,227]},"callee":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run"},"21:18":{"kind":"call","span":{"start":[21,18],"end":[21,38],"bytes":[193,213]},"callee":null},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,31],"bytes":[244,272]},"callee":null},"23:3":{"kind":"call","span":{"start":[23,3],"end":[23,13],"bytes":[275,285]},"callee":null}}}},"content_hash":"1aec89087aea47d1cabfc7a216b2c37b7b7cf96292167f8e81e81125e0bc17b9"},"cmd/litestream-test/populate.go":{"id":"can://go/litestream/cmd/litestream-test/populate.go","kind":"module","span":{"start":[1,1],"end":[323,1],"bytes":[0,7805]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\tcryptorand \"crypto/rand\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math/rand\"\n\t\"os\"\n\t\"time\"\n\n\t_ \"github.com/mattn/go-sqlite3\"\n)\n\ntype PopulateCommand struct {\n\tMain *Main\n\n\tDB string\n\tTargetSize string\n\tRowSize int\n\tBatchSize int\n\tTableCount int\n\tIndexRatio float64\n\tPageSize int\n}\n\nfunc (c *PopulateCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test populate\", flag.ExitOnError)\n\tfs.StringVar(\u0026c.DB, \"db\", \"\", \"Database path (required)\")\n\tfs.StringVar(\u0026c.TargetSize, \"target-size\", \"100MB\", \"Target database size (e.g., 1GB, 500MB)\")\n\tfs.IntVar(\u0026c.RowSize, \"row-size\", 1024, \"Average row size in bytes\")\n\tfs.IntVar(\u0026c.BatchSize, \"batch-size\", 1000, \"Rows per transaction\")\n\tfs.IntVar(\u0026c.TableCount, \"table-count\", 1, \"Number of tables to create\")\n\tfs.Float64Var(\u0026c.IndexRatio, \"index-ratio\", 0.2, \"Percentage of columns to index (0.0-1.0)\")\n\tfs.IntVar(\u0026c.PageSize, \"page-size\", 4096, \"SQLite page size in bytes\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif c.DB == \"\" {\n\t\treturn fmt.Errorf(\"database path required\")\n\t}\n\n\ttargetBytes, err := parseSize(c.TargetSize)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid target size: %w\", err)\n\t}\n\n\tslog.Info(\"Starting database population\",\n\t\t\"db\", c.DB,\n\t\t\"target_size\", c.TargetSize,\n\t\t\"row_size\", c.RowSize,\n\t\t\"batch_size\", c.BatchSize,\n\t\t\"table_count\", c.TableCount,\n\t\t\"page_size\", c.PageSize,\n\t)\n\n\tif err := c.populateDatabase(ctx, targetBytes); err != nil {\n\t\treturn fmt.Errorf(\"populate database: %w\", err)\n\t}\n\n\tslog.Info(\"Database population complete\", \"db\", c.DB)\n\treturn nil\n}\n\nfunc (c *PopulateCommand) populateDatabase(ctx context.Context, targetBytes int64) error {\n\tif err := os.Remove(c.DB); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\tslog.Warn(\"Could not remove existing database\", \"error\", err)\n\t}\n\n\tdb, err := sql.Open(\"sqlite3\", c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database: %w\", err)\n\t}\n\tdefer db.Close()\n\n\tif _, err := db.Exec(fmt.Sprintf(\"PRAGMA page_size = %d\", c.PageSize)); err != nil {\n\t\treturn fmt.Errorf(\"set page size: %w\", err)\n\t}\n\n\tif _, err := db.Exec(\"PRAGMA journal_mode = WAL\"); err != nil {\n\t\treturn fmt.Errorf(\"set journal mode: %w\", err)\n\t}\n\n\tif _, err := db.Exec(\"PRAGMA synchronous = NORMAL\"); err != nil {\n\t\treturn fmt.Errorf(\"set synchronous: %w\", err)\n\t}\n\n\tfor i := 0; i \u003c c.TableCount; i++ {\n\t\ttableName := fmt.Sprintf(\"test_table_%d\", i)\n\n\t\tcreateSQL := fmt.Sprintf(`\n\t\t\tCREATE TABLE %s (\n\t\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\t\tdata BLOB,\n\t\t\t\ttext_field TEXT,\n\t\t\t\tint_field INTEGER,\n\t\t\t\tfloat_field REAL,\n\t\t\t\ttimestamp INTEGER\n\t\t\t)\n\t\t`, tableName)\n\n\t\tif _, err := db.Exec(createSQL); err != nil {\n\t\t\treturn fmt.Errorf(\"create table %s: %w\", tableName, err)\n\t\t}\n\n\t\tif c.IndexRatio \u003e 0 {\n\t\t\tif rand.Float64() \u003c c.IndexRatio {\n\t\t\t\tindexSQL := fmt.Sprintf(\"CREATE INDEX idx_%s_timestamp ON %s(timestamp)\", tableName, tableName)\n\t\t\t\tif _, err := db.Exec(indexSQL); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"create index: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif rand.Float64() \u003c c.IndexRatio {\n\t\t\t\tindexSQL := fmt.Sprintf(\"CREATE INDEX idx_%s_int ON %s(int_field)\", tableName, tableName)\n\t\t\t\tif _, err := db.Exec(indexSQL); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"create index: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ttotalRows := int(targetBytes / int64(c.RowSize))\n\trowsPerTable := totalRows / c.TableCount\n\tif rowsPerTable == 0 {\n\t\trowsPerTable = 1\n\t}\n\n\tslog.Info(\"Populating database\",\n\t\t\"target_bytes\", targetBytes,\n\t\t\"total_rows\", totalRows,\n\t\t\"rows_per_table\", rowsPerTable,\n\t)\n\n\tstartTime := time.Now()\n\tfor tableIdx := 0; tableIdx \u003c c.TableCount; tableIdx++ {\n\t\ttableName := fmt.Sprintf(\"test_table_%d\", tableIdx)\n\n\t\tif err := c.populateTable(ctx, db, tableName, rowsPerTable); err != nil {\n\t\t\treturn fmt.Errorf(\"populate table %s: %w\", tableName, err)\n\t\t}\n\n\t\tcurrentSize, _ := getDatabaseSize(c.DB)\n\t\tprogress := float64(currentSize) / float64(targetBytes) * 100\n\t\tslog.Info(\"Progress\",\n\t\t\t\"table\", tableName,\n\t\t\t\"current_size_mb\", currentSize/1024/1024,\n\t\t\t\"progress_percent\", fmt.Sprintf(\"%.1f\", progress),\n\t\t)\n\n\t\tif currentSize \u003e= targetBytes {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tduration := time.Since(startTime)\n\tfinalSize, _ := getDatabaseSize(c.DB)\n\n\tslog.Info(\"Population complete\",\n\t\t\"duration\", duration,\n\t\t\"final_size_mb\", finalSize/1024/1024,\n\t\t\"throughput_mb_per_sec\", fmt.Sprintf(\"%.2f\", float64(finalSize)/1024/1024/duration.Seconds()),\n\t)\n\n\treturn nil\n}\n\nfunc (c *PopulateCommand) populateTable(ctx context.Context, db *sql.DB, tableName string, rowCount int) error {\n\tdata := make([]byte, c.RowSize)\n\n\tfor i := 0; i \u003c rowCount; i += c.BatchSize {\n\t\ttx, err := db.Begin()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"begin transaction: %w\", err)\n\t\t}\n\n\t\tstmt, err := tx.Prepare(fmt.Sprintf(`\n\t\t\tINSERT INTO %s (data, text_field, int_field, float_field, timestamp)\n\t\t\tVALUES (?, ?, ?, ?, ?)\n\t\t`, tableName))\n\t\tif err != nil {\n\t\t\ttx.Rollback()\n\t\t\treturn fmt.Errorf(\"prepare statement: %w\", err)\n\t\t}\n\n\t\tbatchEnd := i + c.BatchSize\n\t\tif batchEnd \u003e rowCount {\n\t\t\tbatchEnd = rowCount\n\t\t}\n\n\t\tfor j := i; j \u003c batchEnd; j++ {\n\t\t\tcryptorand.Read(data)\n\t\t\ttextField := fmt.Sprintf(\"row_%d_%d\", i, j)\n\t\t\tintField := rand.Int63()\n\t\t\tfloatField := rand.Float64() * 1000\n\t\t\ttimestamp := time.Now().Unix()\n\n\t\t\tif _, err := stmt.Exec(data, textField, intField, floatField, timestamp); err != nil {\n\t\t\t\tstmt.Close()\n\t\t\t\ttx.Rollback()\n\t\t\t\treturn fmt.Errorf(\"insert row: %w\", err)\n\t\t\t}\n\t\t}\n\n\t\tstmt.Close()\n\t\tif err := tx.Commit(); err != nil {\n\t\t\treturn fmt.Errorf(\"commit transaction: %w\", err)\n\t\t}\n\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn ctx.Err()\n\t\tdefault:\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (c *PopulateCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nPopulate a SQLite database to a target size for testing.\n\nUsage:\n\n\tlitestream-test populate [options]\n\nOptions:\n\n\t-db PATH\n\t Database path (required)\n\n\t-target-size SIZE\n\t Target database size (e.g., \"1GB\", \"500MB\")\n\t Default: 100MB\n\n\t-row-size SIZE\n\t Average row size in bytes\n\t Default: 1024\n\n\t-batch-size COUNT\n\t Number of rows per transaction\n\t Default: 1000\n\n\t-table-count COUNT\n\t Number of tables to create\n\t Default: 1\n\n\t-index-ratio RATIO\n\t Percentage of columns to index (0.0-1.0)\n\t Default: 0.2\n\n\t-page-size SIZE\n\t SQLite page size in bytes\n\t Default: 4096\n\nExamples:\n\n\t# Create a 1GB database with default settings\n\tlitestream-test populate -db /tmp/test.db -target-size 1GB\n\n\t# Create a 2GB database with larger rows\n\tlitestream-test populate -db /tmp/test.db -target-size 2GB -row-size 4096\n\n\t# Test lock page with different page sizes\n\tlitestream-test populate -db /tmp/test.db -target-size 1.5GB -page-size 8192\n`[1:])\n}\n\nfunc parseSize(s string) (int64, error) {\n\t// Check suffixes in order from longest to shortest to avoid \"B\" matching before \"MB\"\n\tsuffixes := []struct {\n\t\tsuffix string\n\t\tmultiplier int64\n\t}{\n\t\t{\"TB\", 1024 * 1024 * 1024 * 1024},\n\t\t{\"GB\", 1024 * 1024 * 1024},\n\t\t{\"MB\", 1024 * 1024},\n\t\t{\"KB\", 1024},\n\t\t{\"B\", 1},\n\t}\n\n\tfor _, sf := range suffixes {\n\t\tif len(s) \u003e len(sf.suffix) \u0026\u0026 s[len(s)-len(sf.suffix):] == sf.suffix {\n\t\t\tvar value float64\n\t\t\tif _, err := fmt.Sscanf(s[:len(s)-len(sf.suffix)], \"%f\", \u0026value); err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\treturn int64(value * float64(sf.multiplier)), nil\n\t\t}\n\t}\n\n\tvar value int64\n\tif _, err := fmt.Sscanf(s, \"%d\", \u0026value); err != nil {\n\t\treturn 0, err\n\t}\n\treturn value, nil\n}\n\nfunc getDatabaseSize(path string) (int64, error) {\n\tinfo, err := os.Stat(path)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tsize := info.Size()\n\n\twalPath := path + \"-wal\"\n\tif walInfo, err := os.Stat(walPath); err == nil {\n\t\tsize += walInfo.Size()\n\t}\n\n\tshmPath := path + \"-shm\"\n\tif shmInfo, err := os.Stat(shmPath); err == nil {\n\t\tsize += shmInfo.Size()\n\t}\n\n\treturn size, nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"rand","path":"crypto/rand","alias":"cryptorand","span":{"start":[5,1],"end":[5,26],"bytes":[34,59]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[60,75]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[76,83]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[84,90]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[91,102]}},{"name":"rand","path":"math/rand","span":{"start":[10,1],"end":[10,13],"bytes":[103,115]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[116,121]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[122,129]}},{"name":"go-sqlite3","path":"github.com/mattn/go-sqlite3","alias":"_","span":{"start":[14,1],"end":[14,33],"bytes":[131,163]}}],"types":{"PopulateCommand":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand","kind":"struct","span":{"start":[17,1],"end":[27,2],"bytes":[167,333]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","kind":"method","span":{"start":[29,1],"end":[67,2],"bytes":[335,1662]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[29,1],"end":[29,74],"bytes":[335,408]}},{"name":"args","type":"[]string","span":{"start":[29,1],"end":[29,74],"bytes":[335,408]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"30:8":{"kind":"call","span":{"start":[30,8],"end":[30,69],"bytes":[416,477]},"callee":null},"31:2":{"kind":"call","span":{"start":[31,2],"end":[31,59],"bytes":[479,536]},"callee":null},"32:2":{"kind":"call","span":{"start":[32,2],"end":[32,96],"bytes":[538,632]},"callee":null},"33:2":{"kind":"call","span":{"start":[33,2],"end":[33,70],"bytes":[634,702]},"callee":null},"34:2":{"kind":"call","span":{"start":[34,2],"end":[34,69],"bytes":[704,771]},"callee":null},"35:2":{"kind":"call","span":{"start":[35,2],"end":[35,74],"bytes":[773,845]},"callee":null},"36:2":{"kind":"call","span":{"start":[36,2],"end":[36,94],"bytes":[847,939]},"callee":null},"37:2":{"kind":"call","span":{"start":[37,2],"end":[37,72],"bytes":[941,1011]},"callee":null},"39:12":{"kind":"call","span":{"start":[39,12],"end":[39,26],"bytes":[1043,1057]},"callee":null},"44:10":{"kind":"call","span":{"start":[44,10],"end":[44,46],"bytes":[1115,1151]},"callee":null},"47:22":{"kind":"call","span":{"start":[47,22],"end":[47,45],"bytes":[1177,1200]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize"},"49:10":{"kind":"call","span":{"start":[49,10],"end":[49,52],"bytes":[1227,1269]},"callee":null},"52:2":{"kind":"call","span":{"start":[52,2],"end":[59,3],"bytes":[1275,1476]},"callee":null},"61:12":{"kind":"call","span":{"start":[61,12],"end":[61,48],"bytes":[1489,1525]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase"},"62:10":{"kind":"call","span":{"start":[62,10],"end":[62,50],"bytes":[1549,1589]},"callee":null},"65:2":{"kind":"call","span":{"start":[65,2],"end":[65,55],"bytes":[1595,1648]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Usage":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Usage","kind":"method","span":{"start":[223,1],"end":[271,2],"bytes":[5669,6710]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"224:2":{"kind":"call","span":{"start":[224,2],"end":[270,7],"bytes":[5706,6708]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","kind":"method","span":{"start":[69,1],"end":[169,2],"bytes":[1664,4461]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[69,1],"end":[69,91],"bytes":[1664,1754]}},{"name":"targetBytes","type":"int64","span":{"start":[69,1],"end":[69,91],"bytes":[1664,1754]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":17},"body":{"106:16":{"kind":"call","span":{"start":[106,16],"end":[106,34],"bytes":[2700,2718]},"callee":null},"107:11":{"kind":"call","span":{"start":[107,11],"end":[107,60],"bytes":[2743,2792]},"callee":null},"111:7":{"kind":"call","span":{"start":[111,7],"end":[111,21],"bytes":[2828,2842]},"callee":null},"112:17":{"kind":"call","span":{"start":[112,17],"end":[112,100],"bytes":[2876,2959]},"callee":null},"113:18":{"kind":"call","span":{"start":[113,18],"end":[113,35],"bytes":[2977,2994]},"callee":null},"114:13":{"kind":"call","span":{"start":[114,13],"end":[114,48],"bytes":[3021,3056]},"callee":null},"117:7":{"kind":"call","span":{"start":[117,7],"end":[117,21],"bytes":[3074,3088]},"callee":null},"118:17":{"kind":"call","span":{"start":[118,17],"end":[118,94],"bytes":[3122,3199]},"callee":null},"119:18":{"kind":"call","span":{"start":[119,18],"end":[119,35],"bytes":[3217,3234]},"callee":null},"120:13":{"kind":"call","span":{"start":[120,13],"end":[120,48],"bytes":[3261,3296]},"callee":null},"126:15":{"kind":"call","span":{"start":[126,15],"end":[126,50],"bytes":[3330,3365]},"callee":null},"126:33":{"kind":"call","span":{"start":[126,33],"end":[126,49],"bytes":[3348,3364]},"callee":null},"132:2":{"kind":"call","span":{"start":[132,2],"end":[136,3],"bytes":[3456,3583]},"callee":null},"138:15":{"kind":"call","span":{"start":[138,15],"end":[138,25],"bytes":[3599,3609]},"callee":null},"140:16":{"kind":"call","span":{"start":[140,16],"end":[140,54],"bytes":[3683,3721]},"callee":null},"142:13":{"kind":"call","span":{"start":[142,13],"end":[142,62],"bytes":[3735,3784]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable"},"143:11":{"kind":"call","span":{"start":[143,11],"end":[143,62],"bytes":[3809,3860]},"callee":null},"146:21":{"kind":"call","span":{"start":[146,21],"end":[146,42],"bytes":[3886,3907]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"147:15":{"kind":"call","span":{"start":[147,15],"end":[147,35],"bytes":[3922,3942]},"callee":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead"},"147:38":{"kind":"call","span":{"start":[147,38],"end":[147,58],"bytes":[3945,3965]},"callee":null},"148:3":{"kind":"call","span":{"start":[148,3],"end":[152,4],"bytes":[3974,4121]},"callee":null},"151:24":{"kind":"call","span":{"start":[151,24],"end":[151,53],"bytes":[4087,4116]},"callee":null},"159:14":{"kind":"call","span":{"start":[159,14],"end":[159,35],"bytes":[4187,4208]},"callee":null},"160:18":{"kind":"call","span":{"start":[160,18],"end":[160,39],"bytes":[4226,4247]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"162:2":{"kind":"call","span":{"start":[162,2],"end":[166,3],"bytes":[4250,4446]},"callee":null},"165:28":{"kind":"call","span":{"start":[165,28],"end":[165,96],"bytes":[4374,4442]},"callee":null},"165:48":{"kind":"call","span":{"start":[165,48],"end":[165,66],"bytes":[4394,4412]},"callee":null},"165:77":{"kind":"call","span":{"start":[165,77],"end":[165,95],"bytes":[4423,4441]},"callee":null},"70:12":{"kind":"call","span":{"start":[70,12],"end":[70,27],"bytes":[1766,1781]},"callee":null},"70:44":{"kind":"call","span":{"start":[70,44],"end":[70,62],"bytes":[1798,1816]},"callee":null},"71:3":{"kind":"call","span":{"start":[71,3],"end":[71,64],"bytes":[1821,1882]},"callee":null},"74:13":{"kind":"call","span":{"start":[74,13],"end":[74,38],"bytes":[1899,1924]},"callee":null},"76:10":{"kind":"call","span":{"start":[76,10],"end":[76,46],"bytes":[1951,1987]},"callee":null},"78:8":{"kind":"call","span":{"start":[78,8],"end":[78,18],"bytes":[1998,2008]},"callee":null},"80:15":{"kind":"call","span":{"start":[80,15],"end":[80,72],"bytes":[2024,2081]},"callee":null},"80:23":{"kind":"call","span":{"start":[80,23],"end":[80,71],"bytes":[2032,2080]},"callee":null},"81:10":{"kind":"call","span":{"start":[81,10],"end":[81,46],"bytes":[2105,2141]},"callee":null},"84:15":{"kind":"call","span":{"start":[84,15],"end":[84,51],"bytes":[2160,2196]},"callee":null},"85:10":{"kind":"call","span":{"start":[85,10],"end":[85,49],"bytes":[2220,2259]},"callee":null},"88:15":{"kind":"call","span":{"start":[88,15],"end":[88,53],"bytes":[2278,2316]},"callee":null},"89:10":{"kind":"call","span":{"start":[89,10],"end":[89,48],"bytes":[2340,2378]},"callee":null},"93:16":{"kind":"call","span":{"start":[93,16],"end":[93,47],"bytes":[2435,2466]},"callee":null},"95:16":{"kind":"call","span":{"start":[95,16],"end":[104,16],"bytes":[2483,2683]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","kind":"method","span":{"start":[171,1],"end":[221,2],"bytes":[4463,5667]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[171,1],"end":[171,113],"bytes":[4463,4575]}},{"name":"db","type":"*database/sql.DB","span":{"start":[171,1],"end":[171,113],"bytes":[4463,4575]}},{"name":"tableName","type":"string","span":{"start":[171,1],"end":[171,113],"bytes":[4463,4575]}},{"name":"rowCount","type":"int","span":{"start":[171,1],"end":[171,113],"bytes":[4463,4575]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"172:10":{"kind":"call","span":{"start":[172,10],"end":[172,33],"bytes":[4585,4608]},"callee":null},"175:14":{"kind":"call","span":{"start":[175,14],"end":[175,24],"bytes":[4669,4679]},"callee":null},"177:11":{"kind":"call","span":{"start":[177,11],"end":[177,51],"bytes":[4708,4748]},"callee":null},"180:16":{"kind":"call","span":{"start":[180,16],"end":[183,17],"bytes":[4769,4908]},"callee":null},"180:27":{"kind":"call","span":{"start":[180,27],"end":[183,16],"bytes":[4780,4907]},"callee":null},"185:4":{"kind":"call","span":{"start":[185,4],"end":[185,17],"bytes":[4930,4943]},"callee":null},"186:11":{"kind":"call","span":{"start":[186,11],"end":[186,51],"bytes":[4954,4994]},"callee":null},"195:4":{"kind":"call","span":{"start":[195,4],"end":[195,25],"bytes":[5122,5143]},"callee":null},"196:17":{"kind":"call","span":{"start":[196,17],"end":[196,47],"bytes":[5160,5190]},"callee":null},"197:16":{"kind":"call","span":{"start":[197,16],"end":[197,28],"bytes":[5206,5218]},"callee":null},"198:18":{"kind":"call","span":{"start":[198,18],"end":[198,32],"bytes":[5236,5250]},"callee":null},"199:17":{"kind":"call","span":{"start":[199,17],"end":[199,27],"bytes":[5274,5284]},"callee":null},"201:17":{"kind":"call","span":{"start":[201,17],"end":[201,76],"bytes":[5309,5368]},"callee":null},"202:5":{"kind":"call","span":{"start":[202,5],"end":[202,17],"bytes":[5387,5399]},"callee":null},"203:5":{"kind":"call","span":{"start":[203,5],"end":[203,18],"bytes":[5404,5417]},"callee":null},"204:12":{"kind":"call","span":{"start":[204,12],"end":[204,45],"bytes":[5429,5462]},"callee":null},"208:3":{"kind":"call","span":{"start":[208,3],"end":[208,15],"bytes":[5475,5487]},"callee":null},"209:13":{"kind":"call","span":{"start":[209,13],"end":[209,24],"bytes":[5500,5511]},"callee":null},"210:11":{"kind":"call","span":{"start":[210,11],"end":[210,52],"bytes":[5536,5577]},"callee":null},"214:10":{"kind":"call","span":{"start":[214,10],"end":[214,20],"bytes":[5603,5613]},"callee":null},"215:11":{"kind":"call","span":{"start":[215,11],"end":[215,20],"bytes":[5625,5634]},"callee":null}}}},"fields":{"BatchSize":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/BatchSize","kind":"field","type":"int","span":{"start":[23,1],"end":[23,16],"bytes":[264,279]}},"DB":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/DB","kind":"field","type":"string","span":{"start":[20,1],"end":[20,19],"bytes":[210,228]}},"IndexRatio":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/IndexRatio","kind":"field","type":"float64","span":{"start":[25,1],"end":[25,20],"bytes":[296,315]}},"Main":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[18,1],"end":[18,12],"bytes":[197,208]}},"PageSize":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/PageSize","kind":"field","type":"int","span":{"start":[26,1],"end":[26,16],"bytes":[316,331]}},"RowSize":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/RowSize","kind":"field","type":"int","span":{"start":[22,1],"end":[22,16],"bytes":[248,263]}},"TableCount":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/TableCount","kind":"field","type":"int","span":{"start":[24,1],"end":[24,16],"bytes":[280,295]}},"TargetSize":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/TargetSize","kind":"field","type":"string","span":{"start":[21,1],"end":[21,19],"bytes":[229,247]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","kind":"function","span":{"start":[303,1],"end":[322,2],"bytes":[7435,7804]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","parameters":[{"name":"path","type":"string","span":{"start":[303,1],"end":[303,51],"bytes":[7435,7485]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"304:15":{"kind":"call","span":{"start":[304,15],"end":[304,28],"bytes":[7500,7513]},"callee":null},"309:10":{"kind":"call","span":{"start":[309,10],"end":[309,21],"bytes":[7560,7571]},"callee":null},"312:21":{"kind":"call","span":{"start":[312,21],"end":[312,37],"bytes":[7619,7635]},"callee":null},"313:11":{"kind":"call","span":{"start":[313,11],"end":[313,25],"bytes":[7660,7674]},"callee":null},"317:21":{"kind":"call","span":{"start":[317,21],"end":[317,37],"bytes":[7725,7741]},"callee":null},"318:11":{"kind":"call","span":{"start":[318,11],"end":[318,25],"bytes":[7766,7780]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.parseSize":{"id":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize","kind":"function","span":{"start":[273,1],"end":[301,2],"bytes":[6712,7433]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.parseSize","parameters":[{"name":"s","type":"string","span":{"start":[273,1],"end":[273,42],"bytes":[6712,6753]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"287:15":{"kind":"call","span":{"start":[287,15],"end":[287,29],"bytes":[7075,7089]},"callee":null},"287:35":{"kind":"call","span":{"start":[287,35],"end":[287,41],"bytes":[7095,7101]},"callee":null},"287:42":{"kind":"call","span":{"start":[287,42],"end":[287,56],"bytes":[7102,7116]},"callee":null},"287:6":{"kind":"call","span":{"start":[287,6],"end":[287,12],"bytes":[7066,7072]},"callee":null},"289:17":{"kind":"call","span":{"start":[289,17],"end":[289,68],"bytes":[7171,7222]},"callee":null},"289:31":{"kind":"call","span":{"start":[289,31],"end":[289,37],"bytes":[7185,7191]},"callee":null},"289:38":{"kind":"call","span":{"start":[289,38],"end":[289,52],"bytes":[7192,7206]},"callee":null},"292:11":{"kind":"call","span":{"start":[292,11],"end":[292,48],"bytes":[7270,7307]},"callee":null},"292:25":{"kind":"call","span":{"start":[292,25],"end":[292,47],"bytes":[7284,7306]},"callee":null},"297:15":{"kind":"call","span":{"start":[297,15],"end":[297,42],"bytes":[7352,7379]},"callee":null}}}},"content_hash":"a67a7b7cc269d80370f2853a6dbd9a7b82d5fe893644ccea6a7b990ab833b797"},"cmd/litestream-test/shrink.go":{"id":"can://go/litestream/cmd/litestream-test/shrink.go","kind":"module","span":{"start":[1,1],"end":[331,1],"bytes":[0,7667]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"time\"\n\n\t_ \"github.com/mattn/go-sqlite3\"\n)\n\ntype ShrinkCommand struct {\n\tMain *Main\n\n\tDB string\n\tDeletePercentage float64\n\tVacuum bool\n\tCheckpoint bool\n\tCheckpointMode string\n}\n\nfunc (c *ShrinkCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test shrink\", flag.ExitOnError)\n\tfs.StringVar(\u0026c.DB, \"db\", \"\", \"Database path (required)\")\n\tfs.Float64Var(\u0026c.DeletePercentage, \"delete-percentage\", 50, \"Percentage of data to delete (0-100)\")\n\tfs.BoolVar(\u0026c.Vacuum, \"vacuum\", false, \"Run VACUUM after deletion\")\n\tfs.BoolVar(\u0026c.Checkpoint, \"checkpoint\", false, \"Run checkpoint after deletion\")\n\tfs.StringVar(\u0026c.CheckpointMode, \"checkpoint-mode\", \"PASSIVE\", \"Checkpoint mode (PASSIVE, FULL, RESTART, TRUNCATE)\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif c.DB == \"\" {\n\t\treturn fmt.Errorf(\"database path required\")\n\t}\n\n\tif c.DeletePercentage \u003c 0 || c.DeletePercentage \u003e 100 {\n\t\treturn fmt.Errorf(\"delete percentage must be between 0 and 100\")\n\t}\n\n\tif _, err := os.Stat(c.DB); err != nil {\n\t\treturn fmt.Errorf(\"database does not exist: %w\", err)\n\t}\n\n\tslog.Info(\"Starting database shrink operation\",\n\t\t\"db\", c.DB,\n\t\t\"delete_percentage\", c.DeletePercentage,\n\t\t\"vacuum\", c.Vacuum,\n\t\t\"checkpoint\", c.Checkpoint,\n\t)\n\n\treturn c.shrinkDatabase(ctx)\n}\n\nfunc (c *ShrinkCommand) shrinkDatabase(ctx context.Context) error {\n\tinitialSize, err := getDatabaseSize(c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get initial size: %w\", err)\n\t}\n\n\tslog.Info(\"Initial database size\",\n\t\t\"size_mb\", initialSize/1024/1024,\n\t)\n\n\tdb, err := sql.Open(\"sqlite3\", c.DB+\"?_journal_mode=WAL\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database: %w\", err)\n\t}\n\tdefer db.Close()\n\n\ttables, err := c.getTableList(db)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get table list: %w\", err)\n\t}\n\n\tslog.Info(\"Found tables\", \"count\", len(tables))\n\n\ttotalDeleted := int64(0)\n\tfor _, table := range tables {\n\t\tdeleted, err := c.deleteFromTable(db, table)\n\t\tif err != nil {\n\t\t\tslog.Error(\"Failed to delete from table\", \"table\", table, \"error\", err)\n\t\t\tcontinue\n\t\t}\n\t\ttotalDeleted += deleted\n\t\tslog.Info(\"Deleted rows from table\",\n\t\t\t\"table\", table,\n\t\t\t\"rows_deleted\", deleted,\n\t\t)\n\t}\n\n\tslog.Info(\"Deletion complete\", \"total_rows_deleted\", totalDeleted)\n\n\tsizeAfterDelete, err := getDatabaseSize(c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get size after delete: %w\", err)\n\t}\n\n\tslog.Info(\"Size after deletion\",\n\t\t\"size_mb\", sizeAfterDelete/1024/1024,\n\t\t\"change_mb\", (initialSize-sizeAfterDelete)/1024/1024,\n\t)\n\n\tif c.Checkpoint {\n\t\tif err := c.runCheckpoint(db); err != nil {\n\t\t\treturn fmt.Errorf(\"checkpoint: %w\", err)\n\t\t}\n\n\t\tsizeAfterCheckpoint, _ := getDatabaseSize(c.DB)\n\t\tslog.Info(\"Size after checkpoint\",\n\t\t\t\"size_mb\", sizeAfterCheckpoint/1024/1024,\n\t\t\t\"change_from_delete_mb\", (sizeAfterDelete-sizeAfterCheckpoint)/1024/1024,\n\t\t)\n\t}\n\n\tif c.Vacuum {\n\t\tif err := c.runVacuum(db); err != nil {\n\t\t\treturn fmt.Errorf(\"vacuum: %w\", err)\n\t\t}\n\n\t\tsizeAfterVacuum, _ := getDatabaseSize(c.DB)\n\t\tslog.Info(\"Size after VACUUM\",\n\t\t\t\"size_mb\", sizeAfterVacuum/1024/1024,\n\t\t\t\"total_reduction_mb\", (initialSize-sizeAfterVacuum)/1024/1024,\n\t\t)\n\t}\n\n\tfinalSize, err := getDatabaseSize(c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get final size: %w\", err)\n\t}\n\n\treductionPercent := float64(initialSize-finalSize) / float64(initialSize) * 100\n\tslog.Info(\"Shrink operation complete\",\n\t\t\"initial_size_mb\", initialSize/1024/1024,\n\t\t\"final_size_mb\", finalSize/1024/1024,\n\t\t\"reduction_percent\", fmt.Sprintf(\"%.1f\", reductionPercent),\n\t)\n\n\treturn nil\n}\n\nfunc (c *ShrinkCommand) getTableList(db *sql.DB) ([]string, error) {\n\trows, err := db.Query(`\n\t\tSELECT name FROM sqlite_master\n\t\tWHERE type='table'\n\t\tAND name NOT LIKE 'sqlite_%'\n\t\tAND name NOT LIKE 'load_test'\n\t`)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\n\tvar tables []string\n\tfor rows.Next() {\n\t\tvar table string\n\t\tif err := rows.Scan(\u0026table); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttables = append(tables, table)\n\t}\n\n\treturn tables, nil\n}\n\nfunc (c *ShrinkCommand) deleteFromTable(db *sql.DB, table string) (int64, error) {\n\tvar totalRows int\n\tcountQuery := fmt.Sprintf(\"SELECT COUNT(*) FROM %s\", table)\n\tif err := db.QueryRow(countQuery).Scan(\u0026totalRows); err != nil {\n\t\treturn 0, fmt.Errorf(\"count rows: %w\", err)\n\t}\n\n\tif totalRows == 0 {\n\t\treturn 0, nil\n\t}\n\n\trowsToDelete := int(float64(totalRows) * (c.DeletePercentage / 100))\n\tif rowsToDelete == 0 {\n\t\treturn 0, nil\n\t}\n\n\tvar hasID bool\n\tcolumnQuery := fmt.Sprintf(\"PRAGMA table_info(%s)\", table)\n\trows, err := db.Query(columnQuery)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"get table info: %w\", err)\n\t}\n\tdefer rows.Close()\n\n\tfor rows.Next() {\n\t\tvar cid int\n\t\tvar name, dtype string\n\t\tvar notnull, pk int\n\t\tvar dflt sql.NullString\n\t\tif err := rows.Scan(\u0026cid, \u0026name, \u0026dtype, \u0026notnull, \u0026dflt, \u0026pk); err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif name == \"id\" || pk == 1 {\n\t\t\thasID = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tvar deleteQuery string\n\tif hasID {\n\t\tdeleteQuery = fmt.Sprintf(`\n\t\t\tDELETE FROM %s\n\t\t\tWHERE id IN (\n\t\t\t\tSELECT id FROM %s\n\t\t\t\tORDER BY RANDOM()\n\t\t\t\tLIMIT %d\n\t\t\t)\n\t\t`, table, table, rowsToDelete)\n\t} else {\n\t\tdeleteQuery = fmt.Sprintf(`\n\t\t\tDELETE FROM %s\n\t\t\tWHERE rowid IN (\n\t\t\t\tSELECT rowid FROM %s\n\t\t\t\tORDER BY RANDOM()\n\t\t\t\tLIMIT %d\n\t\t\t)\n\t\t`, table, table, rowsToDelete)\n\t}\n\n\tstartTime := time.Now()\n\tresult, err := db.Exec(deleteQuery)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"delete rows: %w\", err)\n\t}\n\n\trowsDeleted, _ := result.RowsAffected()\n\tduration := time.Since(startTime)\n\n\tslog.Debug(\"Deleted rows from table\",\n\t\t\"table\", table,\n\t\t\"rows_deleted\", rowsDeleted,\n\t\t\"duration\", duration,\n\t)\n\n\treturn rowsDeleted, nil\n}\n\nfunc (c *ShrinkCommand) runCheckpoint(db *sql.DB) error {\n\tslog.Info(\"Running checkpoint\", \"mode\", c.CheckpointMode)\n\n\tstartTime := time.Now()\n\tquery := fmt.Sprintf(\"PRAGMA wal_checkpoint(%s)\", c.CheckpointMode)\n\n\tvar busy, written, total int\n\terr := db.QueryRow(query).Scan(\u0026busy, \u0026written, \u0026total)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"checkpoint failed: %w\", err)\n\t}\n\n\tduration := time.Since(startTime)\n\tslog.Info(\"Checkpoint complete\",\n\t\t\"mode\", c.CheckpointMode,\n\t\t\"busy\", busy,\n\t\t\"pages_written\", written,\n\t\t\"total_pages\", total,\n\t\t\"duration\", duration,\n\t)\n\n\treturn nil\n}\n\nfunc (c *ShrinkCommand) runVacuum(db *sql.DB) error {\n\tslog.Info(\"Running VACUUM (this may take a while)\")\n\n\tstartTime := time.Now()\n\t_, err := db.Exec(\"VACUUM\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"vacuum failed: %w\", err)\n\t}\n\n\tduration := time.Since(startTime)\n\tslog.Info(\"VACUUM complete\", \"duration\", duration)\n\n\treturn nil\n}\n\nfunc (c *ShrinkCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nShrink a database by deleting data and optionally running VACUUM.\n\nUsage:\n\n\tlitestream-test shrink [options]\n\nOptions:\n\n\t-db PATH\n\t Database path (required)\n\n\t-delete-percentage PCT\n\t Percentage of data to delete (0-100)\n\t Default: 50\n\n\t-vacuum\n\t Run VACUUM after deletion\n\t Default: false\n\n\t-checkpoint\n\t Run checkpoint after deletion\n\t Default: false\n\n\t-checkpoint-mode MODE\n\t Checkpoint mode (PASSIVE, FULL, RESTART, TRUNCATE)\n\t Default: PASSIVE\n\nExamples:\n\n\t# Delete 50% of data\n\tlitestream-test shrink -db /tmp/test.db -delete-percentage 50\n\n\t# Delete 75% and run VACUUM\n\tlitestream-test shrink -db /tmp/test.db -delete-percentage 75 -vacuum\n\n\t# Delete 30%, checkpoint, then VACUUM\n\tlitestream-test shrink -db /tmp/test.db -delete-percentage 30 -checkpoint -vacuum\n\n\t# Test with FULL checkpoint mode\n\tlitestream-test shrink -db /tmp/test.db -delete-percentage 50 -checkpoint -checkpoint-mode FULL\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"sql","path":"database/sql","span":{"start":[5,1],"end":[5,16],"bytes":[34,49]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[50,57]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[58,64]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[65,76]}},{"name":"os","path":"os","span":{"start":[9,1],"end":[9,6],"bytes":[77,82]}},{"name":"time","path":"time","span":{"start":[10,1],"end":[10,8],"bytes":[83,90]}},{"name":"go-sqlite3","path":"github.com/mattn/go-sqlite3","alias":"_","span":{"start":[12,1],"end":[12,33],"bytes":[92,124]}}],"types":{"ShrinkCommand":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand","kind":"struct","span":{"start":[15,1],"end":[23,2],"bytes":[128,292]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","kind":"method","span":{"start":[25,1],"end":[57,2],"bytes":[294,1427]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[25,1],"end":[25,72],"bytes":[294,365]}},{"name":"args","type":"[]string","span":{"start":[25,1],"end":[25,72],"bytes":[294,365]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"26:8":{"kind":"call","span":{"start":[26,8],"end":[26,67],"bytes":[373,432]},"callee":null},"27:2":{"kind":"call","span":{"start":[27,2],"end":[27,59],"bytes":[434,491]},"callee":null},"28:2":{"kind":"call","span":{"start":[28,2],"end":[28,101],"bytes":[493,592]},"callee":null},"29:2":{"kind":"call","span":{"start":[29,2],"end":[29,69],"bytes":[594,661]},"callee":null},"30:2":{"kind":"call","span":{"start":[30,2],"end":[30,81],"bytes":[663,742]},"callee":null},"31:2":{"kind":"call","span":{"start":[31,2],"end":[31,117],"bytes":[744,859]},"callee":null},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,26],"bytes":[891,905]},"callee":null},"38:10":{"kind":"call","span":{"start":[38,10],"end":[38,46],"bytes":[963,999]},"callee":null},"42:10":{"kind":"call","span":{"start":[42,10],"end":[42,67],"bytes":[1070,1127]},"callee":null},"45:15":{"kind":"call","span":{"start":[45,15],"end":[45,28],"bytes":[1146,1159]},"callee":null},"46:10":{"kind":"call","span":{"start":[46,10],"end":[46,56],"bytes":[1183,1229]},"callee":null},"49:2":{"kind":"call","span":{"start":[49,2],"end":[54,3],"bytes":[1235,1394]},"callee":null},"56:9":{"kind":"call","span":{"start":[56,9],"end":[56,30],"bytes":[1404,1425]},"callee":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Usage":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Usage","kind":"method","span":{"start":[287,1],"end":[330,2],"bytes":[6664,7666]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"288:2":{"kind":"call","span":{"start":[288,2],"end":[329,7],"bytes":[6699,7664]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","kind":"method","span":{"start":[171,1],"end":[246,2],"bytes":[4124,5751]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[171,1],"end":[171,83],"bytes":[4124,4206]}},{"name":"table","type":"string","span":{"start":[171,1],"end":[171,83],"bytes":[4124,4206]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"173:16":{"kind":"call","span":{"start":[173,16],"end":[173,61],"bytes":[4241,4286]},"callee":null},"174:12":{"kind":"call","span":{"start":[174,12],"end":[174,35],"bytes":[4298,4321]},"callee":null},"175:13":{"kind":"call","span":{"start":[175,13],"end":[175,46],"bytes":[4365,4398]},"callee":null},"182:18":{"kind":"call","span":{"start":[182,18],"end":[182,70],"bytes":[4461,4513]},"callee":null},"182:22":{"kind":"call","span":{"start":[182,22],"end":[182,40],"bytes":[4465,4483]},"callee":null},"188:17":{"kind":"call","span":{"start":[188,17],"end":[188,60],"bytes":[4590,4633]},"callee":null},"189:15":{"kind":"call","span":{"start":[189,15],"end":[189,36],"bytes":[4648,4669]},"callee":null},"191:13":{"kind":"call","span":{"start":[191,13],"end":[191,50],"bytes":[4699,4736]},"callee":null},"193:8":{"kind":"call","span":{"start":[193,8],"end":[193,20],"bytes":[4747,4759]},"callee":null},"195:6":{"kind":"call","span":{"start":[195,6],"end":[195,17],"bytes":[4766,4777]},"callee":null},"200:13":{"kind":"call","span":{"start":[200,13],"end":[200,65],"bytes":[4879,4931]},"callee":null},"211:17":{"kind":"call","span":{"start":[211,17],"end":[218,33],"bytes":[5078,5221]},"callee":null},"220:17":{"kind":"call","span":{"start":[220,17],"end":[227,33],"bytes":[5248,5397]},"callee":null},"230:15":{"kind":"call","span":{"start":[230,15],"end":[230,25],"bytes":[5416,5426]},"callee":null},"231:17":{"kind":"call","span":{"start":[231,17],"end":[231,37],"bytes":[5443,5463]},"callee":null},"233:13":{"kind":"call","span":{"start":[233,13],"end":[233,47],"bytes":[5493,5527]},"callee":null},"236:20":{"kind":"call","span":{"start":[236,20],"end":[236,41],"bytes":[5551,5572]},"callee":null},"237:14":{"kind":"call","span":{"start":[237,14],"end":[237,35],"bytes":[5586,5607]},"callee":null},"239:2":{"kind":"call","span":{"start":[239,2],"end":[243,3],"bytes":[5610,5723]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","kind":"method","span":{"start":[147,1],"end":[169,2],"bytes":[3664,4122]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[147,1],"end":[147,69],"bytes":[3664,3732]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"148:15":{"kind":"call","span":{"start":[148,15],"end":[153,4],"bytes":[3747,3878]},"callee":null},"157:8":{"kind":"call","span":{"start":[157,8],"end":[157,20],"bytes":[3924,3936]},"callee":null},"160:6":{"kind":"call","span":{"start":[160,6],"end":[160,17],"bytes":[3964,3975]},"callee":null},"162:13":{"kind":"call","span":{"start":[162,13],"end":[162,30],"bytes":[4009,4026]},"callee":null},"165:12":{"kind":"call","span":{"start":[165,12],"end":[165,33],"bytes":[4075,4096]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","kind":"method","span":{"start":[248,1],"end":[270,2],"bytes":[5753,6330]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[248,1],"end":[248,58],"bytes":[5753,5810]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"249:2":{"kind":"call","span":{"start":[249,2],"end":[249,59],"bytes":[5812,5869]},"callee":null},"251:15":{"kind":"call","span":{"start":[251,15],"end":[251,25],"bytes":[5885,5895]},"callee":null},"252:11":{"kind":"call","span":{"start":[252,11],"end":[252,69],"bytes":[5906,5964]},"callee":null},"255:9":{"kind":"call","span":{"start":[255,9],"end":[255,27],"bytes":[6004,6022]},"callee":null},"257:10":{"kind":"call","span":{"start":[257,10],"end":[257,50],"bytes":[6079,6119]},"callee":null},"260:14":{"kind":"call","span":{"start":[260,14],"end":[260,35],"bytes":[6137,6158]},"callee":null},"261:2":{"kind":"call","span":{"start":[261,2],"end":[267,3],"bytes":[6160,6315]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","kind":"method","span":{"start":[272,1],"end":[285,2],"bytes":[6332,6662]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[272,1],"end":[272,54],"bytes":[6332,6385]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"273:2":{"kind":"call","span":{"start":[273,2],"end":[273,53],"bytes":[6387,6438]},"callee":null},"275:15":{"kind":"call","span":{"start":[275,15],"end":[275,25],"bytes":[6454,6464]},"callee":null},"276:12":{"kind":"call","span":{"start":[276,12],"end":[276,29],"bytes":[6476,6493]},"callee":null},"278:10":{"kind":"call","span":{"start":[278,10],"end":[278,46],"bytes":[6520,6556]},"callee":null},"281:14":{"kind":"call","span":{"start":[281,14],"end":[281,35],"bytes":[6574,6595]},"callee":null},"282:2":{"kind":"call","span":{"start":[282,2],"end":[282,52],"bytes":[6597,6647]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","kind":"method","span":{"start":[59,1],"end":[145,2],"bytes":[1429,3662]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[59,1],"end":[59,68],"bytes":[1429,1496]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"100:10":{"kind":"call","span":{"start":[100,10],"end":[100,54],"bytes":[2459,2503]},"callee":null},"103:2":{"kind":"call","span":{"start":[103,2],"end":[106,3],"bytes":[2509,2640]},"callee":null},"109:13":{"kind":"call","span":{"start":[109,13],"end":[109,32],"bytes":[2673,2692]},"callee":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint"},"110:11":{"kind":"call","span":{"start":[110,11],"end":[110,44],"bytes":[2717,2750]},"callee":null},"113:29":{"kind":"call","span":{"start":[113,29],"end":[113,50],"bytes":[2784,2805]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"114:3":{"kind":"call","span":{"start":[114,3],"end":[117,4],"bytes":[2808,2968]},"callee":null},"121:13":{"kind":"call","span":{"start":[121,13],"end":[121,28],"bytes":[3000,3015]},"callee":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum"},"122:11":{"kind":"call","span":{"start":[122,11],"end":[122,40],"bytes":[3040,3069]},"callee":null},"125:25":{"kind":"call","span":{"start":[125,25],"end":[125,46],"bytes":[3099,3120]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"126:3":{"kind":"call","span":{"start":[126,3],"end":[129,4],"bytes":[3123,3264]},"callee":null},"132:20":{"kind":"call","span":{"start":[132,20],"end":[132,41],"bytes":[3288,3309]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"134:10":{"kind":"call","span":{"start":[134,10],"end":[134,47],"bytes":[3336,3373]},"callee":null},"137:22":{"kind":"call","span":{"start":[137,22],"end":[137,52],"bytes":[3399,3429]},"callee":null},"137:55":{"kind":"call","span":{"start":[137,55],"end":[137,75],"bytes":[3432,3452]},"callee":null},"138:2":{"kind":"call","span":{"start":[138,2],"end":[142,3],"bytes":[3460,3647]},"callee":null},"141:24":{"kind":"call","span":{"start":[141,24],"end":[141,61],"bytes":[3606,3643]},"callee":null},"60:22":{"kind":"call","span":{"start":[60,22],"end":[60,43],"bytes":[1518,1539]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"62:10":{"kind":"call","span":{"start":[62,10],"end":[62,49],"bytes":[1566,1605]},"callee":null},"65:2":{"kind":"call","span":{"start":[65,2],"end":[67,3],"bytes":[1611,1684]},"callee":null},"69:13":{"kind":"call","span":{"start":[69,13],"end":[69,59],"bytes":[1698,1744]},"callee":null},"71:10":{"kind":"call","span":{"start":[71,10],"end":[71,46],"bytes":[1771,1807]},"callee":null},"73:8":{"kind":"call","span":{"start":[73,8],"end":[73,18],"bytes":[1818,1828]},"callee":null},"75:17":{"kind":"call","span":{"start":[75,17],"end":[75,35],"bytes":[1846,1864]},"callee":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList"},"77:10":{"kind":"call","span":{"start":[77,10],"end":[77,47],"bytes":[1891,1928]},"callee":null},"80:2":{"kind":"call","span":{"start":[80,2],"end":[80,49],"bytes":[1934,1981]},"callee":null},"80:37":{"kind":"call","span":{"start":[80,37],"end":[80,48],"bytes":[1969,1980]},"callee":null},"82:18":{"kind":"call","span":{"start":[82,18],"end":[82,26],"bytes":[2000,2008]},"callee":null},"84:19":{"kind":"call","span":{"start":[84,19],"end":[84,47],"bytes":[2059,2087]},"callee":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable"},"86:4":{"kind":"call","span":{"start":[86,4],"end":[86,75],"bytes":[2109,2180]},"callee":null},"90:3":{"kind":"call","span":{"start":[90,3],"end":[93,4],"bytes":[2225,2312]},"callee":null},"96:2":{"kind":"call","span":{"start":[96,2],"end":[96,68],"bytes":[2318,2384]},"callee":null},"98:26":{"kind":"call","span":{"start":[98,26],"end":[98,47],"bytes":[2411,2432]},"callee":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"}}}},"fields":{"Checkpoint":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/Checkpoint","kind":"field","type":"bool","span":{"start":[21,1],"end":[21,23],"bytes":[243,265]}},"CheckpointMode":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/CheckpointMode","kind":"field","type":"string","span":{"start":[22,1],"end":[22,25],"bytes":[266,290]}},"DB":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/DB","kind":"field","type":"string","span":{"start":[18,1],"end":[18,25],"bytes":[169,193]}},"DeletePercentage":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/DeletePercentage","kind":"field","type":"float64","span":{"start":[19,1],"end":[19,26],"bytes":[194,219]}},"Main":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[16,1],"end":[16,12],"bytes":[156,167]}},"Vacuum":{"id":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/Vacuum","kind":"field","type":"bool","span":{"start":[20,1],"end":[20,23],"bytes":[220,242]}}}}},"functions":{},"content_hash":"37c5b10667dd19c81741e8154bf9a8dac5dd898270b7f5c126d1375a33fb1b10"},"cmd/litestream-test/validate.go":{"id":"can://go/litestream/cmd/litestream-test/validate.go","kind":"module","span":{"start":[1,1],"end":[505,1],"bytes":[0,12576]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"crypto/md5\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"time\"\n\n\t_ \"github.com/mattn/go-sqlite3\"\n)\n\ntype ValidateCommand struct {\n\tMain *Main\n\n\tSourceDB string\n\tReplicaURL string\n\tRestoredDB string\n\tCheckType string\n\tLTXContinuity bool\n\tConfigPath string\n}\n\ntype ValidationResult struct {\n\tCheckType string\n\tPassed bool\n\tDuration time.Duration\n\tErrorMessage string\n\tDetails map[string]interface{}\n}\n\nfunc (c *ValidateCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test validate\", flag.ExitOnError)\n\tfs.StringVar(\u0026c.SourceDB, \"source-db\", \"\", \"Original database path\")\n\tfs.StringVar(\u0026c.ReplicaURL, \"replica-url\", \"\", \"Replica URL to validate\")\n\tfs.StringVar(\u0026c.RestoredDB, \"restored-db\", \"\", \"Path for restored database\")\n\tfs.StringVar(\u0026c.CheckType, \"check-type\", \"quick\", \"Type of check (quick, integrity, checksum, full)\")\n\tfs.BoolVar(\u0026c.LTXContinuity, \"ltx-continuity\", false, \"Check LTX file continuity\")\n\tfs.StringVar(\u0026c.ConfigPath, \"config\", \"\", \"Litestream config file path\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif c.SourceDB == \"\" {\n\t\treturn fmt.Errorf(\"source database path required\")\n\t}\n\n\tif c.ReplicaURL == \"\" \u0026\u0026 c.ConfigPath == \"\" {\n\t\treturn fmt.Errorf(\"replica URL or config file required\")\n\t}\n\n\tif c.RestoredDB == \"\" {\n\t\tc.RestoredDB = c.SourceDB + \".restored\"\n\t}\n\n\tslog.Info(\"Starting validation\",\n\t\t\"source_db\", c.SourceDB,\n\t\t\"replica_url\", c.ReplicaURL,\n\t\t\"check_type\", c.CheckType,\n\t\t\"ltx_continuity\", c.LTXContinuity,\n\t)\n\n\tresults := []ValidationResult{}\n\n\tif c.LTXContinuity \u0026\u0026 c.ReplicaURL != \"\" {\n\t\tresult := c.validateLTXContinuity(ctx)\n\t\tresults = append(results, result)\n\t}\n\n\trestoreResult := c.performRestore(ctx)\n\tresults = append(results, restoreResult)\n\n\tif restoreResult.Passed {\n\t\tswitch c.CheckType {\n\t\tcase \"quick\":\n\t\t\tresults = append(results, c.performQuickCheck(ctx))\n\t\tcase \"integrity\":\n\t\t\tresults = append(results, c.performIntegrityCheck(ctx))\n\t\tcase \"checksum\":\n\t\t\tresults = append(results, c.performChecksumCheck(ctx))\n\t\tcase \"full\":\n\t\t\tresults = append(results, c.performQuickCheck(ctx))\n\t\t\tresults = append(results, c.performIntegrityCheck(ctx))\n\t\t\tresults = append(results, c.performChecksumCheck(ctx))\n\t\t\tresults = append(results, c.performDataValidation(ctx))\n\t\t}\n\t}\n\n\treturn c.reportResults(results)\n}\n\nfunc (c *ValidateCommand) performRestore(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"restore\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tif err := os.Remove(c.RestoredDB); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\tslog.Warn(\"Could not remove existing restored database\", \"error\", err)\n\t}\n\n\tvar cmd *exec.Cmd\n\tif c.ConfigPath != \"\" {\n\t\tcmd = exec.CommandContext(ctx, \"litestream\", \"restore\",\n\t\t\t\"-config\", c.ConfigPath,\n\t\t\t\"-o\", c.RestoredDB,\n\t\t\tc.SourceDB,\n\t\t)\n\t} else {\n\t\tcmd = exec.CommandContext(ctx, \"litestream\", \"restore\",\n\t\t\t\"-o\", c.RestoredDB,\n\t\t\tc.ReplicaURL,\n\t\t)\n\t}\n\n\toutput, err := cmd.CombinedOutput()\n\tresult.Duration = time.Since(startTime)\n\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"restore failed: %v\\nOutput: %s\", err, string(output))\n\t\treturn result\n\t}\n\n\tif _, err := os.Stat(c.RestoredDB); err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"restored database not found: %v\", err)\n\t\treturn result\n\t}\n\n\tresult.Passed = true\n\tresult.Details[\"restored_path\"] = c.RestoredDB\n\n\tif info, err := os.Stat(c.RestoredDB); err == nil {\n\t\tresult.Details[\"restored_size\"] = info.Size()\n\t}\n\n\tslog.Info(\"Restore completed\",\n\t\t\"duration\", result.Duration,\n\t\t\"restored_db\", c.RestoredDB,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) performQuickCheck(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"quick_check\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tdb, err := sql.Open(\"sqlite3\", c.RestoredDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to open database: %v\", err)\n\t\treturn result\n\t}\n\tdefer db.Close()\n\n\tvar checkResult string\n\terr = db.QueryRow(\"PRAGMA quick_check\").Scan(\u0026checkResult)\n\tresult.Duration = time.Since(startTime)\n\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"quick check failed: %v\", err)\n\t\treturn result\n\t}\n\n\tresult.Passed = checkResult == \"ok\"\n\tresult.Details[\"check_result\"] = checkResult\n\n\tif !result.Passed {\n\t\tresult.ErrorMessage = fmt.Sprintf(\"quick check returned: %s\", checkResult)\n\t}\n\n\tslog.Info(\"Quick check completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) performIntegrityCheck(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"integrity_check\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tdb, err := sql.Open(\"sqlite3\", c.RestoredDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to open database: %v\", err)\n\t\treturn result\n\t}\n\tdefer db.Close()\n\n\trows, err := db.Query(\"PRAGMA integrity_check\")\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"integrity check failed: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\tdefer rows.Close()\n\n\tvar results []string\n\tfor rows.Next() {\n\t\tvar line string\n\t\tif err := rows.Scan(\u0026line); err != nil {\n\t\t\tresult.Passed = false\n\t\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to scan result: %v\", err)\n\t\t\tresult.Duration = time.Since(startTime)\n\t\t\treturn result\n\t\t}\n\t\tresults = append(results, line)\n\t}\n\n\tresult.Duration = time.Since(startTime)\n\tresult.Details[\"check_results\"] = results\n\n\tif len(results) == 1 \u0026\u0026 results[0] == \"ok\" {\n\t\tresult.Passed = true\n\t} else {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"integrity check found issues: %v\", results)\n\t}\n\n\tslog.Info(\"Integrity check completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t\t\"issues\", len(results)-1,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) performChecksumCheck(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"checksum\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tsourceChecksum, err := c.calculateDBChecksum(c.SourceDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to calculate source checksum: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\trestoredChecksum, err := c.calculateDBChecksum(c.RestoredDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to calculate restored checksum: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\tresult.Duration = time.Since(startTime)\n\tresult.Details[\"source_checksum\"] = fmt.Sprintf(\"%x\", sourceChecksum)\n\tresult.Details[\"restored_checksum\"] = fmt.Sprintf(\"%x\", restoredChecksum)\n\n\tif string(sourceChecksum) == string(restoredChecksum) {\n\t\tresult.Passed = true\n\t} else {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = \"checksums do not match\"\n\t}\n\n\tslog.Info(\"Checksum check completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t\t\"match\", result.Passed,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) performDataValidation(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"data_validation\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tsourceDB, err := sql.Open(\"sqlite3\", c.SourceDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to open source database: %v\", err)\n\t\treturn result\n\t}\n\tdefer sourceDB.Close()\n\n\trestoredDB, err := sql.Open(\"sqlite3\", c.RestoredDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to open restored database: %v\", err)\n\t\treturn result\n\t}\n\tdefer restoredDB.Close()\n\n\ttables, err := c.getTableList(sourceDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to get table list: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\tresult.Details[\"tables_checked\"] = len(tables)\n\tallMatch := true\n\n\tfor _, table := range tables {\n\t\tsourceCount, err := c.getRowCount(sourceDB, table)\n\t\tif err != nil {\n\t\t\tresult.Passed = false\n\t\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to count rows in source table %s: %v\", table, err)\n\t\t\tresult.Duration = time.Since(startTime)\n\t\t\treturn result\n\t\t}\n\n\t\trestoredCount, err := c.getRowCount(restoredDB, table)\n\t\tif err != nil {\n\t\t\tresult.Passed = false\n\t\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to count rows in restored table %s: %v\", table, err)\n\t\t\tresult.Duration = time.Since(startTime)\n\t\t\treturn result\n\t\t}\n\n\t\tif sourceCount != restoredCount {\n\t\t\tallMatch = false\n\t\t\tresult.Details[fmt.Sprintf(\"table_%s_mismatch\", table)] = fmt.Sprintf(\"source=%d, restored=%d\", sourceCount, restoredCount)\n\t\t}\n\t}\n\n\tresult.Duration = time.Since(startTime)\n\tresult.Passed = allMatch\n\n\tif !allMatch {\n\t\tresult.ErrorMessage = \"row count mismatch between source and restored databases\"\n\t}\n\n\tslog.Info(\"Data validation completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t\t\"tables_checked\", len(tables),\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) validateLTXContinuity(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"ltx_continuity\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tcmd := exec.CommandContext(ctx, \"litestream\", \"ltx\", c.ReplicaURL)\n\toutput, err := cmd.Output()\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to list LTX files: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\tlines := strings.Split(string(output), \"\\n\")\n\tif len(lines) \u003c 2 {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = \"no LTX files found\"\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\tresult.Passed = true\n\tresult.Duration = time.Since(startTime)\n\tresult.Details[\"ltx_files_checked\"] = len(lines) - 2\n\n\tslog.Info(\"LTX continuity check completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) calculateDBChecksum(path string) ([]byte, error) {\n\tfile, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer file.Close()\n\n\thash := md5.New()\n\tif _, err := io.Copy(hash, file); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn hash.Sum(nil), nil\n}\n\nfunc (c *ValidateCommand) getTableList(db *sql.DB) ([]string, error) {\n\trows, err := db.Query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\n\tvar tables []string\n\tfor rows.Next() {\n\t\tvar table string\n\t\tif err := rows.Scan(\u0026table); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttables = append(tables, table)\n\t}\n\n\treturn tables, nil\n}\n\nfunc (c *ValidateCommand) getRowCount(db *sql.DB, table string) (int, error) {\n\tvar count int\n\tquery := fmt.Sprintf(\"SELECT COUNT(*) FROM %s\", table)\n\terr := db.QueryRow(query).Scan(\u0026count)\n\treturn count, err\n}\n\nfunc (c *ValidateCommand) reportResults(results []ValidationResult) error {\n\tallPassed := true\n\tfor _, result := range results {\n\t\tif !result.Passed {\n\t\t\tallPassed = false\n\t\t\tslog.Error(\"Validation failed\",\n\t\t\t\t\"check_type\", result.CheckType,\n\t\t\t\t\"error\", result.ErrorMessage,\n\t\t\t)\n\t\t}\n\t}\n\n\tif allPassed {\n\t\tslog.Info(\"All validation checks passed\")\n\t\treturn nil\n\t}\n\n\treturn fmt.Errorf(\"validation failed\")\n}\n\nfunc (c *ValidateCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nValidate replication integrity by restoring and checking databases.\n\nUsage:\n\n\tlitestream-test validate [options]\n\nOptions:\n\n\t-source-db PATH\n\t Original database path (required)\n\n\t-replica-url URL\n\t Replica URL to validate\n\n\t-restored-db PATH\n\t Path for restored database\n\t Default: source-db.restored\n\n\t-check-type TYPE\n\t Type of check: quick, integrity, checksum, full\n\t Default: quick\n\n\t-ltx-continuity\n\t Check LTX file continuity\n\t Default: false\n\n\t-config PATH\n\t Litestream config file path\n\nExamples:\n\n\t# Quick validation\n\tlitestream-test validate -source-db /tmp/test.db -replica-url s3://bucket/test\n\n\t# Full validation with all checks\n\tlitestream-test validate -source-db /tmp/test.db -replica-url s3://bucket/test -check-type full\n\n\t# Validate with config file\n\tlitestream-test validate -source-db /tmp/test.db -config /etc/litestream.yml -check-type integrity\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"md5","path":"crypto/md5","span":{"start":[5,1],"end":[5,14],"bytes":[34,47]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[48,63]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[64,71]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[72,78]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[79,84]}},{"name":"slog","path":"log/slog","span":{"start":[10,1],"end":[10,12],"bytes":[85,96]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[97,102]}},{"name":"exec","path":"os/exec","span":{"start":[12,1],"end":[12,11],"bytes":[103,113]}},{"name":"strings","path":"strings","span":{"start":[13,1],"end":[13,11],"bytes":[114,124]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[125,132]}},{"name":"go-sqlite3","path":"github.com/mattn/go-sqlite3","alias":"_","span":{"start":[16,1],"end":[16,33],"bytes":[134,166]}}],"types":{"ValidateCommand":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand","kind":"struct","span":{"start":[19,1],"end":[28,2],"bytes":[170,344]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","kind":"method","span":{"start":[38,1],"end":[97,2],"bytes":[506,2440]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[38,1],"end":[38,74],"bytes":[506,579]}},{"name":"args","type":"[]string","span":{"start":[38,1],"end":[38,74],"bytes":[506,579]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"39:8":{"kind":"call","span":{"start":[39,8],"end":[39,69],"bytes":[587,648]},"callee":null},"40:2":{"kind":"call","span":{"start":[40,2],"end":[40,70],"bytes":[650,718]},"callee":null},"41:2":{"kind":"call","span":{"start":[41,2],"end":[41,75],"bytes":[720,793]},"callee":null},"42:2":{"kind":"call","span":{"start":[42,2],"end":[42,78],"bytes":[795,871]},"callee":null},"43:2":{"kind":"call","span":{"start":[43,2],"end":[43,103],"bytes":[873,974]},"callee":null},"44:2":{"kind":"call","span":{"start":[44,2],"end":[44,84],"bytes":[976,1058]},"callee":null},"45:2":{"kind":"call","span":{"start":[45,2],"end":[45,74],"bytes":[1060,1132]},"callee":null},"47:12":{"kind":"call","span":{"start":[47,12],"end":[47,26],"bytes":[1164,1178]},"callee":null},"52:10":{"kind":"call","span":{"start":[52,10],"end":[52,53],"bytes":[1242,1285]},"callee":null},"56:10":{"kind":"call","span":{"start":[56,10],"end":[56,59],"bytes":[1346,1395]},"callee":null},"63:2":{"kind":"call","span":{"start":[63,2],"end":[68,3],"bytes":[1472,1631]},"callee":null},"73:13":{"kind":"call","span":{"start":[73,13],"end":[73,41],"bytes":[1723,1751]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity"},"74:13":{"kind":"call","span":{"start":[74,13],"end":[74,36],"bytes":[1764,1787]},"callee":null},"77:19":{"kind":"call","span":{"start":[77,19],"end":[77,40],"bytes":[1810,1831]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore"},"78:12":{"kind":"call","span":{"start":[78,12],"end":[78,42],"bytes":[1843,1873]},"callee":null},"83:14":{"kind":"call","span":{"start":[83,14],"end":[83,55],"bytes":[1954,1995]},"callee":null},"83:30":{"kind":"call","span":{"start":[83,30],"end":[83,54],"bytes":[1970,1994]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck"},"85:14":{"kind":"call","span":{"start":[85,14],"end":[85,59],"bytes":[2029,2074]},"callee":null},"85:30":{"kind":"call","span":{"start":[85,30],"end":[85,58],"bytes":[2045,2073]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck"},"87:14":{"kind":"call","span":{"start":[87,14],"end":[87,58],"bytes":[2107,2151]},"callee":null},"87:30":{"kind":"call","span":{"start":[87,30],"end":[87,57],"bytes":[2123,2150]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck"},"89:14":{"kind":"call","span":{"start":[89,14],"end":[89,55],"bytes":[2180,2221]},"callee":null},"89:30":{"kind":"call","span":{"start":[89,30],"end":[89,54],"bytes":[2196,2220]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck"},"90:14":{"kind":"call","span":{"start":[90,14],"end":[90,59],"bytes":[2235,2280]},"callee":null},"90:30":{"kind":"call","span":{"start":[90,30],"end":[90,58],"bytes":[2251,2279]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck"},"91:14":{"kind":"call","span":{"start":[91,14],"end":[91,58],"bytes":[2294,2338]},"callee":null},"91:30":{"kind":"call","span":{"start":[91,30],"end":[91,57],"bytes":[2310,2337]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck"},"92:14":{"kind":"call","span":{"start":[92,14],"end":[92,59],"bytes":[2352,2397]},"callee":null},"92:30":{"kind":"call","span":{"start":[92,30],"end":[92,58],"bytes":[2368,2396]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation"},"96:9":{"kind":"call","span":{"start":[96,9],"end":[96,33],"bytes":[2414,2438]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Usage":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Usage","kind":"method","span":{"start":[462,1],"end":[504,2],"bytes":[11603,12575]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"463:2":{"kind":"call","span":{"start":[463,2],"end":[503,7],"bytes":[11640,12573]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","kind":"method","span":{"start":[401,1],"end":[414,2],"bytes":[10277,10558]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","parameters":[{"name":"path","type":"string","span":{"start":[401,1],"end":[401,77],"bytes":[10277,10353]}}],"return_type":"([]byte, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"402:15":{"kind":"call","span":{"start":[402,15],"end":[402,28],"bytes":[10368,10381]},"callee":null},"406:8":{"kind":"call","span":{"start":[406,8],"end":[406,20],"bytes":[10427,10439]},"callee":null},"408:10":{"kind":"call","span":{"start":[408,10],"end":[408,19],"bytes":[10450,10459]},"callee":null},"409:15":{"kind":"call","span":{"start":[409,15],"end":[409,34],"bytes":[10474,10493]},"callee":null},"413:9":{"kind":"call","span":{"start":[413,9],"end":[413,22],"bytes":[10538,10551]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","kind":"method","span":{"start":[435,1],"end":[440,2],"bytes":[10981,11191]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[435,1],"end":[435,79],"bytes":[10981,11059]}},{"name":"table","type":"string","span":{"start":[435,1],"end":[435,79],"bytes":[10981,11059]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"437:11":{"kind":"call","span":{"start":[437,11],"end":[437,56],"bytes":[11085,11130]},"callee":null},"438:9":{"kind":"call","span":{"start":[438,9],"end":[438,27],"bytes":[11139,11157]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","kind":"method","span":{"start":[416,1],"end":[433,2],"bytes":[10560,10979]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[416,1],"end":[416,71],"bytes":[10560,10630]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"417:15":{"kind":"call","span":{"start":[417,15],"end":[417,105],"bytes":[10645,10735]},"callee":null},"421:8":{"kind":"call","span":{"start":[421,8],"end":[421,20],"bytes":[10781,10793]},"callee":null},"424:6":{"kind":"call","span":{"start":[424,6],"end":[424,17],"bytes":[10821,10832]},"callee":null},"426:13":{"kind":"call","span":{"start":[426,13],"end":[426,30],"bytes":[10866,10883]},"callee":null},"429:12":{"kind":"call","span":{"start":[429,12],"end":[429,33],"bytes":[10932,10953]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","kind":"method","span":{"start":[249,1],"end":[290,2],"bytes":[6126,7333]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[249,1],"end":[249,87],"bytes":[6126,6212]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":4},"body":{"250:15":{"kind":"call","span":{"start":[250,15],"end":[250,25],"bytes":[6227,6237]},"callee":null},"253:14":{"kind":"call","span":{"start":[253,14],"end":[253,42],"bytes":[6305,6333]},"callee":null},"256:25":{"kind":"call","span":{"start":[256,25],"end":[256,58],"bytes":[6363,6396]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum"},"259:25":{"kind":"call","span":{"start":[259,25],"end":[259,84],"bytes":[6462,6521]},"callee":null},"260:21":{"kind":"call","span":{"start":[260,21],"end":[260,42],"bytes":[6542,6563]},"callee":null},"264:27":{"kind":"call","span":{"start":[264,27],"end":[264,62],"bytes":[6610,6645]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum"},"267:25":{"kind":"call","span":{"start":[267,25],"end":[267,86],"bytes":[6711,6772]},"callee":null},"268:21":{"kind":"call","span":{"start":[268,21],"end":[268,42],"bytes":[6793,6814]},"callee":null},"272:20":{"kind":"call","span":{"start":[272,20],"end":[272,41],"bytes":[6854,6875]},"callee":null},"273:38":{"kind":"call","span":{"start":[273,38],"end":[273,71],"bytes":[6913,6946]},"callee":null},"274:40":{"kind":"call","span":{"start":[274,40],"end":[274,75],"bytes":[6986,7021]},"callee":null},"276:31":{"kind":"call","span":{"start":[276,31],"end":[276,55],"bytes":[7053,7077]},"callee":null},"276:5":{"kind":"call","span":{"start":[276,5],"end":[276,27],"bytes":[7027,7049]},"callee":null},"283:2":{"kind":"call","span":{"start":[283,2],"end":[287,3],"bytes":[7191,7315]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","kind":"method","span":{"start":[292,1],"end":[363,2],"bytes":[7335,9341]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[292,1],"end":[292,88],"bytes":[7335,7422]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":9},"body":{"293:15":{"kind":"call","span":{"start":[293,15],"end":[293,25],"bytes":[7437,7447]},"callee":null},"296:14":{"kind":"call","span":{"start":[296,14],"end":[296,42],"bytes":[7522,7550]},"callee":null},"299:19":{"kind":"call","span":{"start":[299,19],"end":[299,50],"bytes":[7574,7605]},"callee":null},"302:25":{"kind":"call","span":{"start":[302,25],"end":[302,79],"bytes":[7671,7725]},"callee":null},"305:8":{"kind":"call","span":{"start":[305,8],"end":[305,24],"bytes":[7752,7768]},"callee":null},"307:21":{"kind":"call","span":{"start":[307,21],"end":[307,54],"bytes":[7790,7823]},"callee":null},"310:25":{"kind":"call","span":{"start":[310,25],"end":[310,81],"bytes":[7889,7945]},"callee":null},"313:8":{"kind":"call","span":{"start":[313,8],"end":[313,26],"bytes":[7972,7990]},"callee":null},"315:17":{"kind":"call","span":{"start":[315,17],"end":[315,41],"bytes":[8008,8032]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList"},"318:25":{"kind":"call","span":{"start":[318,25],"end":[318,73],"bytes":[8098,8146]},"callee":null},"319:21":{"kind":"call","span":{"start":[319,21],"end":[319,42],"bytes":[8167,8188]},"callee":null},"323:37":{"kind":"call","span":{"start":[323,37],"end":[323,48],"bytes":[8245,8256]},"callee":null},"327:23":{"kind":"call","span":{"start":[327,23],"end":[327,53],"bytes":[8330,8360]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount"},"330:26":{"kind":"call","span":{"start":[330,26],"end":[330,96],"bytes":[8429,8499]},"callee":null},"331:22":{"kind":"call","span":{"start":[331,22],"end":[331,43],"bytes":[8521,8542]},"callee":null},"335:25":{"kind":"call","span":{"start":[335,25],"end":[335,57],"bytes":[8589,8621]},"callee":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount"},"338:26":{"kind":"call","span":{"start":[338,26],"end":[338,98],"bytes":[8690,8762]},"callee":null},"339:22":{"kind":"call","span":{"start":[339,22],"end":[339,43],"bytes":[8784,8805]},"callee":null},"345:19":{"kind":"call","span":{"start":[345,19],"end":[345,58],"bytes":[8902,8941]},"callee":null},"345:62":{"kind":"call","span":{"start":[345,62],"end":[345,127],"bytes":[8945,9010]},"callee":null},"349:20":{"kind":"call","span":{"start":[349,20],"end":[349,41],"bytes":[9038,9059]},"callee":null},"356:2":{"kind":"call","span":{"start":[356,2],"end":[360,3],"bytes":[9191,9323]},"callee":null},"359:21":{"kind":"call","span":{"start":[359,21],"end":[359,32],"bytes":[9308,9319]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","kind":"method","span":{"start":[194,1],"end":[247,2],"bytes":[4744,6124]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[194,1],"end":[194,88],"bytes":[4744,4831]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":6},"body":{"195:15":{"kind":"call","span":{"start":[195,15],"end":[195,25],"bytes":[4846,4856]},"callee":null},"198:14":{"kind":"call","span":{"start":[198,14],"end":[198,42],"bytes":[4931,4959]},"callee":null},"201:13":{"kind":"call","span":{"start":[201,13],"end":[201,46],"bytes":[4977,5010]},"callee":null},"204:25":{"kind":"call","span":{"start":[204,25],"end":[204,72],"bytes":[5076,5123]},"callee":null},"207:8":{"kind":"call","span":{"start":[207,8],"end":[207,18],"bytes":[5150,5160]},"callee":null},"209:15":{"kind":"call","span":{"start":[209,15],"end":[209,49],"bytes":[5176,5210]},"callee":null},"212:25":{"kind":"call","span":{"start":[212,25],"end":[212,71],"bytes":[5276,5322]},"callee":null},"213:21":{"kind":"call","span":{"start":[213,21],"end":[213,42],"bytes":[5343,5364]},"callee":null},"216:8":{"kind":"call","span":{"start":[216,8],"end":[216,20],"bytes":[5391,5403]},"callee":null},"219:6":{"kind":"call","span":{"start":[219,6],"end":[219,17],"bytes":[5432,5443]},"callee":null},"221:13":{"kind":"call","span":{"start":[221,13],"end":[221,29],"bytes":[5476,5492]},"callee":null},"223:26":{"kind":"call","span":{"start":[223,26],"end":[223,71],"bytes":[5557,5602]},"callee":null},"224:22":{"kind":"call","span":{"start":[224,22],"end":[224,43],"bytes":[5624,5645]},"callee":null},"227:13":{"kind":"call","span":{"start":[227,13],"end":[227,34],"bytes":[5679,5700]},"callee":null},"230:20":{"kind":"call","span":{"start":[230,20],"end":[230,41],"bytes":[5724,5745]},"callee":null},"233:5":{"kind":"call","span":{"start":[233,5],"end":[233,17],"bytes":[5794,5806]},"callee":null},"237:25":{"kind":"call","span":{"start":[237,25],"end":[237,81],"bytes":[5917,5973]},"callee":null},"240:2":{"kind":"call","span":{"start":[240,2],"end":[244,3],"bytes":[5979,6106]},"callee":null},"243:13":{"kind":"call","span":{"start":[243,13],"end":[243,25],"bytes":[6088,6100]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","kind":"method","span":{"start":[154,1],"end":[192,2],"bytes":[3778,4742]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[154,1],"end":[154,84],"bytes":[3778,3861]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":4},"body":{"155:15":{"kind":"call","span":{"start":[155,15],"end":[155,25],"bytes":[3876,3886]},"callee":null},"158:14":{"kind":"call","span":{"start":[158,14],"end":[158,42],"bytes":[3957,3985]},"callee":null},"161:13":{"kind":"call","span":{"start":[161,13],"end":[161,46],"bytes":[4003,4036]},"callee":null},"164:25":{"kind":"call","span":{"start":[164,25],"end":[164,72],"bytes":[4102,4149]},"callee":null},"167:8":{"kind":"call","span":{"start":[167,8],"end":[167,18],"bytes":[4176,4186]},"callee":null},"170:8":{"kind":"call","span":{"start":[170,8],"end":[170,41],"bytes":[4219,4252]},"callee":null},"171:20":{"kind":"call","span":{"start":[171,20],"end":[171,41],"bytes":[4291,4312]},"callee":null},"175:25":{"kind":"call","span":{"start":[175,25],"end":[175,67],"bytes":[4379,4421]},"callee":null},"183:25":{"kind":"call","span":{"start":[183,25],"end":[183,77],"bytes":[4571,4623]},"callee":null},"186:2":{"kind":"call","span":{"start":[186,2],"end":[189,3],"bytes":[4629,4724]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","kind":"method","span":{"start":[99,1],"end":[152,2],"bytes":[2442,3776]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[99,1],"end":[99,81],"bytes":[2442,2522]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":6},"body":{"100:15":{"kind":"call","span":{"start":[100,15],"end":[100,25],"bytes":[2537,2547]},"callee":null},"103:14":{"kind":"call","span":{"start":[103,14],"end":[103,42],"bytes":[2614,2642]},"callee":null},"106:12":{"kind":"call","span":{"start":[106,12],"end":[106,35],"bytes":[2659,2682]},"callee":null},"106:52":{"kind":"call","span":{"start":[106,52],"end":[106,70],"bytes":[2699,2717]},"callee":null},"107:3":{"kind":"call","span":{"start":[107,3],"end":[107,73],"bytes":[2722,2792]},"callee":null},"112:9":{"kind":"call","span":{"start":[112,9],"end":[116,4],"bytes":[2849,2968]},"callee":null},"118:9":{"kind":"call","span":{"start":[118,9],"end":[121,4],"bytes":[2987,3080]},"callee":null},"124:17":{"kind":"call","span":{"start":[124,17],"end":[124,37],"bytes":[3101,3121]},"callee":null},"125:20":{"kind":"call","span":{"start":[125,20],"end":[125,41],"bytes":[3141,3162]},"callee":null},"129:25":{"kind":"call","span":{"start":[129,25],"end":[129,91],"bytes":[3229,3295]},"callee":null},"129:76":{"kind":"call","span":{"start":[129,76],"end":[129,90],"bytes":[3280,3294]},"callee":null},"133:15":{"kind":"call","span":{"start":[133,15],"end":[133,36],"bytes":[3330,3351]},"callee":null},"135:25":{"kind":"call","span":{"start":[135,25],"end":[135,76],"bytes":[3414,3465]},"callee":null},"142:18":{"kind":"call","span":{"start":[142,18],"end":[142,39],"bytes":[3574,3595]},"callee":null},"143:37":{"kind":"call","span":{"start":[143,37],"end":[143,48],"bytes":[3646,3657]},"callee":null},"146:2":{"kind":"call","span":{"start":[146,2],"end":[149,3],"bytes":[3663,3758]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","kind":"method","span":{"start":[442,1],"end":[460,2],"bytes":[11193,11601]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","parameters":[{"name":"results","type":"[]github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","span":{"start":[442,1],"end":[442,76],"bytes":[11193,11268]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"447:4":{"kind":"call","span":{"start":[447,4],"end":[450,5],"bytes":[11368,11474]},"callee":null},"455:3":{"kind":"call","span":{"start":[455,3],"end":[455,44],"bytes":[11501,11542]},"callee":null},"459:9":{"kind":"call","span":{"start":[459,9],"end":[459,40],"bytes":[11568,11599]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","kind":"method","span":{"start":[365,1],"end":[399,2],"bytes":[9343,10275]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[365,1],"end":[365,88],"bytes":[9343,9430]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":3},"body":{"366:15":{"kind":"call","span":{"start":[366,15],"end":[366,25],"bytes":[9445,9455]},"callee":null},"369:14":{"kind":"call","span":{"start":[369,14],"end":[369,42],"bytes":[9529,9557]},"callee":null},"372:9":{"kind":"call","span":{"start":[372,9],"end":[372,68],"bytes":[9571,9630]},"callee":null},"373:17":{"kind":"call","span":{"start":[373,17],"end":[373,29],"bytes":[9647,9659]},"callee":null},"376:25":{"kind":"call","span":{"start":[376,25],"end":[376,73],"bytes":[9725,9773]},"callee":null},"377:21":{"kind":"call","span":{"start":[377,21],"end":[377,42],"bytes":[9794,9815]},"callee":null},"381:11":{"kind":"call","span":{"start":[381,11],"end":[381,46],"bytes":[9846,9881]},"callee":null},"381:25":{"kind":"call","span":{"start":[381,25],"end":[381,39],"bytes":[9860,9874]},"callee":null},"382:5":{"kind":"call","span":{"start":[382,5],"end":[382,15],"bytes":[9886,9896]},"callee":null},"385:21":{"kind":"call","span":{"start":[385,21],"end":[385,42],"bytes":[9992,10013]},"callee":null},"390:20":{"kind":"call","span":{"start":[390,20],"end":[390,41],"bytes":[10075,10096]},"callee":null},"391:40":{"kind":"call","span":{"start":[391,40],"end":[391,50],"bytes":[10136,10146]},"callee":null},"393:2":{"kind":"call","span":{"start":[393,2],"end":[396,3],"bytes":[10153,10257]},"callee":null}}}},"fields":{"CheckType":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/CheckType","kind":"field","type":"string","span":{"start":[25,1],"end":[25,22],"bytes":[279,300]}},"ConfigPath":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/ConfigPath","kind":"field","type":"string","span":{"start":[27,1],"end":[27,22],"bytes":[321,342]}},"LTXContinuity":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/LTXContinuity","kind":"field","type":"bool","span":{"start":[26,1],"end":[26,20],"bytes":[301,320]}},"Main":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[20,1],"end":[20,12],"bytes":[200,211]}},"ReplicaURL":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/ReplicaURL","kind":"field","type":"string","span":{"start":[23,1],"end":[23,22],"bytes":[235,256]}},"RestoredDB":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/RestoredDB","kind":"field","type":"string","span":{"start":[24,1],"end":[24,22],"bytes":[257,278]}},"SourceDB":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/SourceDB","kind":"field","type":"string","span":{"start":[22,1],"end":[22,22],"bytes":[213,234]}}}},"ValidationResult":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","kind":"struct","span":{"start":[30,1],"end":[36,2],"bytes":[346,504]},"callables":{},"fields":{"CheckType":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/CheckType","kind":"field","type":"string","span":{"start":[31,1],"end":[31,21],"bytes":[377,397]}},"Details":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/Details","kind":"field","type":"map[string]interface{}","span":{"start":[35,1],"end":[35,37],"bytes":[466,502]}},"Duration":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/Duration","kind":"field","type":"time.Duration","span":{"start":[33,1],"end":[33,28],"bytes":[417,444]}},"ErrorMessage":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/ErrorMessage","kind":"field","type":"string","span":{"start":[34,1],"end":[34,21],"bytes":[445,465]}},"Passed":{"id":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/Passed","kind":"field","type":"bool","span":{"start":[32,1],"end":[32,19],"bytes":[398,416]}}}}},"functions":{},"content_hash":"e60ce14e89afa8decef6dfab01ca6c537d4c7beeda6658ebb90ad8c9cf4766cc"},"cmd/litestream/databases.go":{"id":"can://go/litestream/cmd/litestream/databases.go","kind":"module","span":{"start":[1,1],"end":[105,1],"bytes":[0,2227]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"text/tabwriter\"\n)\n\n// DatabasesCommand is a command for listing managed databases.\ntype DatabasesCommand struct{}\n\n// Run executes the command.\nfunc (c *DatabasesCommand) Run(_ context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-databases\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t} else if fs.NArg() != 0 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\t// Load configuration.\n\tif *configPath == \"\" {\n\t\t*configPath = DefaultConfigPath()\n\t}\n\tconfig, err := ReadConfigFile(*configPath, !*noExpandEnv)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdatabases := make([]DatabaseInfo, 0, len(config.DBs))\n\tfor _, dbConfig := range config.DBs {\n\t\tdb, err := NewDBFromConfig(dbConfig)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tdatabases = append(databases, DatabaseInfo{\n\t\t\tPath: db.Path(),\n\t\t\tReplica: db.Replica.Client.Type(),\n\t\t})\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(databases, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tw := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)\n\tdefer w.Flush()\n\n\tfmt.Fprintln(w, \"path\\treplica\")\n\tfor _, db := range databases {\n\t\tfmt.Fprintf(w, \"%s\\t%s\\n\", db.Path, db.Replica)\n\t}\n\n\treturn nil\n}\n\ntype DatabaseInfo struct {\n\tPath string `json:\"path\"`\n\tReplica string `json:\"replica\"`\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *DatabasesCommand) Usage() {\n\tfmt.Printf(`\nThe databases command lists all databases in the configuration file.\n\nUsage:\n\n\tlitestream databases [arguments]\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-json\n\t Output raw JSON instead of human-readable text.\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\nExamples:\n\n\t$ litestream databases\n\t$ litestream databases -config /path/to/litestream.yml\n\t$ litestream databases -no-expand-env -config /path/to/litestream.yml\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"tabwriter","path":"text/tabwriter","span":{"start":[9,1],"end":[9,18],"bytes":[72,89]}}],"types":{"DatabaseInfo":{"id":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabaseInfo","kind":"struct","span":{"start":[69,1],"end":[72,2],"bytes":[1497,1588]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabaseInfo/Path","kind":"field","type":"string","span":{"start":[70,1],"end":[70,30],"bytes":[1524,1553]}},"Replica":{"id":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabaseInfo/Replica","kind":"field","type":"string","span":{"start":[71,1],"end":[71,33],"bytes":[1554,1586]}}}},"DatabasesCommand":{"id":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand","kind":"struct","span":{"start":[13,1],"end":[13,31],"bytes":[157,187]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run":{"id":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","kind":"method","span":{"start":[16,1],"end":[67,2],"bytes":[218,1495]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","parameters":[{"name":"_","type":"context.Context","span":{"start":[16,1],"end":[16,79],"bytes":[218,296]}},{"name":"args","type":"[]string","span":{"start":[16,1],"end":[16,79],"bytes":[218,296]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"17:8":{"kind":"call","span":{"start":[17,8],"end":[17,69],"bytes":[304,365]},"callee":null},"18:29":{"kind":"call","span":{"start":[18,29],"end":[18,51],"bytes":[394,416]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,57],"bytes":[432,473]},"callee":null},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,26],"bytes":[505,519]},"callee":null},"23:12":{"kind":"call","span":{"start":[23,12],"end":[23,21],"bytes":[558,567]},"callee":null},"24:10":{"kind":"call","span":{"start":[24,10],"end":[24,42],"bytes":[584,616]},"callee":null},"29:17":{"kind":"call","span":{"start":[29,17],"end":[29,36],"bytes":[685,704]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"31:17":{"kind":"call","span":{"start":[31,17],"end":[31,59],"bytes":[724,766]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"36:15":{"kind":"call","span":{"start":[36,15],"end":[36,55],"bytes":[815,855]},"callee":null},"36:39":{"kind":"call","span":{"start":[36,39],"end":[36,54],"bytes":[839,854]},"callee":null},"38:14":{"kind":"call","span":{"start":[38,14],"end":[38,39],"bytes":[908,933]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"43:15":{"kind":"call","span":{"start":[43,15],"end":[46,5],"bytes":[985,1082]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"},"44:13":{"kind":"call","span":{"start":[44,13],"end":[44,22],"bytes":[1029,1038]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"45:13":{"kind":"call","span":{"start":[45,13],"end":[45,37],"bytes":[1052,1076]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"50:18":{"kind":"call","span":{"start":[50,18],"end":[50,57],"bytes":[1122,1161]},"callee":null},"52:11":{"kind":"call","span":{"start":[52,11],"end":[52,59],"bytes":[1190,1238]},"callee":null},"54:15":{"kind":"call","span":{"start":[54,15],"end":[54,29],"bytes":[1257,1271]},"callee":null},"54:3":{"kind":"call","span":{"start":[54,3],"end":[54,30],"bytes":[1245,1272]},"callee":null},"58:7":{"kind":"call","span":{"start":[58,7],"end":[58,54],"bytes":[1296,1343]},"callee":null},"59:8":{"kind":"call","span":{"start":[59,8],"end":[59,17],"bytes":[1351,1360]},"callee":null},"61:2":{"kind":"call","span":{"start":[61,2],"end":[61,34],"bytes":[1363,1395]},"callee":null},"63:3":{"kind":"call","span":{"start":[63,3],"end":[63,50],"bytes":[1430,1477]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage":{"id":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage","kind":"method","span":{"start":[75,1],"end":[104,2],"bytes":[1633,2226]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"102:3":{"kind":"call","span":{"start":[102,3],"end":[102,22],"bytes":[2201,2220]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"76:2":{"kind":"call","span":{"start":[76,2],"end":[103,3],"bytes":[1671,2224]},"callee":null}}}}}},"functions":{},"content_hash":"d9ceaff1b578d1b0bbebb2951a94207cbb6581ef0c59e2fcb7bd1ec27426851b"},"cmd/litestream/directory_watcher.go":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go","kind":"module","span":{"start":[1,1],"end":[439,1],"bytes":[0,9884]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/fsnotify/fsnotify\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\nconst debounceInterval = 250 * time.Millisecond\n\n// DirectoryMonitor watches a directory tree for SQLite databases and dynamically\n// manages database instances within the store as files are created or removed.\ntype DirectoryMonitor struct {\n\tstore *litestream.Store\n\tconfig *DBConfig\n\tdirPath string\n\tpattern string\n\trecursive bool\n\n\twatcher *fsnotify.Watcher\n\tctx context.Context\n\tcancel context.CancelFunc\n\n\tlogger *slog.Logger\n\n\tmu sync.Mutex\n\tdbs map[string]*litestream.DB\n\twatchedDirs map[string]struct{}\n\n\t// Only accessed from the run() goroutine, so no mutex is needed.\n\tpendingEvents map[string]fsnotify.Op\n\tdebounceActive bool\n\n\twg sync.WaitGroup\n}\n\n// NewDirectoryMonitor returns a new monitor for directory-based replication.\nfunc NewDirectoryMonitor(ctx context.Context, store *litestream.Store, dbc *DBConfig, existing []*litestream.DB) (*DirectoryMonitor, error) {\n\tif dbc == nil {\n\t\treturn nil, errors.New(\"database config required\")\n\t}\n\tif store == nil {\n\t\treturn nil, errors.New(\"store required\")\n\t}\n\n\tdirPath, err := expand(dbc.Dir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif _, err := os.Stat(dirPath); err != nil {\n\t\treturn nil, err\n\t}\n\n\twatcher, err := fsnotify.NewWatcher()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tmonitorCtx, cancel := context.WithCancel(ctx)\n\tdm := \u0026DirectoryMonitor{\n\t\tstore: store,\n\t\tconfig: dbc,\n\t\tdirPath: dirPath,\n\t\tpattern: dbc.Pattern,\n\t\trecursive: dbc.Recursive,\n\t\twatcher: watcher,\n\t\tctx: monitorCtx,\n\t\tcancel: cancel,\n\t\tlogger: slog.With(\"dir\", dirPath),\n\t\tdbs: make(map[string]*litestream.DB),\n\t\twatchedDirs: make(map[string]struct{}),\n\t\tpendingEvents: make(map[string]fsnotify.Op),\n\t}\n\n\tfor _, db := range existing {\n\t\tdm.dbs[db.Path()] = db\n\t}\n\n\tif err := dm.addInitialWatches(); err != nil {\n\t\twatcher.Close()\n\t\tcancel()\n\t\treturn nil, err\n\t}\n\n\tdm.scanDirectory(dm.dirPath)\n\n\tdm.wg.Add(1)\n\tgo dm.run()\n\n\treturn dm, nil\n}\n\n// Close stops the directory monitor and releases resources.\nfunc (dm *DirectoryMonitor) Close() {\n\tdm.cancel()\n\t_ = dm.watcher.Close()\n\tdm.wg.Wait()\n}\n\nfunc (dm *DirectoryMonitor) run() {\n\tdefer dm.wg.Done()\n\n\t// Debounce timer lives in this goroutine so shutdown via dm.wg.Wait() is clean.\n\tdebounceTimer := time.NewTimer(debounceInterval)\n\tdebounceTimer.Stop()\n\tdefer debounceTimer.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-dm.ctx.Done():\n\t\t\treturn\n\t\tcase event, ok := \u003c-dm.watcher.Events:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif dm.handleEvent(event) \u0026\u0026 !dm.debounceActive {\n\t\t\t\tdebounceTimer.Reset(debounceInterval)\n\t\t\t\tdm.debounceActive = true\n\t\t\t}\n\t\tcase \u003c-debounceTimer.C:\n\t\t\tdm.flushPendingEvents()\n\t\tcase err, ok := \u003c-dm.watcher.Errors:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tdm.logger.Error(\"directory watcher error\", \"error\", err)\n\t\t}\n\t}\n}\n\nfunc (dm *DirectoryMonitor) addInitialWatches() error {\n\tif dm.recursive {\n\t\treturn filepath.WalkDir(dm.dirPath, func(path string, d os.DirEntry, err error) error {\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif !d.IsDir() {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn dm.addDirectoryWatch(path)\n\t\t})\n\t}\n\n\treturn dm.addDirectoryWatch(dm.dirPath)\n}\n\nfunc (dm *DirectoryMonitor) addDirectoryWatch(path string) error {\n\tabspath := filepath.Clean(path)\n\n\tdm.mu.Lock()\n\tdefer dm.mu.Unlock()\n\n\tif _, ok := dm.watchedDirs[abspath]; ok {\n\t\treturn nil\n\t}\n\tdm.watchedDirs[abspath] = struct{}{}\n\n\tif err := dm.watcher.Add(abspath); err != nil {\n\t\tdelete(dm.watchedDirs, abspath)\n\t\treturn err\n\t}\n\n\tdm.logger.Debug(\"watching directory\", \"path\", abspath)\n\treturn nil\n}\n\nfunc (dm *DirectoryMonitor) removeDirectoryWatch(path string) {\n\tabspath := filepath.Clean(path)\n\n\tdm.mu.Lock()\n\tdefer dm.mu.Unlock()\n\n\tif _, ok := dm.watchedDirs[abspath]; !ok {\n\t\treturn\n\t}\n\tdelete(dm.watchedDirs, abspath)\n\n\tif err := dm.watcher.Remove(abspath); err != nil {\n\t\tdm.logger.Debug(\"remove directory watch\", \"path\", abspath, \"error\", err)\n\t}\n}\n\n// handleEvent processes a single fsnotify event. Returns true if pending events\n// were queued and the debounce timer should be reset.\nfunc (dm *DirectoryMonitor) handleEvent(event fsnotify.Event) bool {\n\tpath := filepath.Clean(event.Name)\n\tif path == \"\" {\n\t\treturn false\n\t}\n\n\tif dm.shouldSkipPath(path) {\n\t\treturn false\n\t}\n\n\tinfo, statErr := os.Stat(path)\n\tisDir := statErr == nil \u0026\u0026 info.IsDir()\n\n\t// Early pattern check for create/write only. Rename must pass through\n\t// to removal handling below, since the old path may be a tracked DB.\n\tif !isDir \u0026\u0026 event.Op\u0026(fsnotify.Create|fsnotify.Write) != 0 {\n\t\tif !dm.matchesPattern(path) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tdm.mu.Lock()\n\t_, wasWatchedDir := dm.watchedDirs[path]\n\tdm.mu.Unlock()\n\n\tif isDir \u0026\u0026 event.Op\u0026(fsnotify.Create|fsnotify.Rename) != 0 {\n\t\tif dm.recursive {\n\t\t\tif err := dm.addDirectoryWatch(path); err != nil {\n\t\t\t\tdm.logger.Error(\"add directory watch\", \"path\", path, \"error\", err)\n\t\t\t}\n\t\t\tdm.scanDirectory(path)\n\t\t}\n\t}\n\n\tif (isDir || wasWatchedDir) \u0026\u0026 event.Op\u0026(fsnotify.Remove|fsnotify.Rename) != 0 {\n\t\tdm.removeDirectoryWatch(path)\n\t\tdm.removeDatabasesUnder(path)\n\t\treturn false\n\t}\n\n\tif isDir {\n\t\treturn false\n\t}\n\n\tif statErr != nil \u0026\u0026 !os.IsNotExist(statErr) {\n\t\tdm.logger.Debug(\"stat event path\", \"path\", path, \"error\", statErr)\n\t\treturn false\n\t}\n\n\tif event.Op\u0026(fsnotify.Remove|fsnotify.Rename) != 0 {\n\t\tdm.removeDatabase(path)\n\t\treturn false\n\t}\n\n\tif event.Op\u0026(fsnotify.Create|fsnotify.Write|fsnotify.Rename) != 0 {\n\t\tdm.pendingEvents[path] |= event.Op\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// flushPendingEvents processes all queued potential database events.\nfunc (dm *DirectoryMonitor) flushPendingEvents() {\n\tfor path := range dm.pendingEvents {\n\t\tselect {\n\t\tcase \u003c-dm.ctx.Done():\n\t\t\treturn\n\t\tdefault:\n\t\t}\n\t\tdm.handlePotentialDatabase(path)\n\t}\n\tdm.pendingEvents = make(map[string]fsnotify.Op)\n\tdm.debounceActive = false\n}\n\nfunc (dm *DirectoryMonitor) handlePotentialDatabase(path string) {\n\tif !dm.matchesPattern(path) {\n\t\treturn\n\t}\n\n\tdm.mu.Lock()\n\tif _, exists := dm.dbs[path]; exists {\n\t\tdm.mu.Unlock()\n\t\treturn\n\t}\n\tdm.dbs[path] = nil\n\tdm.mu.Unlock()\n\n\tvar db *litestream.DB\n\tsuccess := false\n\tdefer func() {\n\t\tif !success {\n\t\t\tif db != nil {\n\t\t\t\t_ = dm.store.UnregisterDB(dm.ctx, db.Path())\n\t\t\t}\n\t\t\tdm.mu.Lock()\n\t\t\tdelete(dm.dbs, path)\n\t\t\tdm.mu.Unlock()\n\t\t}\n\t}()\n\n\tif !IsSQLiteDatabase(path) {\n\t\treturn\n\t}\n\n\tvar err error\n\tdb, err = newDBFromDirectoryEntry(dm.config, dm.dirPath, path)\n\tif err != nil {\n\t\tdm.logger.Error(\"configure database\", \"path\", path, \"error\", err)\n\t\treturn\n\t}\n\n\tif err := dm.store.RegisterDB(db); err != nil {\n\t\tdm.logger.Error(\"register database with store\", \"path\", path, \"error\", err)\n\t\treturn\n\t}\n\n\tdm.mu.Lock()\n\tdm.dbs[path] = db\n\tdm.mu.Unlock()\n\n\tsuccess = true\n\tdm.logger.Info(\"added database to replication\", \"path\", path)\n}\n\nfunc (dm *DirectoryMonitor) removeDatabase(path string) {\n\tdm.mu.Lock()\n\tdb := dm.dbs[path]\n\tdm.mu.Unlock()\n\n\tif db == nil {\n\t\treturn\n\t}\n\n\tif err := dm.store.UnregisterDB(dm.ctx, db.Path()); err != nil {\n\t\tdm.logger.Error(\"unregister database from store\", \"path\", path, \"error\", err)\n\t\treturn\n\t}\n\n\tdm.mu.Lock()\n\tdelete(dm.dbs, path)\n\tdm.mu.Unlock()\n\n\tdm.logger.Info(\"removed database from replication\", \"path\", path)\n}\n\nfunc (dm *DirectoryMonitor) removeDatabasesUnder(dir string) {\n\tprefix := dir + string(os.PathSeparator)\n\n\tdm.mu.Lock()\n\tvar toClose []*litestream.DB\n\tvar toClosePaths []string\n\tfor path, db := range dm.dbs {\n\t\tif path == dir || strings.HasPrefix(path, prefix) {\n\t\t\ttoClose = append(toClose, db)\n\t\t\ttoClosePaths = append(toClosePaths, path)\n\t\t}\n\t}\n\tdm.mu.Unlock()\n\n\tfor i, db := range toClose {\n\t\tif db == nil {\n\t\t\tdm.mu.Lock()\n\t\t\tdelete(dm.dbs, toClosePaths[i])\n\t\t\tdm.mu.Unlock()\n\t\t\tcontinue\n\t\t}\n\t\tif err := dm.store.UnregisterDB(dm.ctx, db.Path()); err != nil {\n\t\t\tdm.logger.Error(\"unregister database from store\", \"path\", db.Path(), \"error\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\tdm.mu.Lock()\n\t\tdelete(dm.dbs, toClosePaths[i])\n\t\tdm.mu.Unlock()\n\t}\n}\n\nfunc (dm *DirectoryMonitor) matchesPattern(path string) bool {\n\tmatched, err := filepath.Match(dm.pattern, filepath.Base(path))\n\tif err != nil {\n\t\tdm.logger.Error(\"pattern match failed\", \"pattern\", dm.pattern, \"path\", path, \"error\", err)\n\t\treturn false\n\t}\n\treturn matched\n}\n\n// shouldSkipPath returns true for SQLite auxiliary files (WAL, SHM, journal)\n// that generate many events but are never databases themselves.\nfunc (dm *DirectoryMonitor) shouldSkipPath(path string) bool {\n\tbase := filepath.Base(path)\n\treturn strings.HasSuffix(base, \"-wal\") ||\n\t\tstrings.HasSuffix(base, \"-shm\") ||\n\t\tstrings.HasSuffix(base, \"-journal\")\n}\n\n// scanDirectory discovers pre-existing databases and is also called when new\n// directories appear to close the race window between watch registration and file creation.\nfunc (dm *DirectoryMonitor) scanDirectory(dir string) {\n\tif !dm.recursive {\n\t\tentries, err := os.ReadDir(dir)\n\t\tif err != nil {\n\t\t\tif !os.IsNotExist(err) {\n\t\t\t\tdm.logger.Debug(\"read directory\", \"path\", dir, \"error\", err)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tfor _, entry := range entries {\n\t\t\tif entry.IsDir() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tpath := filepath.Join(dir, entry.Name())\n\t\t\tdm.handlePotentialDatabase(path)\n\t\t}\n\t\treturn\n\t}\n\n\terr := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tdm.logger.Debug(\"scan directory entry\", \"path\", path, \"error\", err)\n\t\t\treturn nil\n\t\t}\n\n\t\tif d.IsDir() {\n\t\t\tif path != dir {\n\t\t\t\tif err := dm.addDirectoryWatch(path); err != nil {\n\t\t\t\t\tdm.logger.Error(\"add directory watch\", \"path\", path, \"error\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\n\t\tdm.handlePotentialDatabase(path)\n\t\treturn nil\n\t})\n\tif err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\tdm.logger.Debug(\"scan directory\", \"path\", dir, \"error\", err)\n\t}\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[34,43]}},{"name":"slog","path":"log/slog","span":{"start":[6,1],"end":[6,12],"bytes":[44,55]}},{"name":"os","path":"os","span":{"start":[7,1],"end":[7,6],"bytes":[56,61]}},{"name":"filepath","path":"path/filepath","span":{"start":[8,1],"end":[8,17],"bytes":[62,78]}},{"name":"strings","path":"strings","span":{"start":[9,1],"end":[9,11],"bytes":[79,89]}},{"name":"sync","path":"sync","span":{"start":[10,1],"end":[10,8],"bytes":[90,97]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[98,105]}},{"name":"fsnotify","path":"github.com/fsnotify/fsnotify","span":{"start":[13,1],"end":[13,32],"bytes":[107,138]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[15,1],"end":[15,37],"bytes":[140,176]}}],"types":{"DirectoryMonitor":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor","kind":"struct","span":{"start":[22,1],"end":[44,2],"bytes":[391,873]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","kind":"method","span":{"start":[104,1],"end":[108,2],"bytes":[2225,2315]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","parameters":[],"metrics":{"cyclomatic":1},"body":{"105:2":{"kind":"call","span":{"start":[105,2],"end":[105,13],"bytes":[2264,2275]},"callee":null},"106:6":{"kind":"call","span":{"start":[106,6],"end":[106,24],"bytes":[2281,2299]},"callee":null},"107:2":{"kind":"call","span":{"start":[107,2],"end":[107,14],"bytes":[2301,2313]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","kind":"method","span":{"start":[157,1],"end":[175,2],"bytes":[3329,3734]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","parameters":[{"name":"path","type":"string","span":{"start":[157,1],"end":[157,67],"bytes":[3329,3395]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"158:13":{"kind":"call","span":{"start":[158,13],"end":[158,33],"bytes":[3408,3428]},"callee":null},"160:2":{"kind":"call","span":{"start":[160,2],"end":[160,14],"bytes":[3431,3443]},"callee":null},"161:8":{"kind":"call","span":{"start":[161,8],"end":[161,22],"bytes":[3451,3465]},"callee":null},"168:12":{"kind":"call","span":{"start":[168,12],"end":[168,35],"bytes":[3576,3599]},"callee":null},"169:3":{"kind":"call","span":{"start":[169,3],"end":[169,34],"bytes":[3616,3647]},"callee":null},"173:2":{"kind":"call","span":{"start":[173,2],"end":[173,56],"bytes":[3666,3720]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","kind":"method","span":{"start":[141,1],"end":[155,2],"bytes":[2996,3327]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"143:10":{"kind":"call","span":{"start":[143,10],"end":[151,5],"bytes":[3080,3280]},"callee":null},"154:9":{"kind":"call","span":{"start":[154,9],"end":[154,41],"bytes":[3293,3325]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch"}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches.closure_1","kind":"function","span":{"start":[143,1],"end":[151,5],"bytes":[3071,3280]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[143,1],"end":[143,90],"bytes":[3071,3160]}},{"name":"d","type":"os.DirEntry","span":{"start":[143,1],"end":[143,90],"bytes":[3071,3160]}},{"name":"err","type":"error","span":{"start":[143,1],"end":[143,90],"bytes":[3071,3160]}}],"return_type":"error","error_channel":["error"],"body":{"147:8":{"kind":"call","span":{"start":[147,8],"end":[147,17],"bytes":[3207,3216]},"callee":null},"150:11":{"kind":"call","span":{"start":[150,11],"end":[150,37],"bytes":[3249,3275]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","kind":"method","span":{"start":[258,1],"end":[269,2],"bytes":[5718,5982]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","parameters":[],"metrics":{"cyclomatic":5},"body":{"261:10":{"kind":"call","span":{"start":[261,10],"end":[261,23],"bytes":[5827,5840]},"callee":null},"265:3":{"kind":"call","span":{"start":[265,3],"end":[265,35],"bytes":[5869,5901]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase"},"267:21":{"kind":"call","span":{"start":[267,21],"end":[267,49],"bytes":[5925,5953]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","kind":"method","span":{"start":[195,1],"end":[255,2],"bytes":[4230,5646]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","parameters":[{"name":"event","type":"github.com/fsnotify/fsnotify.Event","span":{"start":[195,1],"end":[195,69],"bytes":[4230,4298]}}],"return_type":"bool","metrics":{"cyclomatic":13},"body":{"196:10":{"kind":"call","span":{"start":[196,10],"end":[196,36],"bytes":[4308,4334]},"callee":null},"201:5":{"kind":"call","span":{"start":[201,5],"end":[201,28],"bytes":[4375,4398]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath"},"205:19":{"kind":"call","span":{"start":[205,19],"end":[205,32],"bytes":[4438,4451]},"callee":null},"206:29":{"kind":"call","span":{"start":[206,29],"end":[206,41],"bytes":[4480,4492]},"callee":null},"211:7":{"kind":"call","span":{"start":[211,7],"end":[211,30],"bytes":[4706,4729]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern"},"216:2":{"kind":"call","span":{"start":[216,2],"end":[216,14],"bytes":[4757,4769]},"callee":null},"218:2":{"kind":"call","span":{"start":[218,2],"end":[218,16],"bytes":[4813,4827]},"callee":null},"222:14":{"kind":"call","span":{"start":[222,14],"end":[222,40],"bytes":[4925,4951]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch"},"223:5":{"kind":"call","span":{"start":[223,5],"end":[223,71],"bytes":[4970,5036]},"callee":null},"225:4":{"kind":"call","span":{"start":[225,4],"end":[225,26],"bytes":[5045,5067]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory"},"230:3":{"kind":"call","span":{"start":[230,3],"end":[230,32],"bytes":[5160,5189]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch"},"231:3":{"kind":"call","span":{"start":[231,3],"end":[231,32],"bytes":[5192,5221]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder"},"239:24":{"kind":"call","span":{"start":[239,24],"end":[239,46],"bytes":[5295,5317]},"callee":null},"240:3":{"kind":"call","span":{"start":[240,3],"end":[240,69],"bytes":[5322,5388]},"callee":null},"245:3":{"kind":"call","span":{"start":[245,3],"end":[245,26],"bytes":[5464,5487]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","kind":"method","span":{"start":[271,1],"end":[319,2],"bytes":[5984,6918]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","parameters":[{"name":"path","type":"string","span":{"start":[271,1],"end":[271,67],"bytes":[5984,6050]}}],"metrics":{"cyclomatic":8},"body":{"272:6":{"kind":"call","span":{"start":[272,6],"end":[272,29],"bytes":[6056,6079]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern"},"276:2":{"kind":"call","span":{"start":[276,2],"end":[276,14],"bytes":[6096,6108]},"callee":null},"278:3":{"kind":"call","span":{"start":[278,3],"end":[278,17],"bytes":[6151,6165]},"callee":null},"282:2":{"kind":"call","span":{"start":[282,2],"end":[282,16],"bytes":[6199,6213]},"callee":null},"286:8":{"kind":"call","span":{"start":[286,8],"end":[295,5],"bytes":[6263,6426]},"callee":null},"297:6":{"kind":"call","span":{"start":[297,6],"end":[297,28],"bytes":[6433,6455]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase"},"302:12":{"kind":"call","span":{"start":[302,12],"end":[302,64],"bytes":[6497,6549]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry"},"304:3":{"kind":"call","span":{"start":[304,3],"end":[304,68],"bytes":[6569,6634]},"callee":null},"308:12":{"kind":"call","span":{"start":[308,12],"end":[308,35],"bytes":[6659,6682]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB"},"309:3":{"kind":"call","span":{"start":[309,3],"end":[309,78],"bytes":[6699,6774]},"callee":null},"313:2":{"kind":"call","span":{"start":[313,2],"end":[313,14],"bytes":[6789,6801]},"callee":null},"315:2":{"kind":"call","span":{"start":[315,2],"end":[315,16],"bytes":[6822,6836]},"callee":null},"318:2":{"kind":"call","span":{"start":[318,2],"end":[318,63],"bytes":[6855,6916]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1","kind":"function","span":{"start":[286,1],"end":[295,5],"bytes":[6256,6426]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1","parameters":[],"body":{"289:39":{"kind":"call","span":{"start":[289,39],"end":[289,48],"bytes":[6344,6353]},"callee":null},"289:9":{"kind":"call","span":{"start":[289,9],"end":[289,49],"bytes":[6314,6354]},"callee":null},"291:4":{"kind":"call","span":{"start":[291,4],"end":[291,16],"bytes":[6363,6375]},"callee":null},"292:4":{"kind":"call","span":{"start":[292,4],"end":[292,24],"bytes":[6379,6399]},"callee":null},"293:4":{"kind":"call","span":{"start":[293,4],"end":[293,18],"bytes":[6403,6417]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","kind":"method","span":{"start":[374,1],"end":[381,2],"bytes":[8079,8352]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","parameters":[{"name":"path","type":"string","span":{"start":[374,1],"end":[374,63],"bytes":[8079,8141]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"375:18":{"kind":"call","span":{"start":[375,18],"end":[375,65],"bytes":[8159,8206]},"callee":null},"375:45":{"kind":"call","span":{"start":[375,45],"end":[375,64],"bytes":[8186,8205]},"callee":null},"377:3":{"kind":"call","span":{"start":[377,3],"end":[377,93],"bytes":[8226,8316]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","kind":"method","span":{"start":[321,1],"end":[340,2],"bytes":[6920,7338]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","parameters":[{"name":"path","type":"string","span":{"start":[321,1],"end":[321,58],"bytes":[6920,6977]}}],"metrics":{"cyclomatic":3},"body":{"322:2":{"kind":"call","span":{"start":[322,2],"end":[322,14],"bytes":[6979,6991]},"callee":null},"324:2":{"kind":"call","span":{"start":[324,2],"end":[324,16],"bytes":[7013,7027]},"callee":null},"330:12":{"kind":"call","span":{"start":[330,12],"end":[330,52],"bytes":[7069,7109]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB"},"330:42":{"kind":"call","span":{"start":[330,42],"end":[330,51],"bytes":[7099,7108]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"331:3":{"kind":"call","span":{"start":[331,3],"end":[331,80],"bytes":[7126,7203]},"callee":null},"335:2":{"kind":"call","span":{"start":[335,2],"end":[335,14],"bytes":[7218,7230]},"callee":null},"336:2":{"kind":"call","span":{"start":[336,2],"end":[336,22],"bytes":[7232,7252]},"callee":null},"337:2":{"kind":"call","span":{"start":[337,2],"end":[337,16],"bytes":[7254,7268]},"callee":null},"339:2":{"kind":"call","span":{"start":[339,2],"end":[339,67],"bytes":[7271,7336]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","kind":"method","span":{"start":[342,1],"end":[372,2],"bytes":[7340,8077]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","parameters":[{"name":"dir","type":"string","span":{"start":[342,1],"end":[342,63],"bytes":[7340,7402]}}],"metrics":{"cyclomatic":6},"body":{"343:18":{"kind":"call","span":{"start":[343,18],"end":[343,42],"bytes":[7420,7444]},"callee":null},"345:2":{"kind":"call","span":{"start":[345,2],"end":[345,14],"bytes":[7447,7459]},"callee":null},"349:21":{"kind":"call","span":{"start":[349,21],"end":[349,52],"bytes":[7569,7600]},"callee":null},"350:14":{"kind":"call","span":{"start":[350,14],"end":[350,33],"bytes":[7616,7635]},"callee":null},"351:19":{"kind":"call","span":{"start":[351,19],"end":[351,45],"bytes":[7654,7680]},"callee":null},"354:2":{"kind":"call","span":{"start":[354,2],"end":[354,16],"bytes":[7689,7703]},"callee":null},"358:4":{"kind":"call","span":{"start":[358,4],"end":[358,16],"bytes":[7755,7767]},"callee":null},"359:4":{"kind":"call","span":{"start":[359,4],"end":[359,35],"bytes":[7771,7802]},"callee":null},"360:4":{"kind":"call","span":{"start":[360,4],"end":[360,18],"bytes":[7806,7820]},"callee":null},"363:13":{"kind":"call","span":{"start":[363,13],"end":[363,53],"bytes":[7849,7889]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB"},"363:43":{"kind":"call","span":{"start":[363,43],"end":[363,52],"bytes":[7879,7888]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"364:4":{"kind":"call","span":{"start":[364,4],"end":[364,86],"bytes":[7907,7989]},"callee":null},"364:62":{"kind":"call","span":{"start":[364,62],"end":[364,71],"bytes":[7965,7974]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"368:3":{"kind":"call","span":{"start":[368,3],"end":[368,15],"bytes":[8009,8021]},"callee":null},"369:3":{"kind":"call","span":{"start":[369,3],"end":[369,34],"bytes":[8024,8055]},"callee":null},"370:3":{"kind":"call","span":{"start":[370,3],"end":[370,17],"bytes":[8058,8072]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","kind":"method","span":{"start":[177,1],"end":[191,2],"bytes":[3736,4092]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","parameters":[{"name":"path","type":"string","span":{"start":[177,1],"end":[177,64],"bytes":[3736,3799]}}],"metrics":{"cyclomatic":3},"body":{"178:13":{"kind":"call","span":{"start":[178,13],"end":[178,33],"bytes":[3812,3832]},"callee":null},"180:2":{"kind":"call","span":{"start":[180,2],"end":[180,14],"bytes":[3835,3847]},"callee":null},"181:8":{"kind":"call","span":{"start":[181,8],"end":[181,22],"bytes":[3855,3869]},"callee":null},"186:2":{"kind":"call","span":{"start":[186,2],"end":[186,33],"bytes":[3928,3959]},"callee":null},"188:12":{"kind":"call","span":{"start":[188,12],"end":[188,38],"bytes":[3972,3998]},"callee":null},"189:3":{"kind":"call","span":{"start":[189,3],"end":[189,75],"bytes":[4015,4087]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","kind":"method","span":{"start":[110,1],"end":[139,2],"bytes":[2317,2994]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","parameters":[],"metrics":{"cyclomatic":10},"body":{"111:8":{"kind":"call","span":{"start":[111,8],"end":[111,20],"bytes":[2360,2372]},"callee":null},"114:19":{"kind":"call","span":{"start":[114,19],"end":[114,50],"bytes":[2474,2505]},"callee":null},"115:2":{"kind":"call","span":{"start":[115,2],"end":[115,22],"bytes":[2507,2527]},"callee":null},"116:8":{"kind":"call","span":{"start":[116,8],"end":[116,28],"bytes":[2535,2555]},"callee":null},"120:10":{"kind":"call","span":{"start":[120,10],"end":[120,23],"bytes":[2584,2597]},"callee":null},"126:7":{"kind":"call","span":{"start":[126,7],"end":[126,28],"bytes":[2684,2705]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent"},"127:5":{"kind":"call","span":{"start":[127,5],"end":[127,42],"bytes":[2734,2771]},"callee":null},"131:4":{"kind":"call","span":{"start":[131,4],"end":[131,27],"bytes":[2835,2858]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents"},"136:4":{"kind":"call","span":{"start":[136,4],"end":[136,60],"bytes":[2929,2985]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","kind":"method","span":{"start":[394,1],"end":[438,2],"bytes":[8881,9883]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","parameters":[{"name":"dir","type":"string","span":{"start":[394,1],"end":[394,56],"bytes":[8881,8936]}}],"metrics":{"cyclomatic":12},"body":{"396:19":{"kind":"call","span":{"start":[396,19],"end":[396,34],"bytes":[8975,8990]},"callee":null},"398:8":{"kind":"call","span":{"start":[398,8],"end":[398,26],"bytes":[9016,9034]},"callee":null},"399:5":{"kind":"call","span":{"start":[399,5],"end":[399,65],"bytes":[9041,9101]},"callee":null},"405:7":{"kind":"call","span":{"start":[405,7],"end":[405,20],"bytes":[9162,9175]},"callee":null},"408:12":{"kind":"call","span":{"start":[408,12],"end":[408,44],"bytes":[9207,9239]},"callee":null},"408:31":{"kind":"call","span":{"start":[408,31],"end":[408,43],"bytes":[9226,9238]},"callee":null},"409:4":{"kind":"call","span":{"start":[409,4],"end":[409,36],"bytes":[9243,9275]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase"},"414:9":{"kind":"call","span":{"start":[414,9],"end":[434,4],"bytes":[9301,9775]},"callee":null},"435:20":{"kind":"call","span":{"start":[435,20],"end":[435,38],"bytes":[9795,9813]},"callee":null},"436:3":{"kind":"call","span":{"start":[436,3],"end":[436,63],"bytes":[9818,9878]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","kind":"function","span":{"start":[414,1],"end":[434,4],"bytes":[9293,9775]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[414,1],"end":[414,82],"bytes":[9293,9374]}},{"name":"d","type":"os.DirEntry","span":{"start":[414,1],"end":[414,82],"bytes":[9293,9374]}},{"name":"err","type":"error","span":{"start":[414,1],"end":[414,82],"bytes":[9293,9374]}}],"return_type":"error","error_channel":["error"],"body":{"416:7":{"kind":"call","span":{"start":[416,7],"end":[416,25],"bytes":[9399,9417]},"callee":null},"419:4":{"kind":"call","span":{"start":[419,4],"end":[419,71],"bytes":[9443,9510]},"callee":null},"423:6":{"kind":"call","span":{"start":[423,6],"end":[423,15],"bytes":[9535,9544]},"callee":null},"425:15":{"kind":"call","span":{"start":[425,15],"end":[425,41],"bytes":[9581,9607]},"callee":null},"426:6":{"kind":"call","span":{"start":[426,6],"end":[426,72],"bytes":[9627,9693]},"callee":null},"432:3":{"kind":"call","span":{"start":[432,3],"end":[432,35],"bytes":[9726,9758]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath","kind":"method","span":{"start":[385,1],"end":[390,2],"bytes":[8497,8708]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath","parameters":[{"name":"path","type":"string","span":{"start":[385,1],"end":[385,63],"bytes":[8497,8559]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"386:10":{"kind":"call","span":{"start":[386,10],"end":[386,29],"bytes":[8569,8588]},"callee":null},"387:9":{"kind":"call","span":{"start":[387,9],"end":[387,40],"bytes":[8597,8628]},"callee":null},"388:3":{"kind":"call","span":{"start":[388,3],"end":[388,34],"bytes":[8634,8665]},"callee":null},"389:3":{"kind":"call","span":{"start":[389,3],"end":[389,38],"bytes":[8671,8706]},"callee":null}}}},"fields":{"cancel":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[31,1],"end":[31,28],"bytes":[577,604]}},"config":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/config","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[24,1],"end":[24,21],"bytes":[451,471]}},"ctx":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/ctx","kind":"field","type":"context.Context","span":{"start":[30,1],"end":[30,25],"bytes":[552,576]}},"dbs":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/dbs","kind":"field","type":"map[string]*github.com/benbjohnson/litestream.DB","span":{"start":[36,1],"end":[36,39],"bytes":[652,690]}},"debounceActive":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/debounceActive","kind":"field","type":"bool","span":{"start":[41,1],"end":[41,21],"bytes":[831,851]}},"dirPath":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/dirPath","kind":"field","type":"string","span":{"start":[25,1],"end":[25,18],"bytes":[472,489]}},"logger":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[33,1],"end":[33,21],"bytes":[606,626]}},"mu":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/mu","kind":"field","type":"sync.Mutex","span":{"start":[35,1],"end":[35,24],"bytes":[628,651]}},"pattern":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/pattern","kind":"field","type":"string","span":{"start":[26,1],"end":[26,18],"bytes":[490,507]}},"pendingEvents":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/pendingEvents","kind":"field","type":"map[string]github.com/fsnotify/fsnotify.Op","span":{"start":[40,1],"end":[40,39],"bytes":[792,830]}},"recursive":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/recursive","kind":"field","type":"bool","span":{"start":[27,1],"end":[27,16],"bytes":[508,523]}},"store":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/store","kind":"field","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[23,1],"end":[23,29],"bytes":[422,450]}},"watchedDirs":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/watchedDirs","kind":"field","type":"map[string]struct{}","span":{"start":[37,1],"end":[37,33],"bytes":[691,723]}},"watcher":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/watcher","kind":"field","type":"*github.com/fsnotify/fsnotify.Watcher","span":{"start":[29,1],"end":[29,27],"bytes":[525,551]}},"wg":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[43,1],"end":[43,19],"bytes":[853,871]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor":{"id":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","kind":"function","span":{"start":[47,1],"end":[101,2],"bytes":[953,2162]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[47,1],"end":[47,142],"bytes":[953,1094]}},{"name":"store","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[47,1],"end":[47,142],"bytes":[953,1094]}},{"name":"dbc","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[47,1],"end":[47,142],"bytes":[953,1094]}},{"name":"existing","type":"[]*github.com/benbjohnson/litestream.DB","span":{"start":[47,1],"end":[47,142],"bytes":[953,1094]}}],"return_type":"(*github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"49:15":{"kind":"call","span":{"start":[49,15],"end":[49,53],"bytes":[1126,1164]},"callee":null},"52:15":{"kind":"call","span":{"start":[52,15],"end":[52,43],"bytes":[1201,1229]},"callee":null},"55:18":{"kind":"call","span":{"start":[55,18],"end":[55,33],"bytes":[1251,1266]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"60:15":{"kind":"call","span":{"start":[60,15],"end":[60,31],"bytes":[1320,1336]},"callee":null},"64:18":{"kind":"call","span":{"start":[64,18],"end":[64,39],"bytes":[1390,1411]},"callee":null},"69:24":{"kind":"call","span":{"start":[69,24],"end":[69,47],"bytes":[1474,1497]},"callee":null},"79:18":{"kind":"call","span":{"start":[79,18],"end":[79,43],"bytes":[1755,1780]},"callee":null},"80:18":{"kind":"call","span":{"start":[80,18],"end":[80,49],"bytes":[1799,1830]},"callee":null},"81:18":{"kind":"call","span":{"start":[81,18],"end":[81,43],"bytes":[1849,1874]},"callee":null},"82:18":{"kind":"call","span":{"start":[82,18],"end":[82,46],"bytes":[1893,1921]},"callee":null},"86:10":{"kind":"call","span":{"start":[86,10],"end":[86,19],"bytes":[1967,1976]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"89:12":{"kind":"call","span":{"start":[89,12],"end":[89,34],"bytes":[1998,2020]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches"},"90:3":{"kind":"call","span":{"start":[90,3],"end":[90,18],"bytes":[2037,2052]},"callee":null},"91:3":{"kind":"call","span":{"start":[91,3],"end":[91,11],"bytes":[2055,2063]},"callee":null},"95:2":{"kind":"call","span":{"start":[95,2],"end":[95,30],"bytes":[2087,2115]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory"},"97:2":{"kind":"call","span":{"start":[97,2],"end":[97,14],"bytes":[2118,2130]},"callee":null},"98:5":{"kind":"call","span":{"start":[98,5],"end":[98,13],"bytes":[2135,2143]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","is_goroutine":true}}}},"content_hash":"4ce58f90eab9eeb776b3513c62283d921b77d2c3b830358b012af2d7e7ac2f36"},"cmd/litestream/info.go":{"id":"can://go/litestream/cmd/litestream/info.go","kind":"module","span":{"start":[1,1],"end":[113,1],"bytes":[0,2888]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// InfoCommand represents the command to show daemon information.\ntype InfoCommand struct{}\n\n// Run executes the info command.\nfunc (c *InfoCommand) Run(_ context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-info\", flag.ContinueOnError)\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\ttimeout := fs.Int(\"timeout\", 10, \"timeout in seconds\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() \u003e 0 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\tresp, err := client.Get(\"http://localhost/info\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"info failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"info failed: %s\", string(body))\n\t}\n\n\tvar result litestream.InfoResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t} else {\n\t\tuptime := time.Duration(result.UptimeSeconds) * time.Second\n\t\tfmt.Printf(\"Litestream %s\\n\", result.Version)\n\t\tfmt.Printf(\" PID: %d\\n\", result.PID)\n\t\tfmt.Printf(\" Uptime: %s\\n\", uptime)\n\t\tfmt.Printf(\" Started at: %s\\n\", result.StartedAt.Format(time.RFC3339))\n\t\tfmt.Printf(\" Databases: %d\\n\", result.DatabaseCount)\n\t}\n\n\treturn nil\n}\n\n// Usage prints the help text for the info command.\nfunc (c *InfoCommand) Usage() {\n\tfmt.Println(`\nusage: litestream info [OPTIONS]\n\nShow daemon information from a running Litestream instance.\n\nOptions:\n -json\n Output raw JSON instead of human-readable text.\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -timeout SECONDS\n Maximum time to wait in seconds (default: 10).\n\nExamples:\n $ litestream info\n $ litestream info -json\n $ litestream info -socket /tmp/litestream.sock\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"net","path":"net","span":{"start":[9,1],"end":[9,7],"bytes":[72,78]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[79,90]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[91,98]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[13,1],"end":[13,37],"bytes":[100,136]}}],"types":{"InfoCommand":{"id":"can://go/litestream/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand","kind":"struct","span":{"start":[17,1],"end":[17,26],"bytes":[206,231]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run":{"id":"can://go/litestream/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","kind":"method","span":{"start":[20,1],"end":[88,2],"bytes":[267,2351]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","parameters":[{"name":"_","type":"context.Context","span":{"start":[20,1],"end":[20,68],"bytes":[267,334]}},{"name":"args","type":"[]string","span":{"start":[20,1],"end":[20,68],"bytes":[267,334]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"21:8":{"kind":"call","span":{"start":[21,8],"end":[21,64],"bytes":[342,398]},"callee":null},"22:16":{"kind":"call","span":{"start":[22,16],"end":[22,86],"bytes":[414,484]},"callee":null},"23:13":{"kind":"call","span":{"start":[23,13],"end":[23,56],"bytes":[497,540]},"callee":null},"24:16":{"kind":"call","span":{"start":[24,16],"end":[24,57],"bytes":[556,597]},"callee":null},"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,26],"bytes":[629,643]},"callee":null},"30:5":{"kind":"call","span":{"start":[30,5],"end":[30,14],"bytes":[679,688]},"callee":null},"31:10":{"kind":"call","span":{"start":[31,10],"end":[31,42],"bytes":[704,736]},"callee":null},"35:10":{"kind":"call","span":{"start":[35,10],"end":[35,54],"bytes":[770,814]},"callee":null},"38:19":{"kind":"call","span":{"start":[38,19],"end":[38,42],"bytes":[837,860]},"callee":null},"48:15":{"kind":"call","span":{"start":[48,15],"end":[48,50],"bytes":[1121,1156]},"callee":null},"50:10":{"kind":"call","span":{"start":[50,10],"end":[50,68],"bytes":[1183,1241]},"callee":null},"52:8":{"kind":"call","span":{"start":[52,8],"end":[52,25],"bytes":[1252,1269]},"callee":null},"54:15":{"kind":"call","span":{"start":[54,15],"end":[54,36],"bytes":[1285,1306]},"callee":null},"56:10":{"kind":"call","span":{"start":[56,10],"end":[56,56],"bytes":[1333,1379]},"callee":null},"61:13":{"kind":"call","span":{"start":[61,13],"end":[61,43],"bytes":[1474,1504]},"callee":null},"62:11":{"kind":"call","span":{"start":[62,11],"end":[62,55],"bytes":[1552,1596]},"callee":null},"64:10":{"kind":"call","span":{"start":[64,10],"end":[64,53],"bytes":[1610,1653]},"callee":null},"64:40":{"kind":"call","span":{"start":[64,40],"end":[64,52],"bytes":[1640,1652]},"callee":null},"68:12":{"kind":"call","span":{"start":[68,12],"end":[68,41],"bytes":[1705,1734]},"callee":null},"69:10":{"kind":"call","span":{"start":[69,10],"end":[69,57],"bytes":[1758,1805]},"callee":null},"73:18":{"kind":"call","span":{"start":[73,18],"end":[73,54],"bytes":[1845,1881]},"callee":null},"75:11":{"kind":"call","span":{"start":[75,11],"end":[75,59],"bytes":[1910,1958]},"callee":null},"77:15":{"kind":"call","span":{"start":[77,15],"end":[77,29],"bytes":[1977,1991]},"callee":null},"77:3":{"kind":"call","span":{"start":[77,3],"end":[77,30],"bytes":[1965,1992]},"callee":null},"79:13":{"kind":"call","span":{"start":[79,13],"end":[79,48],"bytes":[2015,2050]},"callee":null},"80:3":{"kind":"call","span":{"start":[80,3],"end":[80,48],"bytes":[2067,2112]},"callee":null},"81:3":{"kind":"call","span":{"start":[81,3],"end":[81,47],"bytes":[2115,2159]},"callee":null},"82:3":{"kind":"call","span":{"start":[82,3],"end":[82,43],"bytes":[2162,2202]},"callee":null},"83:3":{"kind":"call","span":{"start":[83,3],"end":[83,74],"bytes":[2205,2276]},"callee":null},"83:36":{"kind":"call","span":{"start":[83,36],"end":[83,73],"bytes":[2238,2275]},"callee":null},"84:3":{"kind":"call","span":{"start":[84,3],"end":[84,57],"bytes":[2279,2333]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run.closure_1","kind":"function","span":{"start":[42,1],"end":[44,6],"bytes":[956,1097]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[42,1],"end":[42,73],"bytes":[956,1028]}},{"name":"_","type":"string","span":{"start":[42,1],"end":[42,73],"bytes":[956,1028]}},{"name":"_","type":"string","span":{"start":[42,1],"end":[42,73],"bytes":[956,1028]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"43:12":{"kind":"call","span":{"start":[43,12],"end":[43,63],"bytes":[1040,1091]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Usage":{"id":"can://go/litestream/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Usage","kind":"method","span":{"start":[91,1],"end":[112,2],"bytes":[2405,2887]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"92:2":{"kind":"call","span":{"start":[92,2],"end":[111,7],"bytes":[2438,2885]},"callee":null}}}}}},"functions":{},"content_hash":"c67f1ed730a0f301fb7642ebc95fca5357a437b59373b2e2eaf4b0acd322a2d7"},"cmd/litestream/list.go":{"id":"can://go/litestream/cmd/litestream/list.go","kind":"module","span":{"start":[1,1],"end":[118,1],"bytes":[0,2872]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// ListCommand represents the command to list all managed databases.\ntype ListCommand struct{}\n\n// Run executes the list command.\nfunc (c *ListCommand) Run(_ context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-list\", flag.ContinueOnError)\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\ttimeout := fs.Int(\"timeout\", 10, \"timeout in seconds\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() \u003e 0 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\tresp, err := client.Get(\"http://localhost/list\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"list failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"list failed: %s\", string(body))\n\t}\n\n\tvar result litestream.ListResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t} else {\n\t\tif len(result.Databases) == 0 {\n\t\t\tfmt.Println(\"No databases configured\")\n\t\t} else {\n\t\t\tfor _, db := range result.Databases {\n\t\t\t\tsyncInfo := \"never\"\n\t\t\t\tif db.LastSyncAt != nil {\n\t\t\t\t\tsyncInfo = db.LastSyncAt.Format(time.RFC3339)\n\t\t\t\t}\n\t\t\t\tfmt.Printf(\"%s [%s] (last sync: %s)\\n\", db.Path, db.Status, syncInfo)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Usage prints the help text for the list command.\nfunc (c *ListCommand) Usage() {\n\tfmt.Println(`\nusage: litestream list [OPTIONS]\n\nList all managed databases from a running daemon.\n\nOptions:\n -json\n Output raw JSON instead of human-readable text.\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -timeout SECONDS\n Maximum time to wait in seconds (default: 10).\n\nExamples:\n $ litestream list\n $ litestream list -json\n $ litestream list -socket /tmp/litestream.sock\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"net","path":"net","span":{"start":[9,1],"end":[9,7],"bytes":[72,78]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[79,90]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[91,98]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[13,1],"end":[13,37],"bytes":[100,136]}}],"types":{"ListCommand":{"id":"can://go/litestream/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand","kind":"struct","span":{"start":[17,1],"end":[17,26],"bytes":[209,234]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run":{"id":"can://go/litestream/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","kind":"method","span":{"start":[20,1],"end":[93,2],"bytes":[270,2345]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","parameters":[{"name":"_","type":"context.Context","span":{"start":[20,1],"end":[20,68],"bytes":[270,337]}},{"name":"args","type":"[]string","span":{"start":[20,1],"end":[20,68],"bytes":[270,337]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":14},"body":{"21:8":{"kind":"call","span":{"start":[21,8],"end":[21,64],"bytes":[345,401]},"callee":null},"22:16":{"kind":"call","span":{"start":[22,16],"end":[22,86],"bytes":[417,487]},"callee":null},"23:13":{"kind":"call","span":{"start":[23,13],"end":[23,56],"bytes":[500,543]},"callee":null},"24:16":{"kind":"call","span":{"start":[24,16],"end":[24,57],"bytes":[559,600]},"callee":null},"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,26],"bytes":[632,646]},"callee":null},"30:5":{"kind":"call","span":{"start":[30,5],"end":[30,14],"bytes":[682,691]},"callee":null},"31:10":{"kind":"call","span":{"start":[31,10],"end":[31,42],"bytes":[707,739]},"callee":null},"35:10":{"kind":"call","span":{"start":[35,10],"end":[35,54],"bytes":[773,817]},"callee":null},"38:19":{"kind":"call","span":{"start":[38,19],"end":[38,42],"bytes":[840,863]},"callee":null},"48:15":{"kind":"call","span":{"start":[48,15],"end":[48,50],"bytes":[1124,1159]},"callee":null},"50:10":{"kind":"call","span":{"start":[50,10],"end":[50,68],"bytes":[1186,1244]},"callee":null},"52:8":{"kind":"call","span":{"start":[52,8],"end":[52,25],"bytes":[1255,1272]},"callee":null},"54:15":{"kind":"call","span":{"start":[54,15],"end":[54,36],"bytes":[1288,1309]},"callee":null},"56:10":{"kind":"call","span":{"start":[56,10],"end":[56,56],"bytes":[1336,1382]},"callee":null},"61:13":{"kind":"call","span":{"start":[61,13],"end":[61,43],"bytes":[1477,1507]},"callee":null},"62:11":{"kind":"call","span":{"start":[62,11],"end":[62,55],"bytes":[1555,1599]},"callee":null},"64:10":{"kind":"call","span":{"start":[64,10],"end":[64,53],"bytes":[1613,1656]},"callee":null},"64:40":{"kind":"call","span":{"start":[64,40],"end":[64,52],"bytes":[1643,1655]},"callee":null},"68:12":{"kind":"call","span":{"start":[68,12],"end":[68,41],"bytes":[1708,1737]},"callee":null},"69:10":{"kind":"call","span":{"start":[69,10],"end":[69,57],"bytes":[1761,1808]},"callee":null},"73:18":{"kind":"call","span":{"start":[73,18],"end":[73,54],"bytes":[1848,1884]},"callee":null},"75:11":{"kind":"call","span":{"start":[75,11],"end":[75,59],"bytes":[1913,1961]},"callee":null},"77:15":{"kind":"call","span":{"start":[77,15],"end":[77,29],"bytes":[1980,1994]},"callee":null},"77:3":{"kind":"call","span":{"start":[77,3],"end":[77,30],"bytes":[1968,1995]},"callee":null},"79:6":{"kind":"call","span":{"start":[79,6],"end":[79,27],"bytes":[2011,2032]},"callee":null},"80:4":{"kind":"call","span":{"start":[80,4],"end":[80,42],"bytes":[2043,2081]},"callee":null},"85:17":{"kind":"call","span":{"start":[85,17],"end":[85,51],"bytes":[2204,2238]},"callee":null},"87:5":{"kind":"call","span":{"start":[87,5],"end":[87,74],"bytes":[2249,2318]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run.closure_1","kind":"function","span":{"start":[42,1],"end":[44,6],"bytes":[959,1100]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[42,1],"end":[42,73],"bytes":[959,1031]}},{"name":"_","type":"string","span":{"start":[42,1],"end":[42,73],"bytes":[959,1031]}},{"name":"_","type":"string","span":{"start":[42,1],"end":[42,73],"bytes":[959,1031]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"43:12":{"kind":"call","span":{"start":[43,12],"end":[43,63],"bytes":[1043,1094]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Usage":{"id":"can://go/litestream/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Usage","kind":"method","span":{"start":[96,1],"end":[117,2],"bytes":[2399,2871]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"97:2":{"kind":"call","span":{"start":[97,2],"end":[116,7],"bytes":[2432,2869]},"callee":null}}}}}},"functions":{},"content_hash":"dc9c59c70f84ba2a92cb656c5b6d52a9d74272c89b53fea8d58a1087b60d66ee"},"cmd/litestream/ltx.go":{"id":"can://go/litestream/cmd/litestream/ltx.go","kind":"module","span":{"start":[1,1],"end":[186,1],"bytes":[0,4202]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// LTXCommand represents a command to list LTX files for a database.\ntype LTXCommand struct{}\n\n// Run executes the command.\nfunc (c *LTXCommand) Run(ctx context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-ltx\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tvar level levelVar\n\tfs.Var(\u0026level, \"level\", \"compaction level (0-9 or \\\"all\\\")\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t} else if fs.NArg() == 0 || fs.Arg(0) == \"\" {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path or replica URL required\",\n\t\t\thint: \"litestream ltx /path/to/db\",\n\t\t}\n\t} else if fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tvar r *litestream.Replica\n\tif litestream.IsURL(fs.Arg(0)) {\n\t\tif *configPath != \"\" {\n\t\t\treturn fmt.Errorf(\"cannot specify a replica URL and the -config flag\")\n\t\t}\n\t\tif r, err = NewReplicaFromConfig(\u0026ReplicaConfig{URL: fs.Arg(0)}, nil); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tinternal.InitLog(os.Stdout, \"INFO\", \"text\", false)\n\t} else {\n\t\tif *configPath == \"\" {\n\t\t\t*configPath = DefaultConfigPath()\n\t\t}\n\n\t\t// Load configuration.\n\t\tconfig, err := ReadConfigFile(*configPath, !*noExpandEnv)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Lookup database from configuration file by path.\n\t\tpath, err := expand(fs.Arg(0))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdbc := config.DBConfig(path)\n\t\tif dbc == nil {\n\t\t\treturn fmt.Errorf(\"database not found in config: %s\", path)\n\t\t}\n\n\t\tdb, err := NewDBFromConfig(dbc)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t} else if db.Replica == nil {\n\t\t\treturn fmt.Errorf(\"database has no replica\")\n\t\t}\n\t\tr = db.Replica\n\t}\n\n\t// Determine which levels to iterate.\n\tvar levels []int\n\tif int(level) == levelAll {\n\t\tfor lvl := 0; lvl \u003c= litestream.SnapshotLevel; lvl++ {\n\t\t\tlevels = append(levels, lvl)\n\t\t}\n\t} else {\n\t\tlevels = []int{int(level)}\n\t}\n\n\tfiles := make([]LTXFileInfo, 0)\n\tfor _, lvl := range levels {\n\t\titr, err := r.Client.LTXFiles(ctx, lvl, 0, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor itr.Next() {\n\t\t\tinfo := itr.Item()\n\t\t\tfiles = append(files, LTXFileInfo{\n\t\t\t\tLevel: lvl,\n\t\t\t\tMinTXID: info.MinTXID.String(),\n\t\t\t\tMaxTXID: info.MaxTXID.String(),\n\t\t\t\tSize: info.Size,\n\t\t\t\tTimestamp: info.CreatedAt.Format(time.RFC3339),\n\t\t\t})\n\t\t}\n\t\tif err := itr.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(files, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tw := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)\n\tdefer w.Flush()\n\n\tfmt.Fprintln(w, \"level\\tmin_txid\\tmax_txid\\tsize\\tcreated\")\n\tfor _, file := range files {\n\t\tfmt.Fprintf(w, \"%d\\t%s\\t%s\\t%d\\t%s\\n\",\n\t\t\tfile.Level,\n\t\t\tfile.MinTXID,\n\t\t\tfile.MaxTXID,\n\t\t\tfile.Size,\n\t\t\tfile.Timestamp,\n\t\t)\n\t}\n\treturn nil\n}\n\ntype LTXFileInfo struct {\n\tLevel int `json:\"level\"`\n\tMinTXID string `json:\"min_txid\"`\n\tMaxTXID string `json:\"max_txid\"`\n\tSize int64 `json:\"size\"`\n\tTimestamp string `json:\"timestamp\"`\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *LTXCommand) Usage() {\n\tfmt.Printf(`\nThe ltx command lists all LTX files available for a database.\n\nUsage:\n\n\tlitestream ltx [arguments] DB_PATH\n\n\tlitestream ltx [arguments] REPLICA_URL\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\n\t-level LEVEL\n\t Compaction level to list (0-9 or \"all\").\n\t Defaults to 0.\n\n\t-json\n\t Output raw JSON instead of human-readable text.\n\nExamples:\n\n\t# List all LTX files for a database.\n\t$ litestream ltx /path/to/db\n\n\t# List all LTX files for replica URL.\n\t$ litestream ltx s3://mybkt/db\n\n\t# List LTX files at snapshot level (level 9).\n\t$ litestream ltx -level 9 /path/to/db\n\n\t# List LTX files across all compaction levels.\n\t$ litestream ltx -level all /path/to/db\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"tabwriter","path":"text/tabwriter","span":{"start":[9,1],"end":[9,18],"bytes":[72,89]}},{"name":"time","path":"time","span":{"start":[10,1],"end":[10,8],"bytes":[90,97]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[12,1],"end":[12,37],"bytes":[99,135]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[13,1],"end":[13,46],"bytes":[136,181]}}],"types":{"LTXCommand":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand","kind":"struct","span":{"start":[17,1],"end":[17,25],"bytes":[254,278]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","kind":"method","span":{"start":[20,1],"end":[131,2],"bytes":[309,3083]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[20,1],"end":[20,75],"bytes":[309,383]}},{"name":"args","type":"[]string","span":{"start":[20,1],"end":[20,75],"bytes":[309,383]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":22},"body":{"100:16":{"kind":"call","span":{"start":[100,16],"end":[100,51],"bytes":[2471,2506]},"callee":null},"103:13":{"kind":"call","span":{"start":[103,13],"end":[103,24],"bytes":[2530,2541]},"callee":null},"109:18":{"kind":"call","span":{"start":[109,18],"end":[109,53],"bytes":[2613,2648]},"callee":null},"111:11":{"kind":"call","span":{"start":[111,11],"end":[111,59],"bytes":[2677,2725]},"callee":null},"113:15":{"kind":"call","span":{"start":[113,15],"end":[113,29],"bytes":[2744,2758]},"callee":null},"113:3":{"kind":"call","span":{"start":[113,3],"end":[113,30],"bytes":[2732,2759]},"callee":null},"117:7":{"kind":"call","span":{"start":[117,7],"end":[117,54],"bytes":[2783,2830]},"callee":null},"118:8":{"kind":"call","span":{"start":[118,8],"end":[118,17],"bytes":[2838,2847]},"callee":null},"120:2":{"kind":"call","span":{"start":[120,2],"end":[120,61],"bytes":[2850,2909]},"callee":null},"122:3":{"kind":"call","span":{"start":[122,3],"end":[128,4],"bytes":[2942,3066]},"callee":null},"21:8":{"kind":"call","span":{"start":[21,8],"end":[21,63],"bytes":[391,446]},"callee":null},"22:29":{"kind":"call","span":{"start":[22,29],"end":[22,51],"bytes":[475,497]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"23:16":{"kind":"call","span":{"start":[23,16],"end":[23,57],"bytes":[513,554]},"callee":null},"25:2":{"kind":"call","span":{"start":[25,2],"end":[25,62],"bytes":[576,636]},"callee":null},"27:12":{"kind":"call","span":{"start":[27,12],"end":[27,26],"bytes":[668,682]},"callee":null},"29:12":{"kind":"call","span":{"start":[29,12],"end":[29,21],"bytes":[721,730]},"callee":null},"29:30":{"kind":"call","span":{"start":[29,30],"end":[29,39],"bytes":[739,748]},"callee":null},"34:12":{"kind":"call","span":{"start":[34,12],"end":[34,21],"bytes":[889,898]},"callee":null},"35:10":{"kind":"call","span":{"start":[35,10],"end":[35,42],"bytes":[914,946]},"callee":null},"39:22":{"kind":"call","span":{"start":[39,22],"end":[39,31],"bytes":[999,1008]},"callee":null},"39:5":{"kind":"call","span":{"start":[39,5],"end":[39,32],"bytes":[982,1009]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL"},"41:11":{"kind":"call","span":{"start":[41,11],"end":[41,74],"bytes":[1047,1110]},"callee":null},"43:15":{"kind":"call","span":{"start":[43,15],"end":[43,72],"bytes":[1129,1186]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"},"43:56":{"kind":"call","span":{"start":[43,56],"end":[43,65],"bytes":[1170,1179]},"callee":null},"46:3":{"kind":"call","span":{"start":[46,3],"end":[46,53],"bytes":[1221,1271]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"49:18":{"kind":"call","span":{"start":[49,18],"end":[49,37],"bytes":[1324,1343]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"53:18":{"kind":"call","span":{"start":[53,18],"end":[53,60],"bytes":[1391,1433]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"59:16":{"kind":"call","span":{"start":[59,16],"end":[59,33],"bytes":[1540,1557]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"59:23":{"kind":"call","span":{"start":[59,23],"end":[59,32],"bytes":[1547,1556]},"callee":null},"63:10":{"kind":"call","span":{"start":[63,10],"end":[63,31],"bytes":[1603,1624]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig"},"65:11":{"kind":"call","span":{"start":[65,11],"end":[65,63],"bytes":[1653,1705]},"callee":null},"68:14":{"kind":"call","span":{"start":[68,14],"end":[68,34],"bytes":[1724,1744]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"72:11":{"kind":"call","span":{"start":[72,11],"end":[72,48],"bytes":[1819,1856]},"callee":null},"79:5":{"kind":"call","span":{"start":[79,5],"end":[79,15],"bytes":[1943,1953]},"callee":null},"81:13":{"kind":"call","span":{"start":[81,13],"end":[81,32],"bytes":[2037,2056]},"callee":null},"84:18":{"kind":"call","span":{"start":[84,18],"end":[84,28],"bytes":[2088,2098]},"callee":null},"87:11":{"kind":"call","span":{"start":[87,11],"end":[87,33],"bytes":[2114,2136]},"callee":null},"89:15":{"kind":"call","span":{"start":[89,15],"end":[89,52],"bytes":[2181,2218]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"93:7":{"kind":"call","span":{"start":[93,7],"end":[93,17],"bytes":[2261,2271]},"callee":null},"94:12":{"kind":"call","span":{"start":[94,12],"end":[94,22],"bytes":[2285,2295]},"callee":null},"95:12":{"kind":"call","span":{"start":[95,12],"end":[101,6],"bytes":[2307,2513]},"callee":null},"97:16":{"kind":"call","span":{"start":[97,16],"end":[97,37],"bytes":[2369,2390]},"callee":null},"98:16":{"kind":"call","span":{"start":[98,16],"end":[98,37],"bytes":[2407,2428]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage","kind":"method","span":{"start":[142,1],"end":[185,2],"bytes":[3331,4201]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"143:2":{"kind":"call","span":{"start":[143,2],"end":[184,3],"bytes":[3363,4199]},"callee":null},"183:3":{"kind":"call","span":{"start":[183,3],"end":[183,22],"bytes":[4176,4195]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}}}},"LTXFileInfo":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo","kind":"struct","span":{"start":[133,1],"end":[139,2],"bytes":[3085,3286]},"callables":{},"fields":{"Level":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/Level","kind":"field","type":"int","span":{"start":[134,1],"end":[134,33],"bytes":[3111,3143]}},"MaxTXID":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/MaxTXID","kind":"field","type":"string","span":{"start":[136,1],"end":[136,36],"bytes":[3180,3215]}},"MinTXID":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/MinTXID","kind":"field","type":"string","span":{"start":[135,1],"end":[135,36],"bytes":[3144,3179]}},"Size":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/Size","kind":"field","type":"int64","span":{"start":[137,1],"end":[137,32],"bytes":[3216,3247]}},"Timestamp":{"id":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/Timestamp","kind":"field","type":"string","span":{"start":[138,1],"end":[138,37],"bytes":[3248,3284]}}}}},"functions":{},"content_hash":"c867d7c1e1585c6d60a877522f63f540250d718c555f7798562841631be556b5"},"cmd/litestream/main.go":{"id":"can://go/litestream/cmd/litestream/main.go","kind":"module","span":{"start":[1,1],"end":[2209,1],"bytes":[0,65049]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"os\"\n\t\"os/user\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"runtime/debug\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/dustin/go-humanize\"\n\t\"github.com/superfly/ltx\"\n\t_ \"golang.org/x/crypto/x509roots/fallback\"\n\t\"gopkg.in/yaml.v2\"\n\t_ \"modernc.org/sqlite\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/abs\"\n\t\"github.com/benbjohnson/litestream/file\"\n\t\"github.com/benbjohnson/litestream/gs\"\n\t\"github.com/benbjohnson/litestream/internal\"\n\t\"github.com/benbjohnson/litestream/nats\"\n\t\"github.com/benbjohnson/litestream/oss\"\n\t\"github.com/benbjohnson/litestream/s3\"\n\t\"github.com/benbjohnson/litestream/sftp\"\n\t\"github.com/benbjohnson/litestream/webdav\"\n)\n\n// Version is set via -ldflags \"-X main.Version=...\" on release and Makefile\n// builds; otherwise it is resolved from embedded VCS build info at startup.\nvar Version = defaultVersion\n\nfunc init() {\n\tbi, _ := debug.ReadBuildInfo()\n\tVersion = resolveVersion(Version, bi)\n}\n\n// errStop is a terminal error for indicating program should quit.\nvar errStop = errors.New(\"stop\")\n\n// Sentinel errors for configuration validation\nvar (\n\tErrInvalidSnapshotInterval = errors.New(\"snapshot interval must be greater than 0\")\n\tErrInvalidSnapshotRetention = errors.New(\"snapshot retention must be greater than 0\")\n\tErrInvalidCompactionInterval = errors.New(\"compaction interval must be greater than 0\")\n\tErrInvalidSyncInterval = errors.New(\"sync interval must be greater than 0\")\n\tErrInvalidL0Retention = errors.New(\"l0 retention must not be negative\")\n\tErrInvalidL0RetentionCheckInterval = errors.New(\"l0 retention check interval must be greater than 0\")\n\tErrInvalidShutdownSyncTimeout = errors.New(\"shutdown-sync-timeout must be \u003e= 0\")\n\tErrInvalidShutdownSyncInterval = errors.New(\"shutdown sync interval must be greater than 0\")\n\tErrInvalidHeartbeatURL = errors.New(\"heartbeat URL must be a valid HTTP or HTTPS URL\")\n\tErrInvalidHeartbeatInterval = errors.New(\"heartbeat interval must be at least 1 minute\")\n\tErrConfigFileNotFound = errors.New(\"config file not found\")\n)\n\n// ConfigValidationError wraps a validation error with additional context\ntype ConfigValidationError struct {\n\tErr error\n\tField string\n\tValue interface{}\n}\n\nfunc (e *ConfigValidationError) Error() string {\n\tif e.Value != nil {\n\t\treturn fmt.Sprintf(\"%s: %v (got %v)\", e.Field, e.Err, e.Value)\n\t}\n\treturn fmt.Sprintf(\"%s: %v\", e.Field, e.Err)\n}\n\nfunc (e *ConfigValidationError) Unwrap() error {\n\treturn e.Err\n}\n\nfunc main() {\n\tinternal.InitLog(os.Stdout, \"INFO\", \"text\", false)\n\n\tm := NewMain()\n\tif err := m.Run(context.Background(), os.Args[1:]); errors.Is(err, errStop) {\n\t\tos.Exit(1)\n\t} else if errors.Is(err, flag.ErrHelp) {\n\t\tfor _, arg := range os.Args[1:] {\n\t\t\tif arg == \"-h\" || arg == \"-help\" || arg == \"--help\" {\n\t\t\t\tos.Exit(0)\n\t\t\t}\n\t\t}\n\t\tos.Exit(1)\n\t} else if err != nil {\n\t\t_, _ = fmt.Fprintf(os.Stderr, \"Error: %s\\n\", err)\n\t\tvar usageErr *usageError\n\t\tif errors.As(err, \u0026usageErr) \u0026\u0026 usageErr.hint != \"\" {\n\t\t\t_, _ = fmt.Fprintf(os.Stderr, \"Try: %s\\n\", usageErr.hint)\n\t\t}\n\t\tos.Exit(1)\n\t}\n}\n\ntype usageError struct {\n\tmessage string\n\thint string\n}\n\nfunc (e *usageError) Error() string {\n\treturn e.message\n}\n\n// Main represents the main program execution.\ntype Main struct{}\n\n// NewMain returns a new instance of Main.\nfunc NewMain() *Main {\n\treturn \u0026Main{}\n}\n\n// Run executes the program.\nfunc (m *Main) Run(ctx context.Context, args []string) (err error) {\n\t// Execute replication command if running as a Windows service.\n\tif isService, err := isWindowsService(); err != nil {\n\t\treturn err\n\t} else if isService {\n\t\treturn runWindowsService(ctx)\n\t}\n\n\t// Copy \"LITESTEAM\" environment credentials.\n\tapplyLitestreamEnv()\n\n\t// Extract command name.\n\tvar cmd string\n\tif len(args) \u003e 0 {\n\t\tcmd, args = args[0], args[1:]\n\t}\n\n\tswitch cmd {\n\tcase \"databases\":\n\t\treturn (\u0026DatabasesCommand{}).Run(ctx, args)\n\tcase \"replicate\":\n\t\tc := NewReplicateCommand()\n\t\tif err := c.ParseFlags(ctx, args); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Setup signal handler.\n\t\tsignalCh := signalChan()\n\n\t\t// Create done channel for interrupt during shutdown. It will be\n\t\t// closed when a second signal arrives, allowing each database's\n\t\t// retry loop to observe the interrupt.\n\t\tdone := make(chan struct{})\n\t\tc.SetDone(done)\n\n\t\tif err := c.Run(ctx); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Wait for signal to stop program.\n\t\tselect {\n\t\tcase err = \u003c-c.execCh:\n\t\t\tif c.cmd != nil {\n\t\t\t\tslog.Info(\"subprocess exited, litestream shutting down\")\n\t\t\t} else {\n\t\t\t\tslog.Info(\"replication complete, litestream shutting down\")\n\t\t\t}\n\t\tcase sig := \u003c-signalCh:\n\t\t\tslog.Info(\"signal received, litestream shutting down\", \"signal\", sig)\n\n\t\t\tif c.cmd != nil {\n\t\t\t\tslog.Info(\"sending signal to exec process\")\n\t\t\t\tif err := c.cmd.Process.Signal(sig); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"cannot signal exec process: %w\", err)\n\t\t\t\t}\n\n\t\t\t\tslog.Info(\"waiting for exec process to close\")\n\t\t\t\tif err := \u003c-c.execCh; err != nil \u0026\u0026 !strings.HasPrefix(err.Error(), \"signal:\") {\n\t\t\t\t\treturn fmt.Errorf(\"cannot wait for exec process: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Listen for a second signal to close done and interrupt retry loops.\n\t\t\tgo func() {\n\t\t\t\t\u003c-signalCh\n\t\t\t\tclose(done)\n\t\t\t}()\n\t\t}\n\n\t\t// Gracefully close.\n\t\tif e := c.Close(ctx); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t\tslog.Info(\"litestream shut down\")\n\t\treturn err\n\n\tcase \"start\":\n\t\treturn (\u0026StartCommand{}).Run(ctx, args)\n\tcase \"stop\":\n\t\treturn (\u0026StopCommand{}).Run(ctx, args)\n\tcase \"register\":\n\t\treturn (\u0026RegisterCommand{}).Run(ctx, args)\n\tcase \"unregister\":\n\t\treturn (\u0026UnregisterCommand{}).Run(ctx, args)\n\tcase \"reset\":\n\t\treturn (\u0026ResetCommand{}).Run(ctx, args)\n\tcase \"restore\":\n\t\treturn (\u0026RestoreCommand{}).Run(ctx, args)\n\tcase \"status\":\n\t\treturn (\u0026StatusCommand{}).Run(ctx, args)\n\tcase \"sync\":\n\t\treturn (\u0026SyncCommand{}).Run(ctx, args)\n\tcase \"list\":\n\t\treturn (\u0026ListCommand{}).Run(ctx, args)\n\tcase \"info\":\n\t\treturn (\u0026InfoCommand{}).Run(ctx, args)\n\tcase \"version\":\n\t\treturn (\u0026VersionCommand{}).Run(ctx, args)\n\tcase \"ltx\":\n\t\treturn (\u0026LTXCommand{}).Run(ctx, args)\n\tcase \"wal\":\n\t\t// Deprecated: Keep for backward compatibility\n\t\tfmt.Fprintln(os.Stderr, \"Warning: 'wal' command is deprecated, please use 'ltx' instead\")\n\t\treturn (\u0026LTXCommand{}).Run(ctx, args)\n\tdefault:\n\t\tif cmd == \"help\" || cmd == \"-h\" || cmd == \"-help\" || cmd == \"--help\" {\n\t\t\tm.Usage()\n\t\t\treturn nil\n\t\t} else if cmd == \"\" || strings.HasPrefix(cmd, \"-\") {\n\t\t\tm.Usage()\n\t\t\treturn flag.ErrHelp\n\t\t}\n\t\treturn fmt.Errorf(\"litestream %s: unknown command\", cmd)\n\t}\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (m *Main) Usage() {\n\tfmt.Println(`\nlitestream is a tool for replicating SQLite databases.\n\nUsage:\n\n\tlitestream \u003ccommand\u003e [arguments]\n\nThe commands are:\n\n\tdatabases list databases specified in config file\n\tinfo show daemon information\n\tlist list all managed databases\n\tltx list available LTX files for a database\n\tregister register a database for replication\n\treplicate runs a server to replicate databases\n\treset reset local state for a database\n\trestore recovers database backup from a replica\n\tstart start replication for a database\n\tstatus display replication status for databases\n\tstop stop replication for a database\n\tsync force an immediate sync for a database\n\tunregister unregister a database from replication\n\tversion prints the binary version\n`[1:])\n}\n\n// Config represents a configuration file for the litestream daemon.\ntype Config struct {\n\t// Global replica settings that serve as defaults for all replicas\n\tReplicaSettings `yaml:\",inline\"`\n\n\t// Bind address for serving metrics.\n\tAddr string `yaml:\"addr\"`\n\n\t// Socket configuration for control commands.\n\tSocket litestream.SocketConfig `yaml:\"socket\"`\n\n\t// List of stages in a multi-level compaction.\n\t// Only includes L1 through the last non-snapshot level.\n\tLevels []*CompactionLevelConfig `yaml:\"levels\"`\n\n\t// Snapshot configuration\n\tSnapshot SnapshotConfig `yaml:\"snapshot\"`\n\n\t// Validation configuration\n\tValidation ValidationConfig `yaml:\"validation\"`\n\n\t// L0 retention settings\n\tL0Retention *time.Duration `yaml:\"l0-retention\"`\n\tL0RetentionCheckInterval *time.Duration `yaml:\"l0-retention-check-interval\"`\n\n\t// Verify TXID consistency at destination level after each compaction.\n\t// When enabled, logs warnings if gaps or overlaps are detected.\n\tVerifyCompaction bool `yaml:\"verify-compaction\"`\n\n\t// Retention configuration\n\tRetention RetentionConfig `yaml:\"retention\"`\n\n\t// Heartbeat settings (global defaults)\n\tHeartbeatURL string `yaml:\"heartbeat-url\"`\n\tHeartbeatInterval *time.Duration `yaml:\"heartbeat-interval\"`\n\n\t// List of databases to manage.\n\tDBs []*DBConfig `yaml:\"dbs\"`\n\n\t// Subcommand to execute during replication.\n\t// Litestream will shutdown when subcommand exits.\n\tExec string `yaml:\"exec\"`\n\n\t// Logging\n\tLogging internal.LoggingConfig `yaml:\"logging\"`\n\n\t// MCP server options\n\tMCPAddr string `yaml:\"mcp-addr\"`\n\n\t// Shutdown sync retry settings\n\tShutdownSyncTimeout *time.Duration `yaml:\"shutdown-sync-timeout\"`\n\tShutdownSyncInterval *time.Duration `yaml:\"shutdown-sync-interval\"`\n\n\t// Path to the config file\n\t// This is only used internally to pass the config path to the MCP tool\n\tConfigPath string `yaml:\"-\"`\n}\n\n// SnapshotConfig configures snapshots.\ntype SnapshotConfig struct {\n\tInterval *time.Duration `yaml:\"interval\"`\n\tRetention *time.Duration `yaml:\"retention\"`\n}\n\n// RetentionConfig configures retention enforcement behavior.\ntype RetentionConfig struct {\n\tEnabled *bool `yaml:\"enabled\"`\n}\n\n// ValidationConfig configures periodic validation checks.\ntype ValidationConfig struct {\n\tInterval *time.Duration `yaml:\"interval\"`\n}\n\n// propagateGlobalSettings copies global replica settings to individual replica configs.\nfunc (c *Config) propagateGlobalSettings() {\n\tfor _, dbc := range c.DBs {\n\t\t// Handle both old-style 'replicas' and new-style 'replica'\n\t\tif dbc.Replica != nil {\n\t\t\tdbc.Replica.SetDefaults(\u0026c.ReplicaSettings)\n\t\t}\n\t\tfor _, rc := range dbc.Replicas {\n\t\t\trc.SetDefaults(\u0026c.ReplicaSettings)\n\t\t}\n\t}\n}\n\nfunc (c *Config) applyDBSnapshotConfig(globalIntervalSet, globalRetentionSet bool) error {\n\tvar interval *time.Duration\n\tvar intervalDB string\n\tvar retention *time.Duration\n\tvar retentionDB string\n\n\tfor _, db := range c.DBs {\n\t\tdbID := db.Path\n\t\tif dbID == \"\" {\n\t\t\tdbID = db.Dir\n\t\t}\n\t\tif db.Snapshot.Interval != nil {\n\t\t\tif interval != nil \u0026\u0026 *interval != *db.Snapshot.Interval {\n\t\t\t\treturn fmt.Errorf(\"conflicting database snapshot intervals: %s has %v, %s has %v\", intervalDB, *interval, dbID, *db.Snapshot.Interval)\n\t\t\t}\n\t\t\tinterval = db.Snapshot.Interval\n\t\t\tintervalDB = dbID\n\t\t}\n\t\tif db.Snapshot.Retention != nil {\n\t\t\tif retention != nil \u0026\u0026 *retention != *db.Snapshot.Retention {\n\t\t\t\treturn fmt.Errorf(\"conflicting database snapshot retentions: %s has %v, %s has %v\", retentionDB, *retention, dbID, *db.Snapshot.Retention)\n\t\t\t}\n\t\t\tretention = db.Snapshot.Retention\n\t\t\tretentionDB = dbID\n\t\t}\n\t}\n\n\tif !globalIntervalSet \u0026\u0026 interval != nil {\n\t\tc.Snapshot.Interval = interval\n\t}\n\tif !globalRetentionSet \u0026\u0026 retention != nil {\n\t\tc.Snapshot.Retention = retention\n\t}\n\treturn nil\n}\n\n// DefaultConfig returns a new instance of Config with defaults set.\nfunc DefaultConfig() Config {\n\tdefaultSnapshotInterval := 24 * time.Hour\n\tdefaultSnapshotRetention := 24 * time.Hour\n\tdefaultL0Retention := litestream.DefaultL0Retention\n\tdefaultL0RetentionCheckInterval := litestream.DefaultL0RetentionCheckInterval\n\tdefaultShutdownSyncTimeout := litestream.DefaultShutdownSyncTimeout\n\tdefaultShutdownSyncInterval := litestream.DefaultShutdownSyncInterval\n\treturn Config{\n\t\tLevels: []*CompactionLevelConfig{\n\t\t\t{Interval: litestream.DefaultCompactionLevels[1].Interval},\n\t\t\t{Interval: litestream.DefaultCompactionLevels[2].Interval},\n\t\t\t{Interval: litestream.DefaultCompactionLevels[3].Interval},\n\t\t},\n\t\tSnapshot: SnapshotConfig{\n\t\t\tInterval: \u0026defaultSnapshotInterval,\n\t\t\tRetention: \u0026defaultSnapshotRetention,\n\t\t},\n\t\tSocket: litestream.DefaultSocketConfig(),\n\t\tL0Retention: \u0026defaultL0Retention,\n\t\tL0RetentionCheckInterval: \u0026defaultL0RetentionCheckInterval,\n\t\tShutdownSyncTimeout: \u0026defaultShutdownSyncTimeout,\n\t\tShutdownSyncInterval: \u0026defaultShutdownSyncInterval,\n\t}\n}\n\n// Validate returns an error if config contains invalid settings.\nfunc (c *Config) Validate() error {\n\t// Validate snapshot intervals\n\tif c.Snapshot.Interval != nil \u0026\u0026 *c.Snapshot.Interval \u003c= 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidSnapshotInterval,\n\t\t\tField: \"snapshot.interval\",\n\t\t\tValue: *c.Snapshot.Interval,\n\t\t}\n\t}\n\tif c.Snapshot.Retention != nil \u0026\u0026 *c.Snapshot.Retention \u003c= 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidSnapshotRetention,\n\t\t\tField: \"snapshot.retention\",\n\t\t\tValue: *c.Snapshot.Retention,\n\t\t}\n\t}\n\tif c.L0Retention != nil \u0026\u0026 *c.L0Retention \u003c 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidL0Retention,\n\t\t\tField: \"l0-retention\",\n\t\t\tValue: *c.L0Retention,\n\t\t}\n\t}\n\tif c.L0RetentionCheckInterval != nil \u0026\u0026 *c.L0RetentionCheckInterval \u003c= 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidL0RetentionCheckInterval,\n\t\t\tField: \"l0-retention-check-interval\",\n\t\t\tValue: *c.L0RetentionCheckInterval,\n\t\t}\n\t}\n\tif c.ShutdownSyncTimeout != nil \u0026\u0026 *c.ShutdownSyncTimeout \u003c 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidShutdownSyncTimeout,\n\t\t\tField: \"shutdown-sync-timeout\",\n\t\t\tValue: *c.ShutdownSyncTimeout,\n\t\t}\n\t}\n\tif c.ShutdownSyncInterval != nil \u0026\u0026 *c.ShutdownSyncInterval \u003c= 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidShutdownSyncInterval,\n\t\t\tField: \"shutdown-sync-interval\",\n\t\t\tValue: *c.ShutdownSyncInterval,\n\t\t}\n\t}\n\n\t// Validate global heartbeat settings\n\tif c.HeartbeatURL != \"\" \u0026\u0026 !isValidHeartbeatURL(c.HeartbeatURL) {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidHeartbeatURL,\n\t\t\tField: \"heartbeat-url\",\n\t\t\tValue: c.HeartbeatURL,\n\t\t}\n\t}\n\tif c.HeartbeatInterval != nil \u0026\u0026 *c.HeartbeatInterval \u003c litestream.MinHeartbeatInterval {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidHeartbeatInterval,\n\t\t\tField: \"heartbeat-interval\",\n\t\t\tValue: *c.HeartbeatInterval,\n\t\t}\n\t}\n\n\t// Validate compaction level intervals\n\tfor i, level := range c.Levels {\n\t\tif level.Interval \u003c= 0 {\n\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\tErr: ErrInvalidCompactionInterval,\n\t\t\t\tField: fmt.Sprintf(\"levels[%d].interval\", i),\n\t\t\t\tValue: level.Interval,\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate database configs\n\tseenPaths := make(map[string]int) // cleaned path -\u003e 1-based config index\n\tfor idx, db := range c.DBs {\n\t\t// Validate that either path or dir is specified, but not both\n\t\tif db.Path != \"\" \u0026\u0026 db.Dir != \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: cannot specify both 'path' and 'dir'\", idx+1)\n\t\t}\n\t\tif db.Path == \"\" \u0026\u0026 db.Dir == \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: must specify either 'path' or 'dir'\", idx+1)\n\t\t}\n\n\t\t// Reject the same database path listed twice. The metadata directory is\n\t\t// derived from the path, so two entries would share it and race on the\n\t\t// same LTX temp files.\n\t\tif db.Path != \"\" {\n\t\t\tkey := filepath.Clean(db.Path)\n\t\t\tif first, ok := seenPaths[key]; ok {\n\t\t\t\treturn fmt.Errorf(\"database config #%d: duplicate path %q (already used by database config #%d); each database can be listed only once\", idx+1, db.Path, first)\n\t\t\t}\n\t\t\tseenPaths[key] = idx + 1\n\t\t}\n\n\t\t// When using dir, pattern must be specified\n\t\tif db.Dir != \"\" \u0026\u0026 db.Pattern == \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: 'pattern' is required when using 'dir'\", idx+1)\n\t\t}\n\t\tif db.Watch \u0026\u0026 db.Dir == \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: 'watch' can only be enabled with a directory\", idx+1)\n\t\t}\n\t\tif db.MetaDir != nil \u0026\u0026 db.Dir == \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: 'meta-dir' can only be used with a directory\", idx+1)\n\t\t}\n\t\tif db.MetaPath != nil \u0026\u0026 db.MetaDir != nil {\n\t\t\treturn fmt.Errorf(\"database config #%d: cannot specify both 'meta-path' and 'meta-dir'\", idx+1)\n\t\t}\n\n\t\t// Use path or dir for identifying the config in error messages\n\t\tdbIdentifier := db.Path\n\t\tif dbIdentifier == \"\" {\n\t\t\tdbIdentifier = db.Dir\n\t\t}\n\n\t\tif db.Snapshot.Interval != nil \u0026\u0026 *db.Snapshot.Interval \u003c= 0 {\n\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\tErr: ErrInvalidSnapshotInterval,\n\t\t\t\tField: fmt.Sprintf(\"dbs[%s].snapshot.interval\", dbIdentifier),\n\t\t\t\tValue: *db.Snapshot.Interval,\n\t\t\t}\n\t\t}\n\t\tif db.Snapshot.Retention != nil \u0026\u0026 *db.Snapshot.Retention \u003c= 0 {\n\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\tErr: ErrInvalidSnapshotRetention,\n\t\t\t\tField: fmt.Sprintf(\"dbs[%s].snapshot.retention\", dbIdentifier),\n\t\t\t\tValue: *db.Snapshot.Retention,\n\t\t\t}\n\t\t}\n\n\t\t// Validate sync intervals for replicas\n\t\tif db.Replica != nil \u0026\u0026 db.Replica.SyncInterval != nil \u0026\u0026 *db.Replica.SyncInterval \u003c= 0 {\n\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\tErr: ErrInvalidSyncInterval,\n\t\t\t\tField: fmt.Sprintf(\"dbs[%s].replica.sync-interval\", dbIdentifier),\n\t\t\t\tValue: *db.Replica.SyncInterval,\n\t\t\t}\n\t\t}\n\t\tfor i, replica := range db.Replicas {\n\t\t\tif replica.SyncInterval != nil \u0026\u0026 *replica.SyncInterval \u003c= 0 {\n\t\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\t\tErr: ErrInvalidSyncInterval,\n\t\t\t\t\tField: fmt.Sprintf(\"dbs[%s].replicas[%d].sync-interval\", dbIdentifier, i),\n\t\t\t\t\tValue: *replica.SyncInterval,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// CompactionLevels returns a full list of compaction levels include L0.\nfunc (c *Config) CompactionLevels() litestream.CompactionLevels {\n\tlevels := litestream.CompactionLevels{\n\t\t{Level: 0},\n\t}\n\n\tfor i, lvl := range c.Levels {\n\t\tlevels = append(levels, \u0026litestream.CompactionLevel{\n\t\t\tLevel: i + 1,\n\t\t\tInterval: lvl.Interval,\n\t\t})\n\t}\n\n\treturn levels\n}\n\n// DBConfig returns database configuration by path.\nfunc (c *Config) DBConfig(configPath string) *DBConfig {\n\tfor _, dbConfig := range c.DBs {\n\t\tif dbConfig.Path == configPath {\n\t\t\treturn dbConfig\n\t\t}\n\t}\n\treturn nil\n}\n\n// OpenConfigFile opens a configuration file and returns a reader.\n// Expands the filename path if needed.\nfunc OpenConfigFile(filename string) (io.ReadCloser, error) {\n\t// Expand filename, if necessary.\n\tfilename, err := expand(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Open configuration file.\n\tf, err := os.Open(filename)\n\tif os.IsNotExist(err) {\n\t\treturn nil, fmt.Errorf(\"%w: %s\", ErrConfigFileNotFound, filename)\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn f, nil\n}\n\n// ReadConfigFile unmarshals config from filename. Expands path if needed.\n// If expandEnv is true then environment variables are expanded in the config.\nfunc ReadConfigFile(filename string, expandEnv bool) (Config, error) {\n\tf, err := OpenConfigFile(filename)\n\tif err != nil {\n\t\treturn DefaultConfig(), err\n\t}\n\tdefer f.Close()\n\n\treturn ParseConfig(f, expandEnv)\n}\n\n// ParseConfig unmarshals config from a reader.\n// If expandEnv is true then environment variables are expanded in the config.\nfunc ParseConfig(r io.Reader, expandEnv bool) (_ Config, err error) {\n\tconfig := DefaultConfig()\n\n\t// Read configuration.\n\tbuf, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn config, err\n\t}\n\n\t// Expand environment variables, if enabled.\n\tif expandEnv {\n\t\tbuf = []byte(os.Expand(string(buf), func(key string) string {\n\t\t\tif key == \"PID\" {\n\t\t\t\treturn strconv.Itoa(os.Getpid())\n\t\t\t}\n\t\t\treturn os.Getenv(key)\n\t\t}))\n\t}\n\n\tvar raw struct {\n\t\tSnapshot *SnapshotConfig `yaml:\"snapshot\"`\n\t}\n\tif err := yaml.Unmarshal(buf, \u0026raw); err != nil {\n\t\treturn config, err\n\t}\n\tglobalSnapshotIntervalSet := raw.Snapshot != nil \u0026\u0026 raw.Snapshot.Interval != nil\n\tglobalSnapshotRetentionSet := raw.Snapshot != nil \u0026\u0026 raw.Snapshot.Retention != nil\n\n\t// Save defaults before unmarshaling\n\tdefaultSnapshotInterval := config.Snapshot.Interval\n\tdefaultSnapshotRetention := config.Snapshot.Retention\n\tdefaultL0Retention := config.L0Retention\n\tdefaultL0RetentionCheckInterval := config.L0RetentionCheckInterval\n\n\tif err := yaml.Unmarshal(buf, \u0026config); err != nil {\n\t\treturn config, err\n\t}\n\n\t// Restore defaults if they were overwritten with nil by empty YAML sections\n\tif config.Snapshot.Interval == nil {\n\t\tconfig.Snapshot.Interval = defaultSnapshotInterval\n\t}\n\tif config.Snapshot.Retention == nil {\n\t\tconfig.Snapshot.Retention = defaultSnapshotRetention\n\t}\n\tif config.L0Retention == nil {\n\t\tconfig.L0Retention = defaultL0Retention\n\t}\n\tif config.L0RetentionCheckInterval == nil {\n\t\tconfig.L0RetentionCheckInterval = defaultL0RetentionCheckInterval\n\t}\n\tif err := config.applyDBSnapshotConfig(globalSnapshotIntervalSet, globalSnapshotRetentionSet); err != nil {\n\t\treturn config, err\n\t}\n\n\t// Normalize paths.\n\tfor _, dbConfig := range config.DBs {\n\t\tif dbConfig.Path == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif dbConfig.Path, err = expand(dbConfig.Path); err != nil {\n\t\t\treturn config, err\n\t\t}\n\t}\n\n\t// Propagate settings from global config to individual configs.\n\tconfig.propagateGlobalSettings()\n\n\t// Validate configuration\n\tif err := config.Validate(); err != nil {\n\t\treturn config, err\n\t}\n\n\t// Configure logging.\n\tlogOutput := os.Stdout\n\tif config.Logging.Stderr {\n\t\tlogOutput = os.Stderr\n\t}\n\tif v := os.Getenv(\"LOG_LEVEL\"); v != \"\" {\n\t\tconfig.Logging.Level = v\n\t}\n\tinternal.InitLog(logOutput, config.Logging.Level, config.Logging.Type, config.Logging.Source)\n\n\treturn config, nil\n}\n\n// CompactionLevelConfig the configuration for a single level of compaction.\ntype CompactionLevelConfig struct {\n\tInterval time.Duration `yaml:\"interval\"`\n}\n\n// DBConfig represents the configuration for a single database or directory of databases.\ntype DBConfig struct {\n\tPath string `yaml:\"path\"`\n\tDir string `yaml:\"dir\"` // Directory to scan for databases\n\tPattern string `yaml:\"pattern\"` // File pattern to match (e.g., \"*.db\", \"*.sqlite\")\n\tRecursive bool `yaml:\"recursive\"` // Scan subdirectories recursively\n\tWatch bool `yaml:\"watch\"` // Enable directory monitoring for changes\n\tSnapshot SnapshotConfig `yaml:\"snapshot\"`\n\tMetaPath *string `yaml:\"meta-path\"`\n\tMetaDir *string `yaml:\"meta-dir\"`\n\tMonitorInterval *time.Duration `yaml:\"monitor-interval\"`\n\tCheckpointInterval *time.Duration `yaml:\"checkpoint-interval\"`\n\tBusyTimeout *time.Duration `yaml:\"busy-timeout\"`\n\tMinCheckpointPageN *int `yaml:\"min-checkpoint-page-count\"`\n\tTruncatePageN *int `yaml:\"truncate-page-n\"`\n\tMaxSyncWALBytes *int64 `yaml:\"max-sync-wal-bytes\"`\n\n\tRestoreIfDBNotExists bool `yaml:\"restore-if-db-not-exists\"`\n\n\tReplica *ReplicaConfig `yaml:\"replica\"`\n\tReplicas []*ReplicaConfig `yaml:\"replicas\"` // Deprecated\n}\n\n// NewDBFromConfig instantiates a DB based on a configuration.\nfunc NewDBFromConfig(dbc *DBConfig) (*litestream.DB, error) {\n\tif dbc.MetaDir != nil {\n\t\treturn nil, fmt.Errorf(\"'meta-dir' can only be used with a directory\")\n\t}\n\n\tconfigPath, err := expand(dbc.Path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Initialize database with given path.\n\tdb := litestream.NewDB(configPath)\n\n\t// Override default database settings if specified in configuration.\n\tif dbc.MetaPath != nil {\n\t\texpandedMetaPath, err := expand(*dbc.MetaPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to expand meta path: %w\", err)\n\t\t}\n\t\tdbc.MetaPath = \u0026expandedMetaPath\n\t\tdb.SetMetaPath(expandedMetaPath)\n\t}\n\tif dbc.MonitorInterval != nil {\n\t\tdb.MonitorInterval = *dbc.MonitorInterval\n\t}\n\tif dbc.CheckpointInterval != nil {\n\t\tdb.CheckpointInterval = *dbc.CheckpointInterval\n\t}\n\tif dbc.BusyTimeout != nil {\n\t\tdb.BusyTimeout = *dbc.BusyTimeout\n\t}\n\tif dbc.MinCheckpointPageN != nil {\n\t\tdb.MinCheckpointPageN = *dbc.MinCheckpointPageN\n\t}\n\tif dbc.TruncatePageN != nil {\n\t\tdb.TruncatePageN = *dbc.TruncatePageN\n\t}\n\tif dbc.MaxSyncWALBytes != nil {\n\t\tdb.MaxSyncWALBytes = *dbc.MaxSyncWALBytes\n\t}\n\n\t// Instantiate and attach replica.\n\t// v0.3.x and before supported multiple replicas but that was dropped to\n\t// ensure there's a single remote data authority.\n\tswitch {\n\tcase dbc.Replica == nil \u0026\u0026 len(dbc.Replicas) == 0:\n\t\treturn nil, fmt.Errorf(\"must specify replica for database\")\n\tcase dbc.Replica != nil \u0026\u0026 len(dbc.Replicas) \u003e 0:\n\t\treturn nil, fmt.Errorf(\"cannot specify 'replica' and 'replicas' on a database\")\n\tcase len(dbc.Replicas) \u003e 1:\n\t\treturn nil, fmt.Errorf(\"multiple replicas on a single database are no longer supported\")\n\t}\n\n\tvar rc *ReplicaConfig\n\tif dbc.Replica != nil {\n\t\trc = dbc.Replica\n\t} else {\n\t\trc = dbc.Replicas[0]\n\t}\n\n\tr, err := NewReplicaFromConfig(rc, db)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdb.Replica = r\n\n\treturn db, nil\n}\n\n// NewDBsFromDirectoryConfig scans a directory and creates DB instances for all SQLite databases found.\nfunc NewDBsFromDirectoryConfig(dbc *DBConfig) ([]*litestream.DB, error) {\n\tif dbc.Dir == \"\" {\n\t\treturn nil, fmt.Errorf(\"directory path is required for directory replication\")\n\t}\n\n\tif dbc.Pattern == \"\" {\n\t\treturn nil, fmt.Errorf(\"pattern is required for directory replication\")\n\t}\n\tif dbc.MetaPath != nil \u0026\u0026 dbc.MetaDir != nil {\n\t\treturn nil, fmt.Errorf(\"cannot specify both 'meta-path' and 'meta-dir'\")\n\t}\n\n\tdirPath, err := expand(dbc.Dir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Find all SQLite databases in the directory\n\tdbPaths, err := FindSQLiteDatabases(dirPath, dbc.Pattern, dbc.Recursive)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to scan directory %s: %w\", dirPath, err)\n\t}\n\n\tif len(dbPaths) == 0 \u0026\u0026 !dbc.Watch {\n\t\treturn nil, fmt.Errorf(\"no SQLite databases found in directory %s with pattern %s\", dirPath, dbc.Pattern)\n\t}\n\n\t// Create DB instances for each found database\n\tvar dbs []*litestream.DB\n\tmetaPaths := make(map[string]string)\n\n\tfor _, dbPath := range dbPaths {\n\t\tdb, err := newDBFromDirectoryEntry(dbc, dirPath, dbPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create DB for %s: %w\", dbPath, err)\n\t\t}\n\n\t\t// Validate unique meta-path to prevent replication state corruption\n\t\tif mp := db.MetaPath(); mp != \"\" {\n\t\t\tif existingDB, exists := metaPaths[mp]; exists {\n\t\t\t\treturn nil, fmt.Errorf(\"meta-path collision: databases %s and %s would share meta-path %s, causing replication state corruption\", existingDB, dbPath, mp)\n\t\t\t}\n\t\t\tmetaPaths[mp] = dbPath\n\t\t}\n\n\t\tdbs = append(dbs, db)\n\t}\n\n\treturn dbs, nil\n}\n\n// newDBFromDirectoryEntry creates a DB instance for a database discovered via directory replication.\nfunc newDBFromDirectoryEntry(dbc *DBConfig, dirPath, dbPath string) (*litestream.DB, error) {\n\t// Calculate relative path from directory root\n\trelPath, err := filepath.Rel(dirPath, dbPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to calculate relative path for %s: %w\", dbPath, err)\n\t}\n\n\t// Create a copy of the config for the discovered database\n\tdbConfigCopy := *dbc\n\tdbConfigCopy.Path = dbPath\n\tdbConfigCopy.Dir = \"\" // Clear dir field for individual DB\n\tdbConfigCopy.Pattern = \"\" // Clear pattern field\n\tdbConfigCopy.Recursive = false // Clear recursive flag\n\tdbConfigCopy.Watch = false // Individual DBs do not watch directories\n\n\t// Ensure every database discovered beneath a directory receives a unique\n\t// metadata path. Without this, all databases share the same meta-path and\n\t// clobber each other's replication state.\n\tswitch {\n\tcase dbc.MetaDir != nil:\n\t\tbaseMetaDir, err := expand(*dbc.MetaDir)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to expand meta dir for %s: %w\", dbPath, err)\n\t\t}\n\t\tmetaPathCopy := filepath.Join(baseMetaDir, relPath+litestream.MetaDirSuffix)\n\t\tdbConfigCopy.MetaPath = \u0026metaPathCopy\n\t\tdbConfigCopy.MetaDir = nil\n\tcase dbc.MetaPath != nil:\n\t\tbaseMetaPath, err := expand(*dbc.MetaPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to expand meta path for %s: %w\", dbPath, err)\n\t\t}\n\t\tmetaPathCopy := deriveMetaPathForDirectoryEntry(baseMetaPath, relPath)\n\t\tdbConfigCopy.MetaPath = \u0026metaPathCopy\n\t\tdbConfigCopy.MetaDir = nil\n\t}\n\n\t// Deep copy replica config and make path unique per database.\n\t// This prevents all databases from writing to the same replica path.\n\tif dbc.Replica != nil {\n\t\treplicaCopy, err := cloneReplicaConfigWithRelativePath(dbc.Replica, relPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to configure replica for %s: %w\", dbPath, err)\n\t\t}\n\t\tdbConfigCopy.Replica = replicaCopy\n\t}\n\n\t// Also handle deprecated 'replicas' array field.\n\tif len(dbc.Replicas) \u003e 0 {\n\t\tdbConfigCopy.Replicas = make([]*ReplicaConfig, len(dbc.Replicas))\n\t\tfor i, replica := range dbc.Replicas {\n\t\t\treplicaCopy, err := cloneReplicaConfigWithRelativePath(replica, relPath)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to configure replica %d for %s: %w\", i, dbPath, err)\n\t\t\t}\n\t\t\tdbConfigCopy.Replicas[i] = replicaCopy\n\t\t}\n\t}\n\n\treturn NewDBFromConfig(\u0026dbConfigCopy)\n}\n\n// cloneReplicaConfigWithRelativePath returns a copy of the replica configuration with the\n// database-relative path appended to either the replica path or URL, depending on how the\n// replica was configured.\nfunc cloneReplicaConfigWithRelativePath(base *ReplicaConfig, relPath string) (*ReplicaConfig, error) {\n\tif base == nil {\n\t\treturn nil, nil\n\t}\n\n\treplicaCopy := *base\n\trelPath = filepath.ToSlash(relPath)\n\tif relPath == \"\" || relPath == \".\" {\n\t\treturn \u0026replicaCopy, nil\n\t}\n\n\tif replicaCopy.URL != \"\" {\n\t\tu, err := url.Parse(replicaCopy.URL)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"parse replica url: %w\", err)\n\t\t}\n\t\tappendRelativePathToURL(u, relPath)\n\t\treplicaCopy.URL = u.String()\n\t\treturn \u0026replicaCopy, nil\n\t}\n\n\tswitch base.ReplicaType() {\n\tcase \"file\":\n\t\trelOSPath := filepath.FromSlash(relPath)\n\t\tif replicaCopy.Path != \"\" {\n\t\t\treplicaCopy.Path = filepath.Join(replicaCopy.Path, relOSPath)\n\t\t} else {\n\t\t\treplicaCopy.Path = relOSPath\n\t\t}\n\tdefault:\n\t\t// Normalize to forward slashes for cloud/object storage backends.\n\t\tbasePath := filepath.ToSlash(replicaCopy.Path)\n\t\tif basePath != \"\" {\n\t\t\treplicaCopy.Path = path.Join(basePath, relPath)\n\t\t} else {\n\t\t\treplicaCopy.Path = relPath\n\t\t}\n\t}\n\n\treturn \u0026replicaCopy, nil\n}\n\n// deriveMetaPathForDirectoryEntry returns a unique metadata directory for a\n// database discovered through directory replication by appending the database's\n// relative path and the standard Litestream suffix to the configured base path.\nfunc deriveMetaPathForDirectoryEntry(basePath, relPath string) string {\n\trelPath = filepath.Clean(relPath)\n\tif relPath == \".\" || relPath == \"\" {\n\t\treturn basePath\n\t}\n\n\trelDir, relFile := filepath.Split(relPath)\n\tif relFile == \"\" || relFile == \".\" {\n\t\treturn filepath.Join(basePath, relPath)\n\t}\n\n\tmetaDirName := \".\" + relFile + litestream.MetaDirSuffix\n\treturn filepath.Join(basePath, relDir, metaDirName)\n}\n\n// appendRelativePathToURL appends relPath to the URL's path component, ensuring\n// the result remains rooted and uses forward slashes.\nfunc appendRelativePathToURL(u *url.URL, relPath string) {\n\tcleanRel := strings.TrimPrefix(relPath, \"/\")\n\tif cleanRel == \"\" || cleanRel == \".\" {\n\t\treturn\n\t}\n\n\tbasePath := u.Path\n\tvar joined string\n\tif basePath == \"\" {\n\t\tjoined = cleanRel\n\t} else {\n\t\tjoined = path.Join(basePath, cleanRel)\n\t}\n\n\tjoined = \"/\" + strings.TrimPrefix(joined, \"/\")\n\tu.Path = joined\n}\n\n// FindSQLiteDatabases recursively finds all SQLite database files in a directory.\n// Exported for testing.\nfunc FindSQLiteDatabases(dir string, pattern string, recursive bool) ([]string, error) {\n\tvar dbPaths []string\n\n\terr := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Skip directories unless recursive\n\t\tif info.IsDir() {\n\t\t\tif !recursive \u0026\u0026 path != dir {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\n\t\t// Check if file matches pattern\n\t\tmatched, err := filepath.Match(pattern, filepath.Base(path))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !matched {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Check if it's a SQLite database\n\t\tif IsSQLiteDatabase(path) {\n\t\t\tdbPaths = append(dbPaths, path)\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn dbPaths, err\n}\n\n// IsSQLiteDatabase checks if a file is a SQLite database by reading its header.\n// Exported for testing.\nfunc IsSQLiteDatabase(path string) bool {\n\tfile, err := os.Open(path)\n\tif err != nil {\n\t\treturn false\n\t}\n\tdefer file.Close()\n\n\t// SQLite files start with \"SQLite format 3\\x00\"\n\theader := make([]byte, 16)\n\tif _, err := file.Read(header); err != nil {\n\t\treturn false\n\t}\n\n\treturn string(header) == \"SQLite format 3\\x00\"\n}\n\n// ByteSize is a custom type for parsing byte sizes from YAML.\n// It supports both SI units (KB, MB, GB using base 1000) and IEC units\n// (KiB, MiB, GiB using base 1024) as well as short forms (K, M, G).\ntype ByteSize int64\n\n// UnmarshalYAML implements yaml.Unmarshaler for ByteSize.\nfunc (b *ByteSize) UnmarshalYAML(unmarshal func(interface{}) error) error {\n\tvar s string\n\tif err := unmarshal(\u0026s); err != nil {\n\t\treturn err\n\t}\n\n\tsize, err := ParseByteSize(s)\n\tif err != nil {\n\t\treturn err\n\t}\n\t*b = ByteSize(size)\n\treturn nil\n}\n\n// ParseByteSize parses a byte size string using github.com/dustin/go-humanize.\n// Supports both SI units (KB=1000, MB=1000², etc.) and IEC units (KiB=1024, MiB=1024², etc.).\n// Examples: \"1MB\", \"5MiB\", \"1.5GB\", \"100B\", \"1024KB\"\nfunc ParseByteSize(s string) (int64, error) {\n\ts = strings.TrimSpace(s)\n\tif s == \"\" {\n\t\treturn 0, fmt.Errorf(\"empty size string\")\n\t}\n\n\t// Use go-humanize to parse the byte size string\n\tbytes, err := humanize.ParseBytes(s)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"invalid size format: %w\", err)\n\t}\n\n\t// Check that the value fits in int64\n\tif bytes \u003e math.MaxInt64 {\n\t\treturn 0, fmt.Errorf(\"size %d exceeds maximum allowed value (%d)\", bytes, int64(math.MaxInt64))\n\t}\n\n\treturn int64(bytes), nil\n}\n\n// ReplicaSettings contains settings shared across replica configurations.\n// These can be set globally in Config or per-replica in ReplicaConfig.\ntype ReplicaSettings struct {\n\tSyncInterval *time.Duration `yaml:\"sync-interval\"`\n\tValidationInterval *time.Duration `yaml:\"validation-interval\"`\n\n\t// Maximum L0 files to upload in a single monitor sync run.\n\t// Set to zero to process all pending L0 files in one run.\n\tMaxSyncLTXFiles *int `yaml:\"max-sync-ltx-files\"`\n\n\t// If true, automatically reset local state when LTX errors are detected.\n\t// This allows recovery from corrupted/missing LTX files by forcing a fresh sync.\n\t// Disabled by default to prevent silent data loss scenarios.\n\tAutoRecover *bool `yaml:\"auto-recover\"`\n\n\t// S3 settings\n\tAccessKeyID string `yaml:\"access-key-id\"`\n\tSecretAccessKey string `yaml:\"secret-access-key\"`\n\tRegion string `yaml:\"region\"`\n\tBucket string `yaml:\"bucket\"`\n\tEndpoint string `yaml:\"endpoint\"`\n\tForcePathStyle *bool `yaml:\"force-path-style\"`\n\tSignPayload *bool `yaml:\"sign-payload\"`\n\tSignAcceptEncoding *bool `yaml:\"sign-accept-encoding\"`\n\tRequireContentMD5 *bool `yaml:\"require-content-md5\"`\n\tSkipVerify bool `yaml:\"skip-verify\"`\n\tStorageClass string `yaml:\"storage-class\"`\n\tPartSize *ByteSize `yaml:\"part-size\"`\n\tConcurrency *int `yaml:\"concurrency\"`\n\n\t// S3 Server-Side Encryption (SSE-C: Customer-provided keys)\n\tSSECustomerAlgorithm string `yaml:\"sse-customer-algorithm\"`\n\tSSECustomerKey string `yaml:\"sse-customer-key\"`\n\tSSECustomerKeyPath string `yaml:\"sse-customer-key-path\"`\n\n\t// S3 Server-Side Encryption (SSE-KMS: AWS Key Management Service)\n\tSSEKMSKeyID string `yaml:\"sse-kms-key-id\"`\n\n\t// ABS settings\n\tAccountName string `yaml:\"account-name\"`\n\tAccountKey string `yaml:\"account-key\"`\n\tSASToken string `yaml:\"sas-token\"`\n\n\t// SFTP settings\n\tHost string `yaml:\"host\"`\n\tUser string `yaml:\"user\"`\n\tPassword string `yaml:\"password\"`\n\tKeyPath string `yaml:\"key-path\"`\n\tConcurrentWrites *bool `yaml:\"concurrent-writes\"`\n\tHostKey string `yaml:\"host-key\"`\n\n\t// WebDAV settings\n\tWebDAVURL string `yaml:\"webdav-url\"`\n\tWebDAVUsername string `yaml:\"webdav-username\"`\n\tWebDAVPassword string `yaml:\"webdav-password\"`\n\n\t// NATS settings\n\tJWT string `yaml:\"jwt\"`\n\tSeed string `yaml:\"seed\"`\n\tCreds string `yaml:\"creds\"`\n\tNKey string `yaml:\"nkey\"`\n\tUsername string `yaml:\"username\"`\n\tToken string `yaml:\"token\"`\n\tTLS *bool `yaml:\"tls\"`\n\tRootCAs []string `yaml:\"root-cas\"`\n\tClientCert string `yaml:\"client-cert\"`\n\tClientKey string `yaml:\"client-key\"`\n\tMaxReconnects *int `yaml:\"max-reconnects\"`\n\tReconnectWait *time.Duration `yaml:\"reconnect-wait\"`\n\tTimeout *time.Duration `yaml:\"timeout\"`\n\n\t// Encryption identities and recipients\n\tAge struct {\n\t\tIdentities []string `yaml:\"identities\"`\n\t\tRecipients []string `yaml:\"recipients\"`\n\t} `yaml:\"age\"`\n}\n\n// SetDefaults merges default settings from src into the current ReplicaSettings.\n// Individual settings override defaults when already set.\nfunc (rs *ReplicaSettings) SetDefaults(src *ReplicaSettings) {\n\tif src == nil {\n\t\treturn\n\t}\n\n\t// Timing settings\n\tif rs.SyncInterval == nil \u0026\u0026 src.SyncInterval != nil {\n\t\trs.SyncInterval = src.SyncInterval\n\t}\n\tif rs.ValidationInterval == nil \u0026\u0026 src.ValidationInterval != nil {\n\t\trs.ValidationInterval = src.ValidationInterval\n\t}\n\tif rs.MaxSyncLTXFiles == nil \u0026\u0026 src.MaxSyncLTXFiles != nil {\n\t\trs.MaxSyncLTXFiles = src.MaxSyncLTXFiles\n\t}\n\n\t// Recovery settings\n\tif rs.AutoRecover == nil \u0026\u0026 src.AutoRecover != nil {\n\t\trs.AutoRecover = src.AutoRecover\n\t}\n\n\t// S3 settings\n\tif rs.AccessKeyID == \"\" {\n\t\trs.AccessKeyID = src.AccessKeyID\n\t}\n\tif rs.SecretAccessKey == \"\" {\n\t\trs.SecretAccessKey = src.SecretAccessKey\n\t}\n\tif rs.Region == \"\" {\n\t\trs.Region = src.Region\n\t}\n\tif rs.Bucket == \"\" {\n\t\trs.Bucket = src.Bucket\n\t}\n\tif rs.Endpoint == \"\" {\n\t\trs.Endpoint = src.Endpoint\n\t}\n\tif rs.ForcePathStyle == nil {\n\t\trs.ForcePathStyle = src.ForcePathStyle\n\t}\n\tif rs.SignPayload == nil {\n\t\trs.SignPayload = src.SignPayload\n\t}\n\tif rs.SignAcceptEncoding == nil {\n\t\trs.SignAcceptEncoding = src.SignAcceptEncoding\n\t}\n\tif rs.RequireContentMD5 == nil {\n\t\trs.RequireContentMD5 = src.RequireContentMD5\n\t}\n\tif src.SkipVerify {\n\t\trs.SkipVerify = true\n\t}\n\tif rs.StorageClass == \"\" {\n\t\trs.StorageClass = src.StorageClass\n\t}\n\n\t// S3 SSE settings\n\tif rs.SSECustomerAlgorithm == \"\" {\n\t\trs.SSECustomerAlgorithm = src.SSECustomerAlgorithm\n\t}\n\tif rs.SSECustomerKey == \"\" {\n\t\trs.SSECustomerKey = src.SSECustomerKey\n\t}\n\tif rs.SSECustomerKeyPath == \"\" {\n\t\trs.SSECustomerKeyPath = src.SSECustomerKeyPath\n\t}\n\tif rs.SSEKMSKeyID == \"\" {\n\t\trs.SSEKMSKeyID = src.SSEKMSKeyID\n\t}\n\n\t// ABS settings\n\tif rs.AccountName == \"\" {\n\t\trs.AccountName = src.AccountName\n\t}\n\tif rs.AccountKey == \"\" {\n\t\trs.AccountKey = src.AccountKey\n\t}\n\tif rs.SASToken == \"\" {\n\t\trs.SASToken = src.SASToken\n\t}\n\n\t// SFTP settings\n\tif rs.Host == \"\" {\n\t\trs.Host = src.Host\n\t}\n\tif rs.User == \"\" {\n\t\trs.User = src.User\n\t}\n\tif rs.Password == \"\" {\n\t\trs.Password = src.Password\n\t}\n\tif rs.KeyPath == \"\" {\n\t\trs.KeyPath = src.KeyPath\n\t}\n\tif rs.ConcurrentWrites == nil {\n\t\trs.ConcurrentWrites = src.ConcurrentWrites\n\t}\n\n\t// NATS settings\n\tif rs.JWT == \"\" {\n\t\trs.JWT = src.JWT\n\t}\n\tif rs.Seed == \"\" {\n\t\trs.Seed = src.Seed\n\t}\n\tif rs.Creds == \"\" {\n\t\trs.Creds = src.Creds\n\t}\n\tif rs.NKey == \"\" {\n\t\trs.NKey = src.NKey\n\t}\n\tif rs.Username == \"\" {\n\t\trs.Username = src.Username\n\t}\n\tif rs.Token == \"\" {\n\t\trs.Token = src.Token\n\t}\n\tif rs.TLS == nil {\n\t\trs.TLS = src.TLS\n\t}\n\tif len(rs.RootCAs) == 0 {\n\t\trs.RootCAs = src.RootCAs\n\t}\n\tif rs.ClientCert == \"\" {\n\t\trs.ClientCert = src.ClientCert\n\t}\n\tif rs.ClientKey == \"\" {\n\t\trs.ClientKey = src.ClientKey\n\t}\n\tif rs.MaxReconnects == nil {\n\t\trs.MaxReconnects = src.MaxReconnects\n\t}\n\tif rs.ReconnectWait == nil {\n\t\trs.ReconnectWait = src.ReconnectWait\n\t}\n\tif rs.Timeout == nil {\n\t\trs.Timeout = src.Timeout\n\t}\n\n\t// Age encryption settings\n\tif len(rs.Age.Identities) == 0 {\n\t\trs.Age.Identities = src.Age.Identities\n\t}\n\tif len(rs.Age.Recipients) == 0 {\n\t\trs.Age.Recipients = src.Age.Recipients\n\t}\n}\n\n// ReplicaConfig represents the configuration for a single replica in a database.\ntype ReplicaConfig struct {\n\tReplicaSettings `yaml:\",inline\"`\n\n\tType string `yaml:\"type\"` // \"file\", \"s3\"\n\tName string `yaml:\"name\"` // Deprecated\n\tPath string `yaml:\"path\"`\n\tURL string `yaml:\"url\"`\n}\n\n// NewReplicaFromConfig instantiates a replica for a DB based on a config.\nfunc NewReplicaFromConfig(c *ReplicaConfig, db *litestream.DB) (_ *litestream.Replica, err error) {\n\t// Ensure user did not specify URL in path.\n\tif litestream.IsURL(c.Path) {\n\t\treturn nil, fmt.Errorf(\"replica path cannot be a url, please use the 'url' field instead: %s\", c.Path)\n\t}\n\n\t// Reject age encryption configuration as it's currently non-functional.\n\t// Age encryption support was removed during the LTX storage layer refactor\n\t// and has not been reimplemented. Accepting this config would silently\n\t// write plaintext data to remote storage instead of encrypted data.\n\t// See: https://github.com/benbjohnson/litestream/issues/790\n\tif len(c.Age.Identities) \u003e 0 || len(c.Age.Recipients) \u003e 0 {\n\t\treturn nil, fmt.Errorf(\"age encryption is not currently supported, if you need encryption please revert back to Litestream v0.3.x\")\n\t}\n\n\t// Build replica.\n\tr := litestream.NewReplica(db)\n\tif v := c.SyncInterval; v != nil {\n\t\tr.SyncInterval = *v\n\t}\n\tif v := c.MaxSyncLTXFiles; v != nil {\n\t\tr.MaxSyncLTXFiles = *v\n\t}\n\tif v := c.AutoRecover; v != nil {\n\t\tr.AutoRecoverEnabled = *v\n\t}\n\n\t// Build and set client on replica.\n\tswitch c.ReplicaType() {\n\tcase \"file\":\n\t\tif r.Client, err = newFileReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"s3\":\n\t\tif r.Client, err = NewS3ReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"gs\":\n\t\tif r.Client, err = newGSReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"abs\":\n\t\tif r.Client, err = newABSReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"sftp\":\n\t\tif r.Client, err = newSFTPReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"webdav\":\n\t\tif r.Client, err = newWebDAVReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"nats\":\n\t\tif r.Client, err = newNATSReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"oss\":\n\t\tif r.Client, err = newOSSReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown replica type in config: %q\", c.ReplicaType())\n\t}\n\n\tr.Client.SetLogger(r.Logger())\n\n\treturn r, nil\n}\n\n// newFileReplicaClientFromConfig returns a new instance of file.ReplicaClient built from config.\nfunc newFileReplicaClientFromConfig(c *ReplicaConfig, r *litestream.Replica) (_ *file.ReplicaClient, err error) {\n\t// Ensure URL \u0026 path are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for file replica\")\n\t}\n\n\t// Parse configPath from URL, if specified.\n\tconfigPath := c.Path\n\tif c.URL != \"\" {\n\t\tif _, _, configPath, err = litestream.ParseReplicaURL(c.URL); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Ensure path is set explicitly or derived from URL field.\n\tif configPath == \"\" {\n\t\treturn nil, fmt.Errorf(\"file replica path required\")\n\t}\n\n\t// Expand home prefix and return absolute path.\n\tif configPath, err = expand(configPath); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Instantiate replica and apply time fields, if set.\n\tclient := file.NewReplicaClient(configPath)\n\tclient.Replica = r\n\treturn client, nil\n}\n\n// NewS3ReplicaClientFromConfig returns a new instance of s3.ReplicaClient built from config.\n// Exported for testing.\nfunc NewS3ReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *s3.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for s3 replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Bucket != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 bucket for s3 replica\")\n\t}\n\n\tbucket, configPath := c.Bucket, c.Path\n\tregion, endpoint, skipVerify := c.Region, c.Endpoint, c.SkipVerify\n\tstorageClass := c.StorageClass\n\tsignSetting := newBoolSetting(true)\n\tif v := c.SignPayload; v != nil {\n\t\tsignSetting.Set(*v)\n\t}\n\tsignAcceptEncodingSetting := newBoolSetting(true)\n\tif v := c.SignAcceptEncoding; v != nil {\n\t\tsignAcceptEncodingSetting.Set(*v)\n\t}\n\trequireSetting := newBoolSetting(true)\n\tif v := c.RequireContentMD5; v != nil {\n\t\trequireSetting.Set(*v)\n\t}\n\n\t// Use path style if an endpoint is explicitly set. This works because the\n\t// only service to not use path style is AWS which does not use an endpoint.\n\tforcePathStyle := (endpoint != \"\")\n\tif v := c.ForcePathStyle; v != nil {\n\t\tforcePathStyle = *v\n\t}\n\n\t// Apply settings from URL, if specified.\n\tvar (\n\t\tendpointWasSet bool\n\t\tusignPayload bool\n\t\tusignPayloadSet bool\n\t\tusignAcceptEncoding bool\n\t\tusignAcceptEncodingSet bool\n\t\turequireContentMD5 bool\n\t\turequireContentMD5Set bool\n\t\tustorageClass string\n\t\tupartSize int64\n\t\tupartSizeSet bool\n\t\tuconcurrency int64\n\t\tuconcurrencySet bool\n\t)\n\tif endpoint != \"\" {\n\t\tendpointWasSet = true\n\t}\n\n\tif c.URL != \"\" {\n\t\t_, host, upath, query, _, err := litestream.ParseReplicaURLWithQuery(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar (\n\t\t\tubucket string\n\t\t\turegion string\n\t\t\tuendpoint string\n\t\t\tuforcePathStyle bool\n\t\t)\n\n\t\tif strings.HasPrefix(host, \"arn:\") {\n\t\t\tubucket = host\n\t\t\turegion = litestream.RegionFromS3ARN(host)\n\t\t} else {\n\t\t\tubucket, uregion, uendpoint, uforcePathStyle = s3.ParseHost(host)\n\t\t}\n\n\t\t// Override with query parameters if provided\n\t\tif qEndpoint := query.Get(\"endpoint\"); qEndpoint != \"\" {\n\t\t\t// Ensure endpoint has a scheme (defaults to https:// for cloud, http:// for local)\n\t\t\tqEndpoint, _ = litestream.EnsureEndpointScheme(qEndpoint)\n\t\t\tuendpoint = qEndpoint\n\t\t\t// Default to path style for custom endpoints unless explicitly set to false\n\t\t\tif query.Get(\"forcePathStyle\") != \"false\" {\n\t\t\t\tuforcePathStyle = true\n\t\t\t}\n\t\t\tendpointWasSet = true\n\t\t}\n\t\tif qRegion := query.Get(\"region\"); qRegion != \"\" {\n\t\t\turegion = qRegion\n\t\t}\n\t\tif qForcePathStyle := query.Get(\"forcePathStyle\"); qForcePathStyle != \"\" {\n\t\t\tuforcePathStyle = qForcePathStyle == \"true\"\n\t\t}\n\t\tif qSkipVerify := query.Get(\"skipVerify\"); qSkipVerify != \"\" {\n\t\t\tskipVerify = qSkipVerify == \"true\"\n\t\t}\n\t\tif v, ok := litestream.BoolQueryValue(query, \"signPayload\", \"sign-payload\"); ok {\n\t\t\tusignPayload = v\n\t\t\tusignPayloadSet = true\n\t\t}\n\t\tif v, ok := litestream.BoolQueryValue(query, \"signAcceptEncoding\", \"sign-accept-encoding\"); ok {\n\t\t\tusignAcceptEncoding = v\n\t\t\tusignAcceptEncodingSet = true\n\t\t}\n\t\tif v, ok := litestream.BoolQueryValue(query, \"requireContentMD5\", \"require-content-md5\"); ok {\n\t\t\turequireContentMD5 = v\n\t\t\turequireContentMD5Set = true\n\t\t}\n\t\tif v := query.Get(\"storageClass\"); v != \"\" {\n\t\t\tustorageClass = v\n\t\t} else if v := query.Get(\"storage-class\"); v != \"\" {\n\t\t\tustorageClass = v\n\t\t}\n\t\tif v, ok, err := litestream.IntQueryValue(query, \"partSize\", \"part-size\"); err != nil {\n\t\t\treturn nil, err\n\t\t} else if ok {\n\t\t\tupartSize = v\n\t\t\tupartSizeSet = true\n\t\t}\n\t\tif v, ok, err := litestream.IntQueryValue(query, \"concurrency\"); err != nil {\n\t\t\treturn nil, err\n\t\t} else if ok {\n\t\t\tuconcurrency = v\n\t\t\tuconcurrencySet = true\n\t\t}\n\n\t\t// Only apply URL parts to field that have not been overridden.\n\t\tif configPath == \"\" {\n\t\t\tconfigPath = upath\n\t\t}\n\t\tif bucket == \"\" {\n\t\t\tbucket = ubucket\n\t\t}\n\t\tif region == \"\" {\n\t\t\tregion = uregion\n\t\t}\n\t\tif endpoint == \"\" {\n\t\t\tendpoint = uendpoint\n\t\t}\n\t\tif storageClass == \"\" {\n\t\t\tstorageClass = ustorageClass\n\t\t}\n\t\tif !forcePathStyle {\n\t\t\tforcePathStyle = uforcePathStyle\n\t\t}\n\t\tif !signSetting.set \u0026\u0026 usignPayloadSet {\n\t\t\tsignSetting.Set(usignPayload)\n\t\t}\n\t\tif !signAcceptEncodingSetting.set \u0026\u0026 usignAcceptEncodingSet {\n\t\t\tsignAcceptEncodingSetting.Set(usignAcceptEncoding)\n\t\t}\n\t\tif !requireSetting.set \u0026\u0026 urequireContentMD5Set {\n\t\t\trequireSetting.Set(urequireContentMD5)\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for s3 replica\")\n\t}\n\n\t// Detect S3-compatible provider endpoints for applying appropriate defaults.\n\t// These providers require specific settings to work correctly with AWS SDK v2.\n\tisHetzner := litestream.IsHetznerEndpoint(endpoint)\n\tisTigris := litestream.IsTigrisEndpoint(endpoint)\n\tif !isTigris \u0026\u0026 !endpointWasSet \u0026\u0026 litestream.IsTigrisEndpoint(c.Endpoint) {\n\t\tisTigris = true\n\t}\n\tisDigitalOcean := litestream.IsDigitalOceanEndpoint(endpoint)\n\tisBackblaze := litestream.IsBackblazeEndpoint(endpoint)\n\tisFilebase := litestream.IsFilebaseEndpoint(endpoint)\n\tisScaleway := litestream.IsScalewayEndpoint(endpoint)\n\tisMinIO := litestream.IsMinIOEndpoint(endpoint)\n\tisCloudflareR2 := litestream.IsCloudflareR2Endpoint(endpoint)\n\tisSupabase := litestream.IsSupabaseEndpoint(endpoint)\n\n\t// Track if forcePathStyle was explicitly set by user (config or URL query param).\n\tforcePathStyleSet := c.ForcePathStyle != nil\n\n\t// Apply provider-specific defaults for S3-compatible providers.\n\t// These settings ensure compatibility with each provider's S3 implementation.\n\tif isTigris {\n\t\t// Tigris: requires signed payloads, no MD5\n\t\tsignSetting.ApplyDefault(true)\n\t\trequireSetting.ApplyDefault(false)\n\t}\n\tif isHetzner || isDigitalOcean || isBackblaze || isFilebase || isScaleway || isCloudflareR2 || isMinIO || isSupabase {\n\t\t// All these providers require signed payloads (don't support UNSIGNED-PAYLOAD)\n\t\tsignSetting.ApplyDefault(true)\n\t}\n\tif !forcePathStyleSet {\n\t\t// Filebase, Backblaze B2, MinIO, and Supabase require path-style URLs\n\t\tif isFilebase || isBackblaze || isMinIO || isSupabase {\n\t\t\tforcePathStyle = true\n\t\t}\n\t}\n\n\t// Build replica.\n\tclient := s3.NewReplicaClient()\n\tclient.AccessKeyID = c.AccessKeyID\n\tclient.SecretAccessKey = c.SecretAccessKey\n\tclient.Bucket = bucket\n\tclient.Path = configPath\n\tclient.Region = region\n\tclient.Endpoint = endpoint\n\tclient.ForcePathStyle = forcePathStyle\n\tclient.SkipVerify = skipVerify\n\tclient.StorageClass = storageClass\n\n\tclient.SignPayload = signSetting.value\n\tclient.SignAcceptEncoding = signAcceptEncodingSetting.value\n\tclient.RequireContentMD5 = requireSetting.value\n\n\tif isCloudflareR2 {\n\t\tclient.Concurrency = s3.DefaultR2Concurrency\n\t}\n\tif isTigris {\n\t\tclient.Concurrency = s3.DefaultTigrisConcurrency\n\t\tclient.PartSize = s3.DefaultTigrisPartSize\n\t}\n\n\t// Apply upload configuration from URL query, then config overrides.\n\tif upartSizeSet {\n\t\tclient.PartSize = upartSize\n\t}\n\tif uconcurrencySet {\n\t\tclient.Concurrency = int(uconcurrency)\n\t}\n\tif c.PartSize != nil {\n\t\tclient.PartSize = int64(*c.PartSize)\n\t}\n\tif c.Concurrency != nil {\n\t\tclient.Concurrency = *c.Concurrency\n\t}\n\n\t// Apply SSE-C configuration if specified.\n\tif c.SSECustomerKey != \"\" || c.SSECustomerKeyPath != \"\" {\n\t\tclient.SSECustomerAlgorithm = c.SSECustomerAlgorithm\n\t\tif client.SSECustomerAlgorithm == \"\" {\n\t\t\tclient.SSECustomerAlgorithm = \"AES256\"\n\t\t}\n\n\t\t// Read key from file if path is specified, otherwise use direct value.\n\t\tif c.SSECustomerKeyPath != \"\" {\n\t\t\tkeyPath := c.SSECustomerKeyPath\n\t\t\t// Expand ~ to home directory\n\t\t\tif strings.HasPrefix(keyPath, \"~\") {\n\t\t\t\thome, err := os.UserHomeDir()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"cannot expand home directory for sse-customer-key-path: %w\", err)\n\t\t\t\t}\n\t\t\t\tkeyPath = home + keyPath[1:]\n\t\t\t}\n\t\t\tkeyData, err := os.ReadFile(keyPath)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot read sse-customer-key-path %q: %w\", c.SSECustomerKeyPath, err)\n\t\t\t}\n\t\t\tclient.SSECustomerKey = strings.TrimSpace(string(keyData))\n\t\t} else {\n\t\t\tclient.SSECustomerKey = c.SSECustomerKey\n\t\t}\n\t}\n\n\t// Apply SSE-KMS configuration if specified.\n\tif c.SSEKMSKeyID != \"\" {\n\t\tclient.SSEKMSKeyID = c.SSEKMSKeyID\n\t}\n\n\treturn client, nil\n}\n\n// newGSReplicaClientFromConfig returns a new instance of gs.ReplicaClient built from config.\nfunc newGSReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *gs.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for gs replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Bucket != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 bucket for gs replica\")\n\t}\n\n\tbucket, configPath := c.Bucket, c.Path\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\t_, uhost, upath, err := litestream.ParseReplicaURL(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Only apply URL parts to field that have not been overridden.\n\t\tif configPath == \"\" {\n\t\t\tconfigPath = upath\n\t\t}\n\t\tif bucket == \"\" {\n\t\t\tbucket = uhost\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for gs replica\")\n\t}\n\n\t// Build replica.\n\tclient := gs.NewReplicaClient()\n\tclient.Bucket = bucket\n\tclient.Path = configPath\n\treturn client, nil\n}\n\n// newABSReplicaClientFromConfig returns a new instance of abs.ReplicaClient built from config.\nfunc newABSReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *abs.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for abs replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Bucket != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 bucket for abs replica\")\n\t}\n\n\t// Build replica.\n\tclient := abs.NewReplicaClient()\n\tclient.AccountName = c.AccountName\n\tclient.AccountKey = c.AccountKey\n\tclient.SASToken = c.SASToken\n\tclient.Bucket = c.Bucket\n\tclient.Path = c.Path\n\tclient.Endpoint = c.Endpoint\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\tu, err := url.Parse(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif client.AccountName == \"\" \u0026\u0026 u.User != nil {\n\t\t\tclient.AccountName = u.User.Username()\n\t\t}\n\t\tif client.Bucket == \"\" {\n\t\t\tclient.Bucket = u.Host\n\t\t}\n\t\tif client.Path == \"\" {\n\t\t\tclient.Path = strings.TrimPrefix(path.Clean(u.Path), \"/\")\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif client.Bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for abs replica\")\n\t}\n\n\treturn client, nil\n}\n\n// newSFTPReplicaClientFromConfig returns a new instance of sftp.ReplicaClient built from config.\nfunc newSFTPReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *sftp.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for sftp replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Host != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 host for sftp replica\")\n\t}\n\n\thost, user, password, path := c.Host, c.User, c.Password, c.Path\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\tu, err := url.Parse(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Only apply URL parts to field that have not been overridden.\n\t\tif host == \"\" {\n\t\t\thost = u.Host\n\t\t}\n\t\tif user == \"\" \u0026\u0026 u.User != nil {\n\t\t\tuser = u.User.Username()\n\t\t}\n\t\tif password == \"\" \u0026\u0026 u.User != nil {\n\t\t\tpassword, _ = u.User.Password()\n\t\t}\n\t\tif path == \"\" {\n\t\t\tpath = u.Path\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif host == \"\" {\n\t\treturn nil, fmt.Errorf(\"host required for sftp replica\")\n\t} else if user == \"\" {\n\t\treturn nil, fmt.Errorf(\"user required for sftp replica\")\n\t}\n\n\t// Build replica.\n\tclient := sftp.NewReplicaClient()\n\tclient.Host = host\n\tclient.User = user\n\tclient.Password = password\n\tclient.Path = path\n\tclient.KeyPath = c.KeyPath\n\tclient.HostKey = c.HostKey\n\n\t// Set concurrent writes if specified, otherwise use default (true)\n\tif c.ConcurrentWrites != nil {\n\t\tclient.ConcurrentWrites = *c.ConcurrentWrites\n\t}\n\n\treturn client, nil\n}\n\n// newWebDAVReplicaClientFromConfig returns a new instance of webdav.ReplicaClient built from config.\nfunc newWebDAVReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *webdav.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for webdav replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.WebDAVURL != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 webdav-url for webdav replica\")\n\t}\n\n\twebdavURL, username, password, path := c.WebDAVURL, c.WebDAVUsername, c.WebDAVPassword, c.Path\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\tu, err := url.Parse(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Build WebDAV URL from scheme and host\n\t\tscheme := \"http\"\n\t\tif u.Scheme == \"webdavs\" {\n\t\t\tscheme = \"https\"\n\t\t}\n\t\tif webdavURL == \"\" \u0026\u0026 u.Host != \"\" {\n\t\t\twebdavURL = fmt.Sprintf(\"%s://%s\", scheme, u.Host)\n\t\t}\n\n\t\t// Extract credentials from URL\n\t\tif username == \"\" \u0026\u0026 u.User != nil {\n\t\t\tusername = u.User.Username()\n\t\t}\n\t\tif password == \"\" \u0026\u0026 u.User != nil {\n\t\t\tpassword, _ = u.User.Password()\n\t\t}\n\t\tif path == \"\" {\n\t\t\tpath = u.Path\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif webdavURL == \"\" {\n\t\treturn nil, fmt.Errorf(\"webdav-url required for webdav replica\")\n\t}\n\n\t// Build replica.\n\tclient := webdav.NewReplicaClient()\n\tclient.URL = webdavURL\n\tclient.Username = username\n\tclient.Password = password\n\tclient.Path = path\n\n\treturn client, nil\n}\n\n// newNATSReplicaClientFromConfig returns a new instance of nats.ReplicaClient built from config.\nfunc newNATSReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *nats.ReplicaClient, err error) {\n\t// Parse URL if provided to extract bucket name and server URL\n\tvar url, bucket string\n\tif c.URL != \"\" {\n\t\tscheme, host, bucketPath, err := litestream.ParseReplicaURL(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid NATS URL: %w\", err)\n\t\t}\n\t\tif scheme != \"nats\" {\n\t\t\treturn nil, fmt.Errorf(\"invalid scheme for NATS replica: %s\", scheme)\n\t\t}\n\n\t\t// Reconstruct URL without bucket path\n\t\tif host != \"\" {\n\t\t\turl = fmt.Sprintf(\"nats://%s\", host)\n\t\t}\n\n\t\t// Extract bucket name from path\n\t\tif bucketPath != \"\" {\n\t\t\tbucket = strings.Trim(bucketPath, \"/\")\n\t\t}\n\t}\n\n\t// Use bucket from config if not extracted from URL\n\tif bucket == \"\" {\n\t\tbucket = c.Bucket\n\t}\n\n\t// Ensure required settings are set\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for NATS replica\")\n\t}\n\n\t// Validate TLS configuration\n\t// Both client cert and key must be specified together\n\tif (c.ClientCert != \"\") != (c.ClientKey != \"\") {\n\t\treturn nil, fmt.Errorf(\"client-cert and client-key must both be specified for mutual TLS authentication\")\n\t}\n\n\t// Build replica client\n\tclient := nats.NewReplicaClient()\n\tclient.URL = url\n\tclient.BucketName = bucket\n\n\t// Set authentication options\n\tclient.JWT = c.JWT\n\tclient.Seed = c.Seed\n\tclient.Creds = c.Creds\n\tclient.NKey = c.NKey\n\tclient.Username = c.Username\n\tclient.Password = c.Password\n\tclient.Token = c.Token\n\n\t// Set TLS options\n\tif c.TLS != nil {\n\t\tclient.TLS = *c.TLS\n\t}\n\tclient.RootCAs = c.RootCAs\n\tclient.ClientCert = c.ClientCert\n\tclient.ClientKey = c.ClientKey\n\n\t// Set connection options with defaults\n\tif c.MaxReconnects != nil {\n\t\tclient.MaxReconnects = *c.MaxReconnects\n\t}\n\tif c.ReconnectWait != nil {\n\t\tclient.ReconnectWait = *c.ReconnectWait\n\t}\n\tif c.Timeout != nil {\n\t\tclient.Timeout = *c.Timeout\n\t}\n\n\treturn client, nil\n}\n\n// newOSSReplicaClientFromConfig returns a new instance of oss.ReplicaClient built from config.\nfunc newOSSReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *oss.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for oss replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Bucket != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 bucket for oss replica\")\n\t}\n\n\tbucket, configPath := c.Bucket, c.Path\n\tregion, endpoint := c.Region, c.Endpoint\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\t_, host, upath, err := litestream.ParseReplicaURL(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar (\n\t\t\tubucket string\n\t\t\turegion string\n\t\t)\n\n\t\tubucket, uregion, _ = oss.ParseHost(host)\n\n\t\t// Only apply URL parts to fields that have not been overridden.\n\t\tif configPath == \"\" {\n\t\t\tconfigPath = upath\n\t\t}\n\t\tif bucket == \"\" {\n\t\t\tbucket = ubucket\n\t\t}\n\t\tif region == \"\" {\n\t\t\tregion = uregion\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for oss replica\")\n\t}\n\n\t// Build replica client.\n\tclient := oss.NewReplicaClient()\n\tclient.AccessKeyID = c.AccessKeyID\n\tclient.AccessKeySecret = c.SecretAccessKey\n\tclient.Bucket = bucket\n\tclient.Path = configPath\n\tclient.Region = region\n\tclient.Endpoint = endpoint\n\n\t// Apply upload configuration if specified.\n\tif c.PartSize != nil {\n\t\tclient.PartSize = int64(*c.PartSize)\n\t}\n\tif c.Concurrency != nil {\n\t\tclient.Concurrency = *c.Concurrency\n\t}\n\n\treturn client, nil\n}\n\n// applyLitestreamEnv copies \"LITESTREAM\" prefixed environment variables to\n// their AWS counterparts as the \"AWS\" prefix can be confusing when using a\n// non-AWS S3-compatible service.\nfunc applyLitestreamEnv() {\n\tif v, ok := os.LookupEnv(\"LITESTREAM_ACCESS_KEY_ID\"); ok {\n\t\tif _, ok := os.LookupEnv(\"AWS_ACCESS_KEY_ID\"); !ok {\n\t\t\tos.Setenv(\"AWS_ACCESS_KEY_ID\", v)\n\t\t}\n\t}\n\tif v, ok := os.LookupEnv(\"LITESTREAM_SECRET_ACCESS_KEY\"); ok {\n\t\tif _, ok := os.LookupEnv(\"AWS_SECRET_ACCESS_KEY\"); !ok {\n\t\t\tos.Setenv(\"AWS_SECRET_ACCESS_KEY\", v)\n\t\t}\n\t}\n}\n\ntype boolSetting struct {\n\tvalue bool\n\tset bool\n}\n\nfunc newBoolSetting(defaultValue bool) boolSetting {\n\treturn boolSetting{value: defaultValue}\n}\n\nfunc (s *boolSetting) Set(value bool) {\n\ts.value = value\n\ts.set = true\n}\n\nfunc (s *boolSetting) ApplyDefault(value bool) {\n\tif !s.set {\n\t\ts.value = value\n\t}\n}\n\n// ReplicaType returns the type based on the type field or extracted from the URL.\nfunc (c *ReplicaConfig) ReplicaType() string {\n\tif replicaType := litestream.ReplicaTypeFromURL(c.URL); replicaType != \"\" {\n\t\treturn replicaType\n\t} else if c.Type != \"\" {\n\t\treturn c.Type\n\t}\n\treturn \"file\"\n}\n\n// DefaultConfigPath returns the default config path.\nfunc DefaultConfigPath() string {\n\tif v := os.Getenv(\"LITESTREAM_CONFIG\"); v != \"\" {\n\t\treturn v\n\t}\n\treturn defaultConfigPath\n}\n\nfunc registerConfigFlag(fs *flag.FlagSet) (configPath *string, noExpandEnv *bool) {\n\treturn fs.String(\"config\", \"\", \"config path\"),\n\t\tfs.Bool(\"no-expand-env\", false, \"do not expand env vars in config\")\n}\n\n// isValidHeartbeatURL checks if the URL is a valid HTTP or HTTPS URL.\nfunc isValidHeartbeatURL(u string) bool {\n\treturn strings.HasPrefix(u, \"http://\") || strings.HasPrefix(u, \"https://\")\n}\n\n// expand returns an absolute path for s.\n// It also strips SQLite connection string prefixes (sqlite://, sqlite3://).\nfunc expand(s string) (string, error) {\n\t// Strip SQLite connection string prefixes if present.\n\ts = StripSQLitePrefix(s)\n\n\t// Just expand to absolute path if there is no home directory prefix.\n\tprefix := \"~\" + string(os.PathSeparator)\n\tif s != \"~\" \u0026\u0026 !strings.HasPrefix(s, prefix) {\n\t\treturn filepath.Abs(s)\n\t}\n\n\t// Look up home directory.\n\tu, err := user.Current()\n\tif err != nil {\n\t\treturn \"\", err\n\t} else if u.HomeDir == \"\" {\n\t\treturn \"\", fmt.Errorf(\"cannot expand path %s, no home directory available\", s)\n\t}\n\n\t// Return path with tilde replaced by the home directory.\n\tif s == \"~\" {\n\t\treturn u.HomeDir, nil\n\t}\n\treturn filepath.Join(u.HomeDir, strings.TrimPrefix(s, prefix)), nil\n}\n\n// StripSQLitePrefix removes SQLite connection string prefixes (sqlite://, sqlite3://)\n// from the given path. This allows users to use standard connection string formats\n// across their tooling while Litestream extracts just the file path.\nfunc StripSQLitePrefix(s string) string {\n\tif len(s) \u003c 9 || s[0] != 's' {\n\t\treturn s\n\t}\n\tfor _, prefix := range []string{\"sqlite3://\", \"sqlite://\"} {\n\t\tif strings.HasPrefix(s, prefix) {\n\t\t\treturn strings.TrimPrefix(s, prefix)\n\t\t}\n\t}\n\treturn s\n}\n\n// txidVar allows the flag package to parse index flags as hex-formatted TXIDs\ntype txidVar ltx.TXID\n\n// Ensure type implements interface.\nvar _ flag.Value = (*txidVar)(nil)\n\n// String returns an 8-character hexadecimal value.\nfunc (v *txidVar) String() string {\n\treturn ltx.TXID(*v).String()\n}\n\n// Set parses s into an integer from a hexadecimal value.\nfunc (v *txidVar) Set(s string) error {\n\ttxID, err := ltx.ParseTXID(s)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid txid format\")\n\t}\n\t*v = txidVar(txID)\n\treturn nil\n}\n\n// levelAll is a sentinel value indicating all compaction levels should be shown.\nconst levelAll = -1\n\n// levelVar allows the flag package to parse compaction level flags.\n// Accepts integers 0-9 or \"all\" for all levels.\ntype levelVar int\n\nvar _ flag.Value = (*levelVar)(nil)\n\nfunc (v *levelVar) String() string {\n\tif *v == levelAll {\n\t\treturn \"all\"\n\t}\n\treturn strconv.Itoa(int(*v))\n}\n\nfunc (v *levelVar) Set(s string) error {\n\tif s == \"all\" {\n\t\t*v = levelAll\n\t\treturn nil\n\t}\n\tn, err := strconv.Atoi(s)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid level: must be 0-%d or \\\"all\\\"\", litestream.SnapshotLevel)\n\t}\n\tif n \u003c 0 || n \u003e litestream.SnapshotLevel {\n\t\treturn fmt.Errorf(\"level must be between 0 and %d\", litestream.SnapshotLevel)\n\t}\n\t*v = levelVar(n)\n\treturn nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[34,43]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[44,51]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[52,58]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[59,64]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[65,76]}},{"name":"math","path":"math","span":{"start":[10,1],"end":[10,8],"bytes":[77,84]}},{"name":"url","path":"net/url","span":{"start":[11,1],"end":[11,11],"bytes":[85,95]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[96,101]}},{"name":"user","path":"os/user","span":{"start":[13,1],"end":[13,11],"bytes":[102,112]}},{"name":"path","path":"path","span":{"start":[14,1],"end":[14,8],"bytes":[113,120]}},{"name":"filepath","path":"path/filepath","span":{"start":[15,1],"end":[15,17],"bytes":[121,137]}},{"name":"debug","path":"runtime/debug","span":{"start":[16,1],"end":[16,17],"bytes":[138,154]}},{"name":"strconv","path":"strconv","span":{"start":[17,1],"end":[17,11],"bytes":[155,165]}},{"name":"strings","path":"strings","span":{"start":[18,1],"end":[18,11],"bytes":[166,176]}},{"name":"time","path":"time","span":{"start":[19,1],"end":[19,8],"bytes":[177,184]}},{"name":"go-humanize","path":"github.com/dustin/go-humanize","span":{"start":[21,1],"end":[21,33],"bytes":[186,218]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[22,1],"end":[22,27],"bytes":[219,245]}},{"name":"fallback","path":"golang.org/x/crypto/x509roots/fallback","alias":"_","span":{"start":[23,1],"end":[23,44],"bytes":[246,289]}},{"name":"yaml.v2","path":"gopkg.in/yaml.v2","span":{"start":[24,1],"end":[24,20],"bytes":[290,309]}},{"name":"sqlite","path":"modernc.org/sqlite","alias":"_","span":{"start":[25,1],"end":[25,24],"bytes":[310,333]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[27,1],"end":[27,37],"bytes":[335,371]}},{"name":"abs","path":"github.com/benbjohnson/litestream/abs","span":{"start":[28,1],"end":[28,41],"bytes":[372,412]}},{"name":"file","path":"github.com/benbjohnson/litestream/file","span":{"start":[29,1],"end":[29,42],"bytes":[413,454]}},{"name":"gs","path":"github.com/benbjohnson/litestream/gs","span":{"start":[30,1],"end":[30,40],"bytes":[455,494]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[31,1],"end":[31,46],"bytes":[495,540]}},{"name":"nats","path":"github.com/benbjohnson/litestream/nats","span":{"start":[32,1],"end":[32,42],"bytes":[541,582]}},{"name":"oss","path":"github.com/benbjohnson/litestream/oss","span":{"start":[33,1],"end":[33,41],"bytes":[583,623]}},{"name":"s3","path":"github.com/benbjohnson/litestream/s3","span":{"start":[34,1],"end":[34,40],"bytes":[624,663]}},{"name":"sftp","path":"github.com/benbjohnson/litestream/sftp","span":{"start":[35,1],"end":[35,42],"bytes":[664,705]}},{"name":"webdav","path":"github.com/benbjohnson/litestream/webdav","span":{"start":[36,1],"end":[36,44],"bytes":[706,749]}}],"types":{"ByteSize":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize","kind":"struct","span":{"start":[1071,1],"end":[1071,20],"bytes":[32518,32537]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize/github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML","kind":"method","span":{"start":[1074,1],"end":[1086,2],"bytes":[32598,32842]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML","parameters":[{"name":"unmarshal","type":"func(interface{}) error","span":{"start":[1074,1],"end":[1074,76],"bytes":[32598,32673]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1076:12":{"kind":"call","span":{"start":[1076,12],"end":[1076,25],"bytes":[32699,32712]},"callee":null},"1080:15":{"kind":"call","span":{"start":[1080,15],"end":[1080,31],"bytes":[32758,32774]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize"},"1084:7":{"kind":"call","span":{"start":[1084,7],"end":[1084,21],"bytes":[32814,32828]},"callee":null}}}}},"CompactionLevelConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.CompactionLevelConfig","kind":"struct","span":{"start":[717,1],"end":[719,2],"bytes":[21344,21423]},"callables":{},"fields":{"Interval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.CompactionLevelConfig/Interval","kind":"field","type":"time.Duration","span":{"start":[718,1],"end":[718,42],"bytes":[21380,21421]}}}},"Config":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config","kind":"struct","span":{"start":[270,1],"end":[325,2],"bytes":[7596,9394]},"base_types":["github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings"],"callables":{"github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels","kind":"method","span":{"start":[571,1],"end":[584,2],"bytes":[17438,17721]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels","parameters":[],"return_type":"github.com/benbjohnson/litestream.CompactionLevels","metrics":{"cyclomatic":2},"body":{"577:12":{"kind":"call","span":{"start":[577,12],"end":[580,5],"bytes":[17605,17700]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig","kind":"method","span":{"start":[587,1],"end":[594,2],"bytes":[17775,17940]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig","parameters":[{"name":"configPath","type":"string","span":{"start":[587,1],"end":[587,57],"bytes":[17775,17831]}}],"return_type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","metrics":{"cyclomatic":3},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.Config.Validate":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","kind":"method","span":{"start":[419,1],"end":[568,2],"bytes":[12463,17363]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":26},"body":{"465:30":{"kind":"call","span":{"start":[465,30],"end":[465,65],"bytes":[13863,13898]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL"},"485:12":{"kind":"call","span":{"start":[485,12],"end":[485,49],"bytes":[14450,14487]},"callee":null},"492:15":{"kind":"call","span":{"start":[492,15],"end":[492,35],"bytes":[14573,14593]},"callee":null},"496:11":{"kind":"call","span":{"start":[496,11],"end":[496,89],"bytes":[14776,14854]},"callee":null},"499:11":{"kind":"call","span":{"start":[499,11],"end":[499,88],"bytes":[14906,14983]},"callee":null},"506:11":{"kind":"call","span":{"start":[506,11],"end":[506,34],"bytes":[15195,15218]},"callee":null},"508:12":{"kind":"call","span":{"start":[508,12],"end":[508,164],"bytes":[15270,15422]},"callee":null},"515:11":{"kind":"call","span":{"start":[515,11],"end":[515,91],"bytes":[15558,15638]},"callee":null},"518:11":{"kind":"call","span":{"start":[518,11],"end":[518,97],"bytes":[15685,15771]},"callee":null},"521:11":{"kind":"call","span":{"start":[521,11],"end":[521,97],"bytes":[15827,15913]},"callee":null},"524:11":{"kind":"call","span":{"start":[524,11],"end":[524,99],"bytes":[15975,16063]},"callee":null},"536:12":{"kind":"call","span":{"start":[536,12],"end":[536,66],"bytes":[16366,16420]},"callee":null},"543:12":{"kind":"call","span":{"start":[543,12],"end":[543,67],"bytes":[16617,16672]},"callee":null},"552:12":{"kind":"call","span":{"start":[552,12],"end":[552,70],"bytes":[16933,16991]},"callee":null},"560:13":{"kind":"call","span":{"start":[560,13],"end":[560,79],"bytes":[17228,17294]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig","kind":"method","span":{"start":[356,1],"end":[390,2],"bytes":[10206,11283]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig","parameters":[{"name":"globalIntervalSet","type":"bool","span":{"start":[356,1],"end":[356,91],"bytes":[10206,10296]}},{"name":"globalRetentionSet","type":"bool","span":{"start":[356,1],"end":[356,91],"bytes":[10206,10296]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"369:12":{"kind":"call","span":{"start":[369,12],"end":[369,139],"bytes":[10597,10724]},"callee":null},"376:12":{"kind":"call","span":{"start":[376,12],"end":[376,143],"bytes":[10902,11033]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings","kind":"method","span":{"start":[344,1],"end":[354,2],"bytes":[9909,10204]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings","parameters":[],"metrics":{"cyclomatic":4},"body":{"348:4":{"kind":"call","span":{"start":[348,4],"end":[348,47],"bytes":[10074,10117]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults"},"351:4":{"kind":"call","span":{"start":[351,4],"end":[351,38],"bytes":[10161,10195]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults"}}}},"fields":{"Addr":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Addr","kind":"field","type":"string","span":{"start":[275,1],"end":[275,27],"bytes":[7758,7784]}},"ConfigPath":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/ConfigPath","kind":"field","type":"string","span":{"start":[324,1],"end":[324,30],"bytes":[9363,9392]}},"DBs":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/DBs","kind":"field","type":"[]*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[306,1],"end":[306,30],"bytes":[8814,8843]}},"Exec":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Exec","kind":"field","type":"string","span":{"start":[310,1],"end":[310,27],"bytes":[8943,8969]}},"HeartbeatInterval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/HeartbeatInterval","kind":"field","type":"*time.Duration","span":{"start":[303,1],"end":[303,62],"bytes":[8718,8779]}},"HeartbeatURL":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/HeartbeatURL","kind":"field","type":"string","span":{"start":[302,1],"end":[302,57],"bytes":[8661,8717]}},"L0Retention":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/L0Retention","kind":"field","type":"*time.Duration","span":{"start":[291,1],"end":[291,63],"bytes":[8214,8276]}},"L0RetentionCheckInterval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/L0RetentionCheckInterval","kind":"field","type":"*time.Duration","span":{"start":[292,1],"end":[292,78],"bytes":[8277,8354]}},"Levels":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Levels","kind":"field","type":"[]*github.com/benbjohnson/litestream/cmd/litestream.CompactionLevelConfig","span":{"start":[282,1],"end":[282,49],"bytes":[7988,8036]}},"Logging":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Logging","kind":"field","type":"github.com/benbjohnson/litestream/internal.LoggingConfig","span":{"start":[313,1],"end":[313,49],"bytes":[8983,9031]}},"MCPAddr":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/MCPAddr","kind":"field","type":"string","span":{"start":[316,1],"end":[316,34],"bytes":[9056,9089]}},"Retention":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Retention","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.RetentionConfig","span":{"start":[299,1],"end":[299,46],"bytes":[8573,8618]}},"ShutdownSyncInterval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/ShutdownSyncInterval","kind":"field","type":"*time.Duration","span":{"start":[320,1],"end":[320,69],"bytes":[9192,9260]}},"ShutdownSyncTimeout":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/ShutdownSyncTimeout","kind":"field","type":"*time.Duration","span":{"start":[319,1],"end":[319,68],"bytes":[9124,9191]}},"Snapshot":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Snapshot","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig","span":{"start":[285,1],"end":[285,43],"bytes":[8065,8107]}},"Socket":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Socket","kind":"field","type":"github.com/benbjohnson/litestream.SocketConfig","span":{"start":[278,1],"end":[278,48],"bytes":[7833,7880]}},"Validation":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Validation","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.ValidationConfig","span":{"start":[288,1],"end":[288,49],"bytes":[8138,8186]}},"VerifyCompaction":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/VerifyCompaction","kind":"field","type":"bool","span":{"start":[296,1],"end":[296,50],"bytes":[8494,8543]}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","span":{"start":[272,1],"end":[272,34],"bytes":[7685,7718]}}}},"ConfigValidationError":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError","kind":"struct","span":{"start":[67,1],"end":[71,2],"bytes":[2273,2356]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error","kind":"method","span":{"start":[73,1],"end":[78,2],"bytes":[2358,2543]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"75:10":{"kind":"call","span":{"start":[75,10],"end":[75,65],"bytes":[2437,2492]},"callee":null},"77:9":{"kind":"call","span":{"start":[77,9],"end":[77,46],"bytes":[2504,2541]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Unwrap":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Unwrap","kind":"method","span":{"start":[80,1],"end":[82,2],"bytes":[2545,2609]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Unwrap","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"Err":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/Err","kind":"field","type":"error","span":{"start":[68,1],"end":[68,13],"bytes":[2309,2321]}},"Field":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/Field","kind":"field","type":"string","span":{"start":[69,1],"end":[69,14],"bytes":[2322,2335]}},"Value":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/Value","kind":"field","type":"interface{}","span":{"start":[70,1],"end":[70,19],"bytes":[2336,2354]}}}},"DBConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig","kind":"struct","span":{"start":[722,1],"end":[742,2],"bytes":[21515,22670]},"callables":{},"fields":{"BusyTimeout":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/BusyTimeout","kind":"field","type":"*time.Duration","span":{"start":[733,1],"end":[733,57],"bytes":[22253,22309]}},"CheckpointInterval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/CheckpointInterval","kind":"field","type":"*time.Duration","span":{"start":[732,1],"end":[732,64],"bytes":[22189,22252]}},"Dir":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Dir","kind":"field","type":"string","span":{"start":[724,1],"end":[724,89],"bytes":[21587,21675]}},"MaxSyncWALBytes":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MaxSyncWALBytes","kind":"field","type":"*int64","span":{"start":[736,1],"end":[736,63],"bytes":[22440,22502]}},"MetaDir":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MetaDir","kind":"field","type":"*string","span":{"start":[730,1],"end":[730,53],"bytes":[22075,22127]}},"MetaPath":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MetaPath","kind":"field","type":"*string","span":{"start":[729,1],"end":[729,54],"bytes":[22021,22074]}},"MinCheckpointPageN":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MinCheckpointPageN","kind":"field","type":"*int","span":{"start":[734,1],"end":[734,70],"bytes":[22310,22379]}},"MonitorInterval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MonitorInterval","kind":"field","type":"*time.Duration","span":{"start":[731,1],"end":[731,61],"bytes":[22128,22188]}},"Path":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Path","kind":"field","type":"string","span":{"start":[723,1],"end":[723,49],"bytes":[21538,21586]}},"Pattern":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Pattern","kind":"field","type":"string","span":{"start":[725,1],"end":[725,106],"bytes":[21676,21781]}},"Recursive":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Recursive","kind":"field","type":"bool","span":{"start":[726,1],"end":[726,89],"bytes":[21782,21870]}},"Replica":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Replica","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[740,1],"end":[740,44],"bytes":[22566,22609]}},"Replicas":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Replicas","kind":"field","type":"[]*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[741,1],"end":[741,59],"bytes":[22610,22668]}},"RestoreIfDBNotExists":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/RestoreIfDBNotExists","kind":"field","type":"bool","span":{"start":[738,1],"end":[738,61],"bytes":[22504,22564]}},"Snapshot":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Snapshot","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig","span":{"start":[728,1],"end":[728,53],"bytes":[21968,22020]}},"TruncatePageN":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/TruncatePageN","kind":"field","type":"*int","span":{"start":[735,1],"end":[735,60],"bytes":[22380,22439]}},"Watch":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Watch","kind":"field","type":"bool","span":{"start":[727,1],"end":[727,97],"bytes":[21871,21967]}}}},"Main":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main","kind":"struct","span":{"start":[117,1],"end":[117,19],"bytes":[3367,3385]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.Main.Run":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","kind":"method","span":{"start":[125,1],"end":[239,2],"bytes":[3501,6631]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Main.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[125,1],"end":[125,69],"bytes":[3501,3569]}},{"name":"args","type":"[]string","span":{"start":[125,1],"end":[125,69],"bytes":[3501,3569]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":33},"body":{"127:23":{"kind":"call","span":{"start":[127,23],"end":[127,41],"bytes":[3657,3675]},"callee":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.isWindowsService"},"130:10":{"kind":"call","span":{"start":[130,10],"end":[130,32],"bytes":[3735,3757]},"callee":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.runWindowsService"},"134:2":{"kind":"call","span":{"start":[134,2],"end":[134,22],"bytes":[3809,3829]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv"},"138:5":{"kind":"call","span":{"start":[138,5],"end":[138,14],"bytes":[3877,3886]},"callee":null},"144:10":{"kind":"call","span":{"start":[144,10],"end":[144,46],"bytes":[3971,4007]},"callee":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run"},"146:8":{"kind":"call","span":{"start":[146,8],"end":[146,29],"bytes":[4034,4055]},"callee":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand"},"147:13":{"kind":"call","span":{"start":[147,13],"end":[147,36],"bytes":[4068,4091]},"callee":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags"},"152:15":{"kind":"call","span":{"start":[152,15],"end":[152,27],"bytes":[4166,4178]},"callee":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan"},"157:11":{"kind":"call","span":{"start":[157,11],"end":[157,30],"bytes":[4366,4385]},"callee":null},"158:3":{"kind":"call","span":{"start":[158,3],"end":[158,18],"bytes":[4388,4403]},"callee":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone"},"160:13":{"kind":"call","span":{"start":[160,13],"end":[160,23],"bytes":[4417,4427]},"callee":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run"},"168:5":{"kind":"call","span":{"start":[168,5],"end":[168,61],"bytes":[4560,4616]},"callee":null},"170:5":{"kind":"call","span":{"start":[170,5],"end":[170,64],"bytes":[4633,4692]},"callee":null},"173:4":{"kind":"call","span":{"start":[173,4],"end":[173,73],"bytes":[4727,4796]},"callee":null},"176:5":{"kind":"call","span":{"start":[176,5],"end":[176,48],"bytes":[4823,4866]},"callee":null},"177:15":{"kind":"call","span":{"start":[177,15],"end":[177,40],"bytes":[4881,4906]},"callee":null},"178:13":{"kind":"call","span":{"start":[178,13],"end":[178,62],"bytes":[4933,4982]},"callee":null},"181:5":{"kind":"call","span":{"start":[181,5],"end":[181,51],"bytes":[4994,5040]},"callee":null},"182:42":{"kind":"call","span":{"start":[182,42],"end":[182,83],"bytes":[5082,5123]},"callee":null},"182:60":{"kind":"call","span":{"start":[182,60],"end":[182,71],"bytes":[5100,5111]},"callee":null},"183:13":{"kind":"call","span":{"start":[183,13],"end":[183,64],"bytes":[5138,5189]},"callee":null},"188:7":{"kind":"call","span":{"start":[188,7],"end":[191,7],"bytes":[5282,5328]},"callee":null,"is_goroutine":true},"195:11":{"kind":"call","span":{"start":[195,11],"end":[195,23],"bytes":[5367,5379]},"callee":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close"},"198:3":{"kind":"call","span":{"start":[198,3],"end":[198,36],"bytes":[5423,5456]},"callee":null},"202:10":{"kind":"call","span":{"start":[202,10],"end":[202,42],"bytes":[5495,5527]},"callee":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run"},"204:10":{"kind":"call","span":{"start":[204,10],"end":[204,41],"bytes":[5551,5582]},"callee":"can://go/litestream/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run"},"206:10":{"kind":"call","span":{"start":[206,10],"end":[206,45],"bytes":[5610,5645]},"callee":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run"},"208:10":{"kind":"call","span":{"start":[208,10],"end":[208,47],"bytes":[5675,5712]},"callee":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run"},"210:10":{"kind":"call","span":{"start":[210,10],"end":[210,42],"bytes":[5737,5769]},"callee":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run"},"212:10":{"kind":"call","span":{"start":[212,10],"end":[212,44],"bytes":[5796,5830]},"callee":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run"},"214:10":{"kind":"call","span":{"start":[214,10],"end":[214,43],"bytes":[5856,5889]},"callee":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run"},"216:10":{"kind":"call","span":{"start":[216,10],"end":[216,41],"bytes":[5913,5944]},"callee":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run"},"218:10":{"kind":"call","span":{"start":[218,10],"end":[218,41],"bytes":[5968,5999]},"callee":"can://go/litestream/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run"},"220:10":{"kind":"call","span":{"start":[220,10],"end":[220,41],"bytes":[6023,6054]},"callee":"can://go/litestream/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run"},"222:10":{"kind":"call","span":{"start":[222,10],"end":[222,44],"bytes":[6081,6115]},"callee":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run"},"224:10":{"kind":"call","span":{"start":[224,10],"end":[224,40],"bytes":[6138,6168]},"callee":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run"},"227:3":{"kind":"call","span":{"start":[227,3],"end":[227,92],"bytes":[6233,6322]},"callee":null},"228:10":{"kind":"call","span":{"start":[228,10],"end":[228,40],"bytes":[6332,6362]},"callee":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run"},"231:4":{"kind":"call","span":{"start":[231,4],"end":[231,13],"bytes":[6449,6458]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage"},"233:26":{"kind":"call","span":{"start":[233,26],"end":[233,53],"bytes":[6498,6525]},"callee":null},"234:4":{"kind":"call","span":{"start":[234,4],"end":[234,13],"bytes":[6531,6540]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage"},"237:10":{"kind":"call","span":{"start":[237,10],"end":[237,59],"bytes":[6577,6626]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run/github.com/benbjohnson/litestream/cmd/litestream.Main.Run.closure_1","kind":"function","span":{"start":[188,1],"end":[191,7],"bytes":[5276,5328]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Main.Run.closure_1","parameters":[],"body":{"190:5":{"kind":"call","span":{"start":[190,5],"end":[190,16],"bytes":[5310,5321]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.Main.Usage":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage","kind":"method","span":{"start":[242,1],"end":[267,2],"bytes":[6676,7525]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Main.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"243:2":{"kind":"call","span":{"start":[243,2],"end":[266,7],"bytes":[6702,7523]},"callee":null}}}}},"ReplicaConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","kind":"struct","span":{"start":[1340,1],"end":[1347,2],"bytes":[39984,40185]},"base_types":["github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings"],"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","kind":"method","span":{"start":[2088,1],"end":[2095,2],"bytes":[61675,61881]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","parameters":[],"return_type":"string","metrics":{"cyclomatic":3},"body":{"2089:20":{"kind":"call","span":{"start":[2089,20],"end":[2089,56],"bytes":[61741,61777]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL"}}}},"fields":{"Name":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/Name","kind":"field","type":"string","span":{"start":[1344,1],"end":[1344,41],"bytes":[40090,40130]}},"Path":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/Path","kind":"field","type":"string","span":{"start":[1345,1],"end":[1345,27],"bytes":[40131,40157]}},"Type":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/Type","kind":"field","type":"string","span":{"start":[1343,1],"end":[1343,43],"bytes":[40047,40089]}},"URL":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/URL","kind":"field","type":"string","span":{"start":[1346,1],"end":[1346,26],"bytes":[40158,40183]}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","span":{"start":[1341,1],"end":[1341,34],"bytes":[40012,40045]}}}},"ReplicaSettings":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","kind":"struct","span":{"start":[1113,1],"end":[1187,2],"bytes":[33718,36725]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults","kind":"method","span":{"start":[1191,1],"end":[1337,2],"bytes":[36868,39900]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults","parameters":[{"name":"src","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","span":{"start":[1191,1],"end":[1191,63],"bytes":[36868,36930]}}],"metrics":{"cyclomatic":44},"body":{"1311:5":{"kind":"call","span":{"start":[1311,5],"end":[1311,20],"bytes":[39342,39357]},"callee":null},"1331:5":{"kind":"call","span":{"start":[1331,5],"end":[1331,27],"bytes":[39747,39769]},"callee":null},"1334:5":{"kind":"call","span":{"start":[1334,5],"end":[1334,27],"bytes":[39825,39847]},"callee":null}}}},"fields":{"AccessKeyID":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/AccessKeyID","kind":"field","type":"string","span":{"start":[1127,1],"end":[1127,53],"bytes":[34322,34374]}},"AccountKey":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/AccountKey","kind":"field","type":"string","span":{"start":[1151,1],"end":[1151,41],"bytes":[35415,35455]}},"AccountName":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/AccountName","kind":"field","type":"string","span":{"start":[1150,1],"end":[1150,42],"bytes":[35373,35414]}},"Age":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Age","kind":"field","type":"struct{Identities []string \"yaml:\\\"identities\\\"\"; Recipients []string \"yaml:\\\"recipients\\\"\"}","span":{"start":[1183,1],"end":[1186,16],"bytes":[36610,36723]}},"AutoRecover":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/AutoRecover","kind":"field","type":"*bool","span":{"start":[1124,1],"end":[1124,41],"bytes":[34264,34304]}},"Bucket":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Bucket","kind":"field","type":"string","span":{"start":[1130,1],"end":[1130,46],"bytes":[34478,34523]}},"ClientCert":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ClientCert","kind":"field","type":"string","span":{"start":[1176,1],"end":[1176,51],"bytes":[36312,36362]}},"ClientKey":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ClientKey","kind":"field","type":"string","span":{"start":[1177,1],"end":[1177,50],"bytes":[36363,36412]}},"Concurrency":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Concurrency","kind":"field","type":"*int","span":{"start":[1139,1],"end":[1139,51],"bytes":[34952,35002]}},"ConcurrentWrites":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ConcurrentWrites","kind":"field","type":"*bool","span":{"start":[1159,1],"end":[1159,52],"bytes":[35678,35729]}},"Creds":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Creds","kind":"field","type":"string","span":{"start":[1170,1],"end":[1170,45],"bytes":[36039,36083]}},"Endpoint":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Endpoint","kind":"field","type":"string","span":{"start":[1131,1],"end":[1131,48],"bytes":[34524,34571]}},"ForcePathStyle":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ForcePathStyle","kind":"field","type":"*bool","span":{"start":[1132,1],"end":[1132,56],"bytes":[34572,34627]}},"Host":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Host","kind":"field","type":"string","span":{"start":[1155,1],"end":[1155,39],"bytes":[35514,35552]}},"HostKey":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/HostKey","kind":"field","type":"string","span":{"start":[1160,1],"end":[1160,43],"bytes":[35730,35772]}},"JWT":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/JWT","kind":"field","type":"string","span":{"start":[1168,1],"end":[1168,43],"bytes":[35952,35994]}},"KeyPath":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/KeyPath","kind":"field","type":"string","span":{"start":[1158,1],"end":[1158,43],"bytes":[35635,35677]}},"MaxReconnects":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/MaxReconnects","kind":"field","type":"*int","span":{"start":[1178,1],"end":[1178,54],"bytes":[36413,36466]}},"MaxSyncLTXFiles":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/MaxSyncLTXFiles","kind":"field","type":"*int","span":{"start":[1119,1],"end":[1119,50],"bytes":[33992,34041]}},"NKey":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/NKey","kind":"field","type":"string","span":{"start":[1171,1],"end":[1171,44],"bytes":[36084,36127]}},"PartSize":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/PartSize","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream.ByteSize","span":{"start":[1138,1],"end":[1138,49],"bytes":[34903,34951]}},"Password":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Password","kind":"field","type":"string","span":{"start":[1157,1],"end":[1157,43],"bytes":[35592,35634]}},"ReconnectWait":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ReconnectWait","kind":"field","type":"*time.Duration","span":{"start":[1179,1],"end":[1179,54],"bytes":[36467,36520]}},"Region":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Region","kind":"field","type":"string","span":{"start":[1129,1],"end":[1129,46],"bytes":[34432,34477]}},"RequireContentMD5":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/RequireContentMD5","kind":"field","type":"*bool","span":{"start":[1135,1],"end":[1135,59],"bytes":[34740,34798]}},"RootCAs":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/RootCAs","kind":"field","type":"[]string","span":{"start":[1175,1],"end":[1175,48],"bytes":[36264,36311]}},"SASToken":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SASToken","kind":"field","type":"string","span":{"start":[1152,1],"end":[1152,39],"bytes":[35456,35494]}},"SSECustomerAlgorithm":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SSECustomerAlgorithm","kind":"field","type":"string","span":{"start":[1142,1],"end":[1142,61],"bytes":[35066,35126]}},"SSECustomerKey":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SSECustomerKey","kind":"field","type":"string","span":{"start":[1143,1],"end":[1143,55],"bytes":[35127,35181]}},"SSECustomerKeyPath":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SSECustomerKeyPath","kind":"field","type":"string","span":{"start":[1144,1],"end":[1144,60],"bytes":[35182,35241]}},"SSEKMSKeyID":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SSEKMSKeyID","kind":"field","type":"string","span":{"start":[1147,1],"end":[1147,44],"bytes":[35311,35354]}},"SecretAccessKey":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SecretAccessKey","kind":"field","type":"string","span":{"start":[1128,1],"end":[1128,57],"bytes":[34375,34431]}},"Seed":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Seed","kind":"field","type":"string","span":{"start":[1169,1],"end":[1169,44],"bytes":[35995,36038]}},"SignAcceptEncoding":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SignAcceptEncoding","kind":"field","type":"*bool","span":{"start":[1134,1],"end":[1134,60],"bytes":[34680,34739]}},"SignPayload":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SignPayload","kind":"field","type":"*bool","span":{"start":[1133,1],"end":[1133,52],"bytes":[34628,34679]}},"SkipVerify":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SkipVerify","kind":"field","type":"bool","span":{"start":[1136,1],"end":[1136,51],"bytes":[34799,34849]}},"StorageClass":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/StorageClass","kind":"field","type":"string","span":{"start":[1137,1],"end":[1137,53],"bytes":[34850,34902]}},"SyncInterval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SyncInterval","kind":"field","type":"*time.Duration","span":{"start":[1114,1],"end":[1114,58],"bytes":[33748,33805]}},"TLS":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/TLS","kind":"field","type":"*bool","span":{"start":[1174,1],"end":[1174,43],"bytes":[36221,36263]}},"Timeout":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Timeout","kind":"field","type":"*time.Duration","span":{"start":[1180,1],"end":[1180,47],"bytes":[36521,36567]}},"Token":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Token","kind":"field","type":"string","span":{"start":[1173,1],"end":[1173,45],"bytes":[36176,36220]}},"User":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/User","kind":"field","type":"string","span":{"start":[1156,1],"end":[1156,39],"bytes":[35553,35591]}},"Username":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Username","kind":"field","type":"string","span":{"start":[1172,1],"end":[1172,48],"bytes":[36128,36175]}},"ValidationInterval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ValidationInterval","kind":"field","type":"*time.Duration","span":{"start":[1115,1],"end":[1115,64],"bytes":[33806,33869]}},"WebDAVPassword":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/WebDAVPassword","kind":"field","type":"string","span":{"start":[1165,1],"end":[1165,48],"bytes":[35885,35932]}},"WebDAVURL":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/WebDAVURL","kind":"field","type":"string","span":{"start":[1163,1],"end":[1163,43],"bytes":[35794,35836]}},"WebDAVUsername":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/WebDAVUsername","kind":"field","type":"string","span":{"start":[1164,1],"end":[1164,48],"bytes":[35837,35884]}}}},"RetentionConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.RetentionConfig","kind":"struct","span":{"start":[334,1],"end":[336,2],"bytes":[9619,9682]},"callables":{},"fields":{"Enabled":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.RetentionConfig/Enabled","kind":"field","type":"*bool","span":{"start":[335,1],"end":[335,32],"bytes":[9649,9680]}}}},"SnapshotConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig","kind":"struct","span":{"start":[328,1],"end":[331,2],"bytes":[9436,9555]},"callables":{},"fields":{"Interval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig/Interval","kind":"field","type":"*time.Duration","span":{"start":[329,1],"end":[329,44],"bytes":[9465,9508]}},"Retention":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig/Retention","kind":"field","type":"*time.Duration","span":{"start":[330,1],"end":[330,45],"bytes":[9509,9553]}}}},"ValidationConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ValidationConfig","kind":"struct","span":{"start":[339,1],"end":[341,2],"bytes":[9743,9818]},"callables":{},"fields":{"Interval":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ValidationConfig/Interval","kind":"field","type":"*time.Duration","span":{"start":[340,1],"end":[340,43],"bytes":[9774,9816]}}}},"boolSetting":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting","kind":"struct","span":{"start":[2067,1],"end":[2070,2],"bytes":[61282,61333]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault","kind":"method","span":{"start":[2081,1],"end":[2085,2],"bytes":[61506,61590]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault","parameters":[{"name":"value","type":"bool","span":{"start":[2081,1],"end":[2081,49],"bytes":[61506,61554]}}],"metrics":{"cyclomatic":2},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set","kind":"method","span":{"start":[2076,1],"end":[2079,2],"bytes":[61432,61504]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set","parameters":[{"name":"value","type":"bool","span":{"start":[2076,1],"end":[2076,40],"bytes":[61432,61471]}}],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"set":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/set","kind":"field","type":"bool","span":{"start":[2069,1],"end":[2069,12],"bytes":[61320,61331]}},"value":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/value","kind":"field","type":"bool","span":{"start":[2068,1],"end":[2068,12],"bytes":[61308,61319]}}}},"levelVar":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar","kind":"struct","span":{"start":[2183,1],"end":[2183,18],"bytes":[64500,64517]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set","kind":"method","span":{"start":[2194,1],"end":[2208,2],"bytes":[64665,65048]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set","parameters":[{"name":"s","type":"string","span":{"start":[2194,1],"end":[2194,41],"bytes":[64665,64705]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"2199:12":{"kind":"call","span":{"start":[2199,12],"end":[2199,27],"bytes":[64766,64781]},"callee":null},"2201:10":{"kind":"call","span":{"start":[2201,10],"end":[2201,88],"bytes":[64808,64886]},"callee":null},"2204:10":{"kind":"call","span":{"start":[2204,10],"end":[2204,80],"bytes":[64943,65013]},"callee":null},"2206:7":{"kind":"call","span":{"start":[2206,7],"end":[2206,18],"bytes":[65023,65034]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.levelVar.String":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.String","kind":"method","span":{"start":[2187,1],"end":[2192,2],"bytes":[64556,64663]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.levelVar.String","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"2191:22":{"kind":"call","span":{"start":[2191,22],"end":[2191,29],"bytes":[64653,64660]},"callee":null},"2191:9":{"kind":"call","span":{"start":[2191,9],"end":[2191,30],"bytes":[64640,64661]},"callee":null}}}}},"txidVar":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar","kind":"struct","span":{"start":[2158,1],"end":[2158,22],"bytes":[63835,63856]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set","kind":"method","span":{"start":[2169,1],"end":[2176,2],"bytes":[64110,64277]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set","parameters":[{"name":"s","type":"string","span":{"start":[2169,1],"end":[2169,40],"bytes":[64110,64149]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"2170:15":{"kind":"call","span":{"start":[2170,15],"end":[2170,31],"bytes":[64164,64180]},"callee":null},"2172:10":{"kind":"call","span":{"start":[2172,10],"end":[2172,43],"bytes":[64207,64240]},"callee":null},"2174:7":{"kind":"call","span":{"start":[2174,7],"end":[2174,20],"bytes":[64250,64263]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.txidVar.String":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.String","kind":"method","span":{"start":[2164,1],"end":[2166,2],"bytes":[63983,64050]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.txidVar.String","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{"2165:9":{"kind":"call","span":{"start":[2165,9],"end":[2165,21],"bytes":[64027,64039]},"callee":null}}}}},"usageError":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.usageError","kind":"struct","span":{"start":[107,1],"end":[110,2],"bytes":[3201,3259]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.usageError.Error":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.usageError/github.com/benbjohnson/litestream/cmd/litestream.usageError.Error","kind":"method","span":{"start":[112,1],"end":[114,2],"bytes":[3261,3318]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.usageError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}}},"fields":{"hint":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.usageError/hint","kind":"field","type":"string","span":{"start":[109,1],"end":[109,16],"bytes":[3242,3257]}},"message":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.usageError/message","kind":"field","type":"string","span":{"start":[108,1],"end":[108,16],"bytes":[3226,3241]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","kind":"function","span":{"start":[393,1],"end":[416,2],"bytes":[11354,12395]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","parameters":[],"return_type":"github.com/benbjohnson/litestream/cmd/litestream.Config","metrics":{"cyclomatic":1},"body":{"410:29":{"kind":"call","span":{"start":[410,29],"end":[410,61],"bytes":[12131,12163]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.DefaultSocketConfig"}}},"github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","kind":"function","span":{"start":[2098,1],"end":[2103,2],"bytes":[61937,62063]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"2099:10":{"kind":"call","span":{"start":[2099,10],"end":[2099,40],"bytes":[61980,62010]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases","kind":"function","span":{"start":[1014,1],"end":[1048,2],"bytes":[31194,31886]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases","parameters":[{"name":"dir","type":"string","span":{"start":[1014,1],"end":[1014,89],"bytes":[31194,31282]}},{"name":"pattern","type":"string","span":{"start":[1014,1],"end":[1014,89],"bytes":[31194,31282]}},{"name":"recursive","type":"bool","span":{"start":[1014,1],"end":[1014,89],"bytes":[31194,31282]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"1017:9":{"kind":"call","span":{"start":[1017,9],"end":[1045,4],"bytes":[31314,31862]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1","kind":"function","span":{"start":[1017,1],"end":[1045,4],"bytes":[31306,31862]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[1017,1],"end":[1017,82],"bytes":[31306,31387]}},{"name":"info","type":"os.FileInfo","span":{"start":[1017,1],"end":[1017,82],"bytes":[31306,31387]}},{"name":"err","type":"error","span":{"start":[1017,1],"end":[1017,82],"bytes":[31306,31387]}}],"return_type":"error","error_channel":["error"],"body":{"1023:6":{"kind":"call","span":{"start":[1023,6],"end":[1023,18],"bytes":[31469,31481]},"callee":null},"1031:19":{"kind":"call","span":{"start":[1031,19],"end":[1031,63],"bytes":[31623,31667]},"callee":null},"1031:43":{"kind":"call","span":{"start":[1031,43],"end":[1031,62],"bytes":[31647,31666]},"callee":null},"1040:6":{"kind":"call","span":{"start":[1040,6],"end":[1040,28],"bytes":[31781,31803]},"callee":null},"1041:14":{"kind":"call","span":{"start":[1041,14],"end":[1041,35],"bytes":[31819,31840]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","kind":"function","span":{"start":[1052,1],"end":[1066,2],"bytes":[31994,32312]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","parameters":[{"name":"path","type":"string","span":{"start":[1052,1],"end":[1052,42],"bytes":[31994,32035]}}],"return_type":"bool","metrics":{"cyclomatic":3},"body":{"1053:15":{"kind":"call","span":{"start":[1053,15],"end":[1053,28],"bytes":[32050,32063]},"callee":null},"1057:8":{"kind":"call","span":{"start":[1057,8],"end":[1057,20],"bytes":[32106,32118]},"callee":null},"1060:12":{"kind":"call","span":{"start":[1060,12],"end":[1060,28],"bytes":[32181,32197]},"callee":null},"1061:15":{"kind":"call","span":{"start":[1061,15],"end":[1061,32],"bytes":[32212,32229]},"callee":null},"1065:9":{"kind":"call","span":{"start":[1065,9],"end":[1065,23],"bytes":[32271,32285]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","kind":"function","span":{"start":[745,1],"end":[812,2],"bytes":[22735,24597]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","parameters":[{"name":"dbc","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[745,1],"end":[745,62],"bytes":[22735,22796]}}],"return_type":"(*github.com/benbjohnson/litestream.DB, error)","error_channel":["error"],"metrics":{"cyclomatic":17},"body":{"747:15":{"kind":"call","span":{"start":[747,15],"end":[747,73],"bytes":[22836,22894]},"callee":null},"750:21":{"kind":"call","span":{"start":[750,21],"end":[750,37],"bytes":[22919,22935]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"756:8":{"kind":"call","span":{"start":[756,8],"end":[756,36],"bytes":[23023,23051]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB"},"760:28":{"kind":"call","span":{"start":[760,28],"end":[760,49],"bytes":[23176,23197]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"762:16":{"kind":"call","span":{"start":[762,16],"end":[762,65],"bytes":[23231,23280]},"callee":null},"765:3":{"kind":"call","span":{"start":[765,3],"end":[765,35],"bytes":[23322,23354]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetMetaPath"},"790:29":{"kind":"call","span":{"start":[790,29],"end":[790,46],"bytes":[24038,24055]},"callee":null},"791:15":{"kind":"call","span":{"start":[791,15],"end":[791,62],"bytes":[24076,24123]},"callee":null},"792:29":{"kind":"call","span":{"start":[792,29],"end":[792,46],"bytes":[24152,24169]},"callee":null},"793:15":{"kind":"call","span":{"start":[793,15],"end":[793,82],"bytes":[24189,24256]},"callee":null},"794:7":{"kind":"call","span":{"start":[794,7],"end":[794,24],"bytes":[24263,24280]},"callee":null},"795:15":{"kind":"call","span":{"start":[795,15],"end":[795,91],"bytes":[24300,24376]},"callee":null},"805:12":{"kind":"call","span":{"start":[805,12],"end":[805,40],"bytes":[24496,24524]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"}}},"github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","kind":"function","span":{"start":[815,1],"end":[864,2],"bytes":[24703,26250]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","parameters":[{"name":"dbc","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[815,1],"end":[815,74],"bytes":[24703,24776]}}],"return_type":"([]*github.com/benbjohnson/litestream.DB, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"817:15":{"kind":"call","span":{"start":[817,15],"end":[817,81],"bytes":[24811,24877]},"callee":null},"821:15":{"kind":"call","span":{"start":[821,15],"end":[821,74],"bytes":[24920,24979]},"callee":null},"824:15":{"kind":"call","span":{"start":[824,15],"end":[824,75],"bytes":[25045,25105]},"callee":null},"827:18":{"kind":"call","span":{"start":[827,18],"end":[827,33],"bytes":[25127,25142]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"833:18":{"kind":"call","span":{"start":[833,18],"end":[833,74],"bytes":[25246,25302]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases"},"835:15":{"kind":"call","span":{"start":[835,15],"end":[835,74],"bytes":[25334,25393]},"callee":null},"838:5":{"kind":"call","span":{"start":[838,5],"end":[838,17],"bytes":[25402,25414]},"callee":null},"839:15":{"kind":"call","span":{"start":[839,15],"end":[839,108],"bytes":[25450,25543]},"callee":null},"844:15":{"kind":"call","span":{"start":[844,15],"end":[844,38],"bytes":[25636,25659]},"callee":null},"847:14":{"kind":"call","span":{"start":[847,14],"end":[847,59],"bytes":[25708,25753]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry"},"849:16":{"kind":"call","span":{"start":[849,16],"end":[849,73],"bytes":[25787,25844]},"callee":null},"853:12":{"kind":"call","span":{"start":[853,12],"end":[853,25],"bytes":[25932,25945]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath"},"855:17":{"kind":"call","span":{"start":[855,17],"end":[855,158],"bytes":[26026,26167]},"callee":null},"860:9":{"kind":"call","span":{"start":[860,9],"end":[860,24],"bytes":[26212,26227]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.NewMain":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewMain","kind":"function","span":{"start":[120,1],"end":[122,2],"bytes":[3430,3470]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewMain","parameters":[],"return_type":"*github.com/benbjohnson/litestream/cmd/litestream.Main","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","kind":"function","span":{"start":[1350,1],"end":[1418,2],"bytes":[40262,42418]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1350,1],"end":[1350,100],"bytes":[40262,40361]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[1350,1],"end":[1350,100],"bytes":[40262,40361]}}],"return_type":"(*github.com/benbjohnson/litestream.Replica, error)","error_channel":["error"],"metrics":{"cyclomatic":24},"body":{"1352:5":{"kind":"call","span":{"start":[1352,5],"end":[1352,29],"bytes":[40411,40435]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL"},"1353:15":{"kind":"call","span":{"start":[1353,15],"end":[1353,105],"bytes":[40452,40542]},"callee":null},"1361:34":{"kind":"call","span":{"start":[1361,34],"end":[1361,55],"bytes":[40936,40957]},"callee":null},"1361:5":{"kind":"call","span":{"start":[1361,5],"end":[1361,26],"bytes":[40907,40928]},"callee":null},"1362:15":{"kind":"call","span":{"start":[1362,15],"end":[1362,134],"bytes":[40978,41097]},"callee":null},"1366:7":{"kind":"call","span":{"start":[1366,7],"end":[1366,32],"bytes":[41127,41152]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica"},"1378:9":{"kind":"call","span":{"start":[1378,9],"end":[1378,24],"bytes":[41393,41408]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType"},"1380:22":{"kind":"call","span":{"start":[1380,22],"end":[1380,58],"bytes":[41446,41482]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig"},"1384:22":{"kind":"call","span":{"start":[1384,22],"end":[1384,56],"bytes":[41553,41587]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig"},"1388:22":{"kind":"call","span":{"start":[1388,22],"end":[1388,56],"bytes":[41658,41692]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig"},"1392:22":{"kind":"call","span":{"start":[1392,22],"end":[1392,57],"bytes":[41764,41799]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig"},"1396:22":{"kind":"call","span":{"start":[1396,22],"end":[1396,58],"bytes":[41872,41908]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig"},"1400:22":{"kind":"call","span":{"start":[1400,22],"end":[1400,60],"bytes":[41983,42021]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig"},"1404:22":{"kind":"call","span":{"start":[1404,22],"end":[1404,58],"bytes":[42094,42130]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig"},"1408:22":{"kind":"call","span":{"start":[1408,22],"end":[1408,57],"bytes":[42202,42237]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig"},"1412:15":{"kind":"call","span":{"start":[1412,15],"end":[1412,80],"bytes":[42299,42364]},"callee":null},"1412:64":{"kind":"call","span":{"start":[1412,64],"end":[1412,79],"bytes":[42348,42363]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType"},"1415:2":{"kind":"call","span":{"start":[1415,2],"end":[1415,32],"bytes":[42370,42400]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger"},"1415:21":{"kind":"call","span":{"start":[1415,21],"end":[1415,31],"bytes":[42389,42399]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}}},"github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","kind":"function","span":{"start":[1453,1],"end":[1716,2],"bytes":[43507,51740]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1453,1],"end":[1453,110],"bytes":[43507,43616]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1453,1],"end":[1453,110],"bytes":[43507,43616]}}],"return_type":"(*github.com/benbjohnson/litestream/s3.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":53},"body":{"1456:15":{"kind":"call","span":{"start":[1456,15],"end":[1456,69],"bytes":[43724,43778]},"callee":null},"1458:15":{"kind":"call","span":{"start":[1458,15],"end":[1458,71],"bytes":[43836,43892]},"callee":null},"1464:17":{"kind":"call","span":{"start":[1464,17],"end":[1464,37],"bytes":[44053,44073]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting"},"1466:3":{"kind":"call","span":{"start":[1466,3],"end":[1466,22],"bytes":[44111,44130]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1468:31":{"kind":"call","span":{"start":[1468,31],"end":[1468,51],"bytes":[44164,44184]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting"},"1470:3":{"kind":"call","span":{"start":[1470,3],"end":[1470,36],"bytes":[44229,44262]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1472:20":{"kind":"call","span":{"start":[1472,20],"end":[1472,40],"bytes":[44285,44305]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting"},"1474:3":{"kind":"call","span":{"start":[1474,3],"end":[1474,25],"bytes":[44349,44371]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1504:36":{"kind":"call","span":{"start":[1504,36],"end":[1504,78],"bytes":[45149,45191]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery"},"1516:6":{"kind":"call","span":{"start":[1516,6],"end":[1516,37],"bytes":[45354,45385]},"callee":null},"1518:14":{"kind":"call","span":{"start":[1518,14],"end":[1518,46],"bytes":[45419,45451]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN"},"1520:51":{"kind":"call","span":{"start":[1520,51],"end":[1520,69],"bytes":[45513,45531]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost"},"1524:19":{"kind":"call","span":{"start":[1524,19],"end":[1524,40],"bytes":[45603,45624]},"callee":null},"1526:19":{"kind":"call","span":{"start":[1526,19],"end":[1526,61],"bytes":[45749,45791]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme"},"1529:7":{"kind":"call","span":{"start":[1529,7],"end":[1529,34],"bytes":[45903,45930]},"callee":null},"1534:17":{"kind":"call","span":{"start":[1534,17],"end":[1534,36],"bytes":[46021,46040]},"callee":null},"1537:25":{"kind":"call","span":{"start":[1537,25],"end":[1537,52],"bytes":[46107,46134]},"callee":null},"1540:21":{"kind":"call","span":{"start":[1540,21],"end":[1540,44],"bytes":[46231,46254]},"callee":null},"1543:15":{"kind":"call","span":{"start":[1543,15],"end":[1543,78],"bytes":[46332,46395]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"1547:15":{"kind":"call","span":{"start":[1547,15],"end":[1547,93],"bytes":[46466,46544]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"1551:15":{"kind":"call","span":{"start":[1551,15],"end":[1551,91],"bytes":[46629,46705]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"1555:11":{"kind":"call","span":{"start":[1555,11],"end":[1555,36],"bytes":[46784,46809]},"callee":null},"1557:18":{"kind":"call","span":{"start":[1557,18],"end":[1557,44],"bytes":[46859,46885]},"callee":null},"1560:20":{"kind":"call","span":{"start":[1560,20],"end":[1560,76],"bytes":[46941,46997]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue"},"1566:20":{"kind":"call","span":{"start":[1566,20],"end":[1566,66],"bytes":[47111,47157]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue"},"1593:4":{"kind":"call","span":{"start":[1593,4],"end":[1593,33],"bytes":[47684,47713]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1596:4":{"kind":"call","span":{"start":[1596,4],"end":[1596,54],"bytes":[47785,47835]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1599:4":{"kind":"call","span":{"start":[1599,4],"end":[1599,42],"bytes":[47895,47933]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1605:15":{"kind":"call","span":{"start":[1605,15],"end":[1605,59],"bytes":[48013,48057]},"callee":null},"1610:15":{"kind":"call","span":{"start":[1610,15],"end":[1610,53],"bytes":[48236,48274]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint"},"1611:14":{"kind":"call","span":{"start":[1611,14],"end":[1611,51],"bytes":[48288,48325]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint"},"1612:37":{"kind":"call","span":{"start":[1612,37],"end":[1612,76],"bytes":[48362,48401]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint"},"1615:20":{"kind":"call","span":{"start":[1615,20],"end":[1615,63],"bytes":[48444,48487]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint"},"1616:17":{"kind":"call","span":{"start":[1616,17],"end":[1616,57],"bytes":[48504,48544]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint"},"1617:16":{"kind":"call","span":{"start":[1617,16],"end":[1617,55],"bytes":[48560,48599]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint"},"1618:16":{"kind":"call","span":{"start":[1618,16],"end":[1618,55],"bytes":[48615,48654]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint"},"1619:13":{"kind":"call","span":{"start":[1619,13],"end":[1619,49],"bytes":[48667,48703]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint"},"1620:20":{"kind":"call","span":{"start":[1620,20],"end":[1620,63],"bytes":[48723,48766]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint"},"1621:16":{"kind":"call","span":{"start":[1621,16],"end":[1621,55],"bytes":[48782,48821]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint"},"1630:3":{"kind":"call","span":{"start":[1630,3],"end":[1630,33],"bytes":[49163,49193]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault"},"1631:3":{"kind":"call","span":{"start":[1631,3],"end":[1631,37],"bytes":[49196,49230]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault"},"1635:3":{"kind":"call","span":{"start":[1635,3],"end":[1635,33],"bytes":[49438,49468]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault"},"1645:12":{"kind":"call","span":{"start":[1645,12],"end":[1645,33],"bytes":[49691,49712]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"1673:24":{"kind":"call","span":{"start":[1673,24],"end":[1673,41],"bytes":[50508,50525]},"callee":null},"1676:21":{"kind":"call","span":{"start":[1676,21],"end":[1676,39],"bytes":[50573,50591]},"callee":null},"1693:7":{"kind":"call","span":{"start":[1693,7],"end":[1693,38],"bytes":[51092,51123]},"callee":null},"1694:18":{"kind":"call","span":{"start":[1694,18],"end":[1694,34],"bytes":[51143,51159]},"callee":null},"1696:18":{"kind":"call","span":{"start":[1696,18],"end":[1696,95],"bytes":[51197,51274]},"callee":null},"1700:20":{"kind":"call","span":{"start":[1700,20],"end":[1700,40],"bytes":[51338,51358]},"callee":null},"1702:17":{"kind":"call","span":{"start":[1702,17],"end":[1702,98],"bytes":[51394,51475]},"callee":null},"1704:28":{"kind":"call","span":{"start":[1704,28],"end":[1704,62],"bytes":[51508,51542]},"callee":null},"1704:46":{"kind":"call","span":{"start":[1704,46],"end":[1704,61],"bytes":[51526,51541]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","kind":"function","span":{"start":[598,1],"end":[614,2],"bytes":[18049,18433]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","parameters":[{"name":"filename","type":"string","span":{"start":[598,1],"end":[598,62],"bytes":[18049,18110]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"600:19":{"kind":"call","span":{"start":[600,19],"end":[600,35],"bytes":[18164,18180]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"606:12":{"kind":"call","span":{"start":[606,12],"end":[606,29],"bytes":[18260,18277]},"callee":null},"607:5":{"kind":"call","span":{"start":[607,5],"end":[607,23],"bytes":[18282,18300]},"callee":null},"608:15":{"kind":"call","span":{"start":[608,15],"end":[608,68],"bytes":[18317,18370]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize","kind":"function","span":{"start":[1091,1],"end":[1109,2],"bytes":[33075,33569]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize","parameters":[{"name":"s","type":"string","span":{"start":[1091,1],"end":[1091,46],"bytes":[33075,33120]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1092:6":{"kind":"call","span":{"start":[1092,6],"end":[1092,26],"bytes":[33126,33146]},"callee":null},"1094:13":{"kind":"call","span":{"start":[1094,13],"end":[1094,44],"bytes":[33173,33204]},"callee":null},"1098:16":{"kind":"call","span":{"start":[1098,16],"end":[1098,38],"bytes":[33274,33296]},"callee":null},"1100:13":{"kind":"call","span":{"start":[1100,13],"end":[1100,55],"bytes":[33326,33368]},"callee":null},"1105:13":{"kind":"call","span":{"start":[1105,13],"end":[1105,98],"bytes":[33452,33537]},"callee":null},"1105:77":{"kind":"call","span":{"start":[1105,77],"end":[1105,97],"bytes":[33516,33536]},"callee":null},"1108:9":{"kind":"call","span":{"start":[1108,9],"end":[1108,21],"bytes":[33550,33562]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ParseConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","kind":"function","span":{"start":[630,1],"end":[714,2],"bytes":[18928,21265]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","parameters":[{"name":"r","type":"io.Reader","span":{"start":[630,1],"end":[630,70],"bytes":[18928,18997]}},{"name":"expandEnv","type":"bool","span":{"start":[630,1],"end":[630,70],"bytes":[18928,18997]}}],"return_type":"(github.com/benbjohnson/litestream/cmd/litestream.Config, error)","error_channel":["error"],"metrics":{"cyclomatic":17},"body":{"631:12":{"kind":"call","span":{"start":[631,12],"end":[631,27],"bytes":[19009,19024]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig"},"634:14":{"kind":"call","span":{"start":[634,14],"end":[634,27],"bytes":[19063,19076]},"callee":null},"641:16":{"kind":"call","span":{"start":[641,16],"end":[646,5],"bytes":[19196,19337]},"callee":null},"641:26":{"kind":"call","span":{"start":[641,26],"end":[641,37],"bytes":[19206,19217]},"callee":null},"641:9":{"kind":"call","span":{"start":[641,9],"end":[646,6],"bytes":[19189,19338]},"callee":null},"652:12":{"kind":"call","span":{"start":[652,12],"end":[652,37],"bytes":[19420,19445]},"callee":null},"664:12":{"kind":"call","span":{"start":[664,12],"end":[664,40],"bytes":[19919,19947]},"callee":null},"681:12":{"kind":"call","span":{"start":[681,12],"end":[681,95],"bytes":[20460,20543]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig"},"690:27":{"kind":"call","span":{"start":[690,27],"end":[690,48],"bytes":[20712,20733]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"696:2":{"kind":"call","span":{"start":[696,2],"end":[696,34],"bytes":[20844,20876]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings"},"699:12":{"kind":"call","span":{"start":[699,12],"end":[699,29],"bytes":[20916,20933]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate"},"708:10":{"kind":"call","span":{"start":[708,10],"end":[708,32],"bytes":[21084,21106]},"callee":null},"711:2":{"kind":"call","span":{"start":[711,2],"end":[711,95],"bytes":[21149,21242]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1","kind":"function","span":{"start":[641,1],"end":[646,6],"bytes":[19181,19338]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1","parameters":[{"name":"key","type":"string","span":{"start":[641,1],"end":[641,64],"bytes":[19181,19244]}}],"return_type":"string","body":{"643:12":{"kind":"call","span":{"start":[643,12],"end":[643,37],"bytes":[19277,19302]},"callee":null},"643:25":{"kind":"call","span":{"start":[643,25],"end":[643,36],"bytes":[19290,19301]},"callee":null},"645:11":{"kind":"call","span":{"start":[645,11],"end":[645,25],"bytes":[19318,19332]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","kind":"function","span":{"start":[618,1],"end":[626,2],"bytes":[18589,18799]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","parameters":[{"name":"filename","type":"string","span":{"start":[618,1],"end":[618,71],"bytes":[18589,18659]}},{"name":"expandEnv","type":"bool","span":{"start":[618,1],"end":[618,71],"bytes":[18589,18659]}}],"return_type":"(github.com/benbjohnson/litestream/cmd/litestream.Config, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"619:12":{"kind":"call","span":{"start":[619,12],"end":[619,36],"bytes":[18671,18695]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile"},"621:10":{"kind":"call","span":{"start":[621,10],"end":[621,25],"bytes":[18722,18737]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig"},"623:8":{"kind":"call","span":{"start":[623,8],"end":[623,17],"bytes":[18753,18762]},"callee":null},"625:9":{"kind":"call","span":{"start":[625,9],"end":[625,34],"bytes":[18772,18797]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig"}}},"github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix","kind":"function","span":{"start":[2145,1],"end":[2155,2],"bytes":[63510,63754]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix","parameters":[{"name":"s","type":"string","span":{"start":[2145,1],"end":[2145,42],"bytes":[63510,63551]}}],"return_type":"string","metrics":{"cyclomatic":4},"body":{"2146:5":{"kind":"call","span":{"start":[2146,5],"end":[2146,11],"bytes":[63556,63562]},"callee":null},"2150:6":{"kind":"call","span":{"start":[2150,6],"end":[2150,34],"bytes":[63665,63693]},"callee":null},"2151:11":{"kind":"call","span":{"start":[2151,11],"end":[2151,40],"bytes":[63706,63735]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL","kind":"function","span":{"start":[994,1],"end":[1010,2],"bytes":[30725,31084]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL","parameters":[{"name":"u","type":"*net/url.URL","span":{"start":[994,1],"end":[994,59],"bytes":[30725,30783]}},{"name":"relPath","type":"string","span":{"start":[994,1],"end":[994,59],"bytes":[30725,30783]}}],"metrics":{"cyclomatic":3},"body":{"1005:12":{"kind":"call","span":{"start":[1005,12],"end":[1005,41],"bytes":[30984,31013]},"callee":null},"1008:17":{"kind":"call","span":{"start":[1008,17],"end":[1008,48],"bytes":[31034,31065]},"callee":null},"995:14":{"kind":"call","span":{"start":[995,14],"end":[995,46],"bytes":[30797,30829]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","kind":"function","span":{"start":[2054,1],"end":[2065,2],"bytes":[60921,61280]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","parameters":[],"metrics":{"cyclomatic":5},"body":{"2055:14":{"kind":"call","span":{"start":[2055,14],"end":[2055,54],"bytes":[60962,61002]},"callee":null},"2056:15":{"kind":"call","span":{"start":[2056,15],"end":[2056,48],"bytes":[61023,61056]},"callee":null},"2057:4":{"kind":"call","span":{"start":[2057,4],"end":[2057,37],"bytes":[61067,61100]},"callee":null},"2060:14":{"kind":"call","span":{"start":[2060,14],"end":[2060,58],"bytes":[61121,61165]},"callee":null},"2061:15":{"kind":"call","span":{"start":[2061,15],"end":[2061,52],"bytes":[61186,61223]},"callee":null},"2062:4":{"kind":"call","span":{"start":[2062,4],"end":[2062,41],"bytes":[61234,61271]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","kind":"function","span":{"start":[932,1],"end":[972,2],"bytes":[28919,29940]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","parameters":[{"name":"base","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[932,1],"end":[932,103],"bytes":[28919,29021]}},{"name":"relPath","type":"string","span":{"start":[932,1],"end":[932,103],"bytes":[28919,29021]}}],"return_type":"(*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig, error)","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"938:12":{"kind":"call","span":{"start":[938,12],"end":[938,37],"bytes":[29095,29120]},"callee":null},"944:13":{"kind":"call","span":{"start":[944,13],"end":[944,39],"bytes":[29230,29256]},"callee":null},"946:16":{"kind":"call","span":{"start":[946,16],"end":[946,56],"bytes":[29290,29330]},"callee":null},"948:3":{"kind":"call","span":{"start":[948,3],"end":[948,38],"bytes":[29337,29372]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL"},"949:21":{"kind":"call","span":{"start":[949,21],"end":[949,31],"bytes":[29393,29403]},"callee":null},"953:9":{"kind":"call","span":{"start":[953,9],"end":[953,27],"bytes":[29443,29461]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType"},"955:16":{"kind":"call","span":{"start":[955,16],"end":[955,43],"bytes":[29493,29520]},"callee":null},"957:23":{"kind":"call","span":{"start":[957,23],"end":[957,65],"bytes":[29573,29615]},"callee":null},"963:15":{"kind":"call","span":{"start":[963,15],"end":[963,49],"bytes":[29756,29790]},"callee":null},"965:23":{"kind":"call","span":{"start":[965,23],"end":[965,51],"bytes":[29835,29863]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","kind":"function","span":{"start":[977,1],"end":[990,2],"bytes":[30181,30587]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","parameters":[{"name":"basePath","type":"string","span":{"start":[977,1],"end":[977,72],"bytes":[30181,30252]}},{"name":"relPath","type":"string","span":{"start":[977,1],"end":[977,72],"bytes":[30181,30252]}}],"return_type":"string","metrics":{"cyclomatic":3},"body":{"978:12":{"kind":"call","span":{"start":[978,12],"end":[978,35],"bytes":[30264,30287]},"callee":null},"983:21":{"kind":"call","span":{"start":[983,21],"end":[983,44],"bytes":[30368,30391]},"callee":null},"985:10":{"kind":"call","span":{"start":[985,10],"end":[985,42],"bytes":[30439,30471]},"callee":null},"989:9":{"kind":"call","span":{"start":[989,9],"end":[989,53],"bytes":[30541,30585]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.expand":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","kind":"function","span":{"start":[2117,1],"end":[2140,2],"bytes":[62581,63267]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.expand","parameters":[{"name":"s","type":"string","span":{"start":[2117,1],"end":[2117,40],"bytes":[62581,62620]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"2119:6":{"kind":"call","span":{"start":[2119,6],"end":[2119,26],"bytes":[62682,62702]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix"},"2122:18":{"kind":"call","span":{"start":[2122,18],"end":[2122,42],"bytes":[62792,62816]},"callee":null},"2123:18":{"kind":"call","span":{"start":[2123,18],"end":[2123,46],"bytes":[62834,62862]},"callee":null},"2124:10":{"kind":"call","span":{"start":[2124,10],"end":[2124,25],"bytes":[62874,62889]},"callee":null},"2128:12":{"kind":"call","span":{"start":[2128,12],"end":[2128,26],"bytes":[62933,62947]},"callee":null},"2132:14":{"kind":"call","span":{"start":[2132,14],"end":[2132,81],"bytes":[63024,63091]},"callee":null},"2139:34":{"kind":"call","span":{"start":[2139,34],"end":[2139,63],"bytes":[63230,63259]},"callee":null},"2139:9":{"kind":"call","span":{"start":[2139,9],"end":[2139,64],"bytes":[63205,63260]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.init":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.init","kind":"function","span":{"start":[43,1],"end":[46,2],"bytes":[937,1023]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"44:11":{"kind":"call","span":{"start":[44,11],"end":[44,32],"bytes":[961,982]},"callee":null},"45:12":{"kind":"call","span":{"start":[45,12],"end":[45,39],"bytes":[994,1021]},"callee":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion"}}},"github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL","kind":"function","span":{"start":[2111,1],"end":[2113,2],"bytes":[62341,62460]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL","parameters":[{"name":"u","type":"string","span":{"start":[2111,1],"end":[2111,42],"bytes":[62341,62382]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"2112:44":{"kind":"call","span":{"start":[2112,44],"end":[2112,76],"bytes":[62426,62458]},"callee":null},"2112:9":{"kind":"call","span":{"start":[2112,9],"end":[2112,40],"bytes":[62391,62422]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.main":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","kind":"function","span":{"start":[84,1],"end":[105,2],"bytes":[2611,3199]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.main","parameters":[],"metrics":{"cyclomatic":7},"body":{"100:6":{"kind":"call","span":{"start":[100,6],"end":[100,31],"bytes":[3066,3091]},"callee":null},"101:11":{"kind":"call","span":{"start":[101,11],"end":[101,61],"bytes":[3127,3177]},"callee":null},"103:3":{"kind":"call","span":{"start":[103,3],"end":[103,13],"bytes":[3184,3194]},"callee":null},"85:2":{"kind":"call","span":{"start":[85,2],"end":[85,52],"bytes":[2626,2676]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"87:7":{"kind":"call","span":{"start":[87,7],"end":[87,16],"bytes":[2684,2693]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewMain"},"88:12":{"kind":"call","span":{"start":[88,12],"end":[88,52],"bytes":[2705,2745]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run"},"88:18":{"kind":"call","span":{"start":[88,18],"end":[88,38],"bytes":[2711,2731]},"callee":null},"88:54":{"kind":"call","span":{"start":[88,54],"end":[88,77],"bytes":[2747,2770]},"callee":null},"89:3":{"kind":"call","span":{"start":[89,3],"end":[89,13],"bytes":[2775,2785]},"callee":null},"90:12":{"kind":"call","span":{"start":[90,12],"end":[90,40],"bytes":[2797,2825]},"callee":null},"93:5":{"kind":"call","span":{"start":[93,5],"end":[93,15],"bytes":[2925,2935]},"callee":null},"96:3":{"kind":"call","span":{"start":[96,3],"end":[96,13],"bytes":[2947,2957]},"callee":null},"98:10":{"kind":"call","span":{"start":[98,10],"end":[98,52],"bytes":[2991,3033]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","kind":"function","span":{"start":[1758,1],"end":[1799,2],"bytes":[52933,54086]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1758,1],"end":[1758,112],"bytes":[52933,53044]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1758,1],"end":[1758,112],"bytes":[52933,53044]}}],"return_type":"(*github.com/benbjohnson/litestream/abs.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"1761:15":{"kind":"call","span":{"start":[1761,15],"end":[1761,70],"bytes":[53152,53207]},"callee":null},"1763:15":{"kind":"call","span":{"start":[1763,15],"end":[1763,72],"bytes":[53265,53322]},"callee":null},"1767:12":{"kind":"call","span":{"start":[1767,12],"end":[1767,34],"bytes":[53357,53379]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient"},"1777:13":{"kind":"call","span":{"start":[1777,13],"end":[1777,29],"bytes":[53632,53648]},"callee":null},"1783:25":{"kind":"call","span":{"start":[1783,25],"end":[1783,42],"bytes":[53764,53781]},"callee":null},"1789:18":{"kind":"call","span":{"start":[1789,18],"end":[1789,61],"bytes":[53885,53928]},"callee":null},"1789:37":{"kind":"call","span":{"start":[1789,37],"end":[1789,55],"bytes":[53904,53922]},"callee":null},"1795:15":{"kind":"call","span":{"start":[1795,15],"end":[1795,60],"bytes":[54015,54060]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting","kind":"function","span":{"start":[2072,1],"end":[2074,2],"bytes":[61335,61430]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting","parameters":[{"name":"defaultValue","type":"bool","span":{"start":[2072,1],"end":[2072,53],"bytes":[61335,61387]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream.boolSetting","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","kind":"function","span":{"start":[867,1],"end":[927,2],"bytes":[26354,28708]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","parameters":[{"name":"dbc","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[867,1],"end":[867,94],"bytes":[26354,26447]}},{"name":"dirPath","type":"string","span":{"start":[867,1],"end":[867,94],"bytes":[26354,26447]}},{"name":"dbPath","type":"string","span":{"start":[867,1],"end":[867,94],"bytes":[26354,26447]}}],"return_type":"(*github.com/benbjohnson/litestream.DB, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"869:18":{"kind":"call","span":{"start":[869,18],"end":[869,47],"bytes":[26513,26542]},"callee":null},"871:15":{"kind":"call","span":{"start":[871,15],"end":[871,86],"bytes":[26574,26645]},"callee":null},"887:23":{"kind":"call","span":{"start":[887,23],"end":[887,43],"bytes":[27269,27289]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"889:16":{"kind":"call","span":{"start":[889,16],"end":[889,79],"bytes":[27323,27386]},"callee":null},"891:19":{"kind":"call","span":{"start":[891,19],"end":[891,79],"bytes":[27409,27469]},"callee":null},"895:24":{"kind":"call","span":{"start":[895,24],"end":[895,45],"bytes":[27589,27610]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"897:16":{"kind":"call","span":{"start":[897,16],"end":[897,80],"bytes":[27644,27708]},"callee":null},"899:19":{"kind":"call","span":{"start":[899,19],"end":[899,73],"bytes":[27731,27785]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry"},"907:23":{"kind":"call","span":{"start":[907,23],"end":[907,79],"bytes":[28041,28097]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath"},"909:16":{"kind":"call","span":{"start":[909,16],"end":[909,81],"bytes":[28131,28196]},"callee":null},"915:5":{"kind":"call","span":{"start":[915,5],"end":[915,22],"bytes":[28297,28314]},"callee":null},"916:27":{"kind":"call","span":{"start":[916,27],"end":[916,68],"bytes":[28347,28388]},"callee":null},"916:50":{"kind":"call","span":{"start":[916,50],"end":[916,67],"bytes":[28370,28387]},"callee":null},"918:24":{"kind":"call","span":{"start":[918,24],"end":[918,76],"bytes":[28453,28505]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath"},"920:17":{"kind":"call","span":{"start":[920,17],"end":[920,88],"bytes":[28541,28612]},"callee":null},"926:9":{"kind":"call","span":{"start":[926,9],"end":[926,39],"bytes":[28676,28706]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"}}},"github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","kind":"function","span":{"start":[1421,1],"end":[1449,2],"bytes":[42518,43386]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1421,1],"end":[1421,114],"bytes":[42518,42631]}},{"name":"r","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1421,1],"end":[1421,114],"bytes":[42518,42631]}}],"return_type":"(*github.com/benbjohnson/litestream/file.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1424:15":{"kind":"call","span":{"start":[1424,15],"end":[1424,71],"bytes":[42726,42782]},"callee":null},"1430:30":{"kind":"call","span":{"start":[1430,30],"end":[1430,63],"bytes":[42901,42934]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"},"1437:15":{"kind":"call","span":{"start":[1437,15],"end":[1437,55],"bytes":[43074,43114]},"callee":null},"1441:23":{"kind":"call","span":{"start":[1441,23],"end":[1441,41],"bytes":[43190,43208]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"1446:12":{"kind":"call","span":{"start":[1446,12],"end":[1446,45],"bytes":[43311,43344]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","kind":"function","span":{"start":[1719,1],"end":[1755,2],"bytes":[51836,52835]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1719,1],"end":[1719,110],"bytes":[51836,51945]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1719,1],"end":[1719,110],"bytes":[51836,51945]}}],"return_type":"(*github.com/benbjohnson/litestream/gs.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"1722:15":{"kind":"call","span":{"start":[1722,15],"end":[1722,69],"bytes":[52053,52107]},"callee":null},"1724:15":{"kind":"call","span":{"start":[1724,15],"end":[1724,71],"bytes":[52165,52221]},"callee":null},"1731:27":{"kind":"call","span":{"start":[1731,27],"end":[1731,60],"bytes":[52354,52387]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"},"1747:15":{"kind":"call","span":{"start":[1747,15],"end":[1747,59],"bytes":[52663,52707]},"callee":null},"1751:12":{"kind":"call","span":{"start":[1751,12],"end":[1751,33],"bytes":[52742,52763]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","kind":"function","span":{"start":[1913,1],"end":[1986,2],"bytes":[57244,59128]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1913,1],"end":[1913,114],"bytes":[57244,57357]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1913,1],"end":[1913,114],"bytes":[57244,57357]}}],"return_type":"(*github.com/benbjohnson/litestream/nats.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"1917:36":{"kind":"call","span":{"start":[1917,36],"end":[1917,69],"bytes":[57499,57532]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"},"1919:16":{"kind":"call","span":{"start":[1919,16],"end":[1919,55],"bytes":[57566,57605]},"callee":null},"1922:16":{"kind":"call","span":{"start":[1922,16],"end":[1922,73],"bytes":[57649,57706]},"callee":null},"1927:10":{"kind":"call","span":{"start":[1927,10],"end":[1927,40],"bytes":[57780,57810]},"callee":null},"1932:13":{"kind":"call","span":{"start":[1932,13],"end":[1932,42],"bytes":[57887,57916]},"callee":null},"1943:15":{"kind":"call","span":{"start":[1943,15],"end":[1943,61],"bytes":[58091,58137]},"callee":null},"1949:15":{"kind":"call","span":{"start":[1949,15],"end":[1949,108],"bytes":[58293,58386]},"callee":null},"1953:12":{"kind":"call","span":{"start":[1953,12],"end":[1953,35],"bytes":[58427,58450]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","kind":"function","span":{"start":[1989,1],"end":[2049,2],"bytes":[59226,60733]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1989,1],"end":[1989,112],"bytes":[59226,59337]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1989,1],"end":[1989,112],"bytes":[59226,59337]}}],"return_type":"(*github.com/benbjohnson/litestream/oss.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1992:15":{"kind":"call","span":{"start":[1992,15],"end":[1992,70],"bytes":[59445,59500]},"callee":null},"1994:15":{"kind":"call","span":{"start":[1994,15],"end":[1994,72],"bytes":[59558,59615]},"callee":null},"2002:26":{"kind":"call","span":{"start":[2002,26],"end":[2002,59],"bytes":[59789,59822]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"},"2012:25":{"kind":"call","span":{"start":[2012,25],"end":[2012,44],"bytes":[59938,59957]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost"},"2028:15":{"kind":"call","span":{"start":[2028,15],"end":[2028,60],"bytes":[60239,60284]},"callee":null},"2032:12":{"kind":"call","span":{"start":[2032,12],"end":[2032,34],"bytes":[60326,60348]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient"},"2042:21":{"kind":"call","span":{"start":[2042,21],"end":[2042,39],"bytes":[60621,60639]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","kind":"function","span":{"start":[1802,1],"end":[1856,2],"bytes":[54186,55646]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1802,1],"end":[1802,114],"bytes":[54186,54299]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1802,1],"end":[1802,114],"bytes":[54186,54299]}}],"return_type":"(*github.com/benbjohnson/litestream/sftp.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"1805:15":{"kind":"call","span":{"start":[1805,15],"end":[1805,71],"bytes":[54407,54463]},"callee":null},"1807:15":{"kind":"call","span":{"start":[1807,15],"end":[1807,71],"bytes":[54519,54575]},"callee":null},"1814:13":{"kind":"call","span":{"start":[1814,13],"end":[1814,29],"bytes":[54720,54736]},"callee":null},"1824:11":{"kind":"call","span":{"start":[1824,11],"end":[1824,28],"bytes":[54929,54946]},"callee":null},"1827:18":{"kind":"call","span":{"start":[1827,18],"end":[1827,35],"bytes":[55007,55024]},"callee":null},"1836:15":{"kind":"call","span":{"start":[1836,15],"end":[1836,59],"bytes":[55141,55185]},"callee":null},"1838:15":{"kind":"call","span":{"start":[1838,15],"end":[1838,59],"bytes":[55224,55268]},"callee":null},"1842:12":{"kind":"call","span":{"start":[1842,12],"end":[1842,35],"bytes":[55303,55326]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","kind":"function","span":{"start":[1859,1],"end":[1910,2],"bytes":[55750,57144]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1859,1],"end":[1859,118],"bytes":[55750,55867]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1859,1],"end":[1859,118],"bytes":[55750,55867]}}],"return_type":"(*github.com/benbjohnson/litestream/webdav.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1862:15":{"kind":"call","span":{"start":[1862,15],"end":[1862,73],"bytes":[55975,56033]},"callee":null},"1864:15":{"kind":"call","span":{"start":[1864,15],"end":[1864,79],"bytes":[56094,56158]},"callee":null},"1871:13":{"kind":"call","span":{"start":[1871,13],"end":[1871,29],"bytes":[56333,56349]},"callee":null},"1882:16":{"kind":"call","span":{"start":[1882,16],"end":[1882,54],"bytes":[56561,56599]},"callee":null},"1887:15":{"kind":"call","span":{"start":[1887,15],"end":[1887,32],"bytes":[56692,56709]},"callee":null},"1890:18":{"kind":"call","span":{"start":[1890,18],"end":[1890,35],"bytes":[56770,56787]},"callee":null},"1899:15":{"kind":"call","span":{"start":[1899,15],"end":[1899,67],"bytes":[56909,56961]},"callee":null},"1903:12":{"kind":"call","span":{"start":[1903,12],"end":[1903,37],"bytes":[56996,57021]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag":{"id":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","kind":"function","span":{"start":[2105,1],"end":[2108,2],"bytes":[62065,62268]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","parameters":[{"name":"fs","type":"*flag.FlagSet","span":{"start":[2105,1],"end":[2105,84],"bytes":[62065,62148]}}],"return_type":"(*string, *bool)","metrics":{"cyclomatic":1},"body":{"2106:9":{"kind":"call","span":{"start":[2106,9],"end":[2106,47],"bytes":[62157,62195]},"callee":null},"2107:3":{"kind":"call","span":{"start":[2107,3],"end":[2107,70],"bytes":[62199,62266]},"callee":null}}}},"content_hash":"51dcf1279e9042b62f269d2b622f9f7fcf39650907d9e2c10f654c2b328a4ff6"},"cmd/litestream/main_notwindows.go":{"id":"can://go/litestream/cmd/litestream/main_notwindows.go","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,440]},"package":"main","source":"//go:build !windows\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n)\n\nconst defaultConfigPath = \"/etc/litestream.yml\"\n\nfunc isWindowsService() (bool, error) {\n\treturn false, nil\n}\n\nfunc runWindowsService(ctx context.Context) error {\n\tpanic(\"cannot run windows service as unix process\")\n}\n\nfunc signalChan() \u003c-chan os.Signal {\n\tch := make(chan os.Signal, 2)\n\tsignal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)\n\treturn ch\n}\n","imports":[{"name":"context","path":"context","span":{"start":[6,1],"end":[6,11],"bytes":[44,54]}},{"name":"os","path":"os","span":{"start":[7,1],"end":[7,6],"bytes":[55,60]}},{"name":"signal","path":"os/signal","span":{"start":[8,1],"end":[8,13],"bytes":[61,73]}},{"name":"syscall","path":"syscall","span":{"start":[9,1],"end":[9,11],"bytes":[74,84]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.isWindowsService":{"id":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.isWindowsService","kind":"function","span":{"start":[14,1],"end":[16,2],"bytes":[137,197]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.isWindowsService","parameters":[],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.runWindowsService":{"id":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.runWindowsService","kind":"function","span":{"start":[18,1],"end":[20,2],"bytes":[199,305]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.runWindowsService","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[18,1],"end":[18,52],"bytes":[199,250]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"19:2":{"kind":"call","span":{"start":[19,2],"end":[19,53],"bytes":[252,303]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.signalChan":{"id":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan","kind":"function","span":{"start":[22,1],"end":[26,2],"bytes":[307,439]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.signalChan","parameters":[],"return_type":"\u003c-chan os.Signal","metrics":{"cyclomatic":1},"body":{"23:8":{"kind":"call","span":{"start":[23,8],"end":[23,31],"bytes":[351,374]},"callee":null},"24:2":{"kind":"call","span":{"start":[24,2],"end":[24,52],"bytes":[376,426]},"callee":null}}}},"content_hash":"63ed2fa53604bc509016c51dbc1552a4e4618d1a981a15c1301942a52a501bf3"},"cmd/litestream/mcp.go":{"id":"can://go/litestream/cmd/litestream/mcp.go","kind":"module","span":{"start":[1,1],"end":[347,1],"bytes":[0,12226]},"package":"main","source":"package main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"os/exec\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/MadAppGang/httplog\"\n\t\"github.com/mark3labs/mcp-go/mcp\"\n\t\"github.com/mark3labs/mcp-go/server\"\n)\n\ntype MCPServer struct {\n\tctx context.Context\n\tmux *http.ServeMux\n\thttpServer *http.Server\n\tconfigPath string\n}\n\nfunc NewMCP(ctx context.Context, configPath string) (*MCPServer, error) {\n\ts := \u0026MCPServer{\n\t\tctx: ctx,\n\t\tconfigPath: configPath,\n\t}\n\n\tmcpServer := server.NewMCPServer(\n\t\t\"Litestream MCP Server\",\n\t\t\"1.0.0\",\n\t\tserver.WithToolCapabilities(false),\n\t\tserver.WithRecovery(),\n\t\tserver.WithLogging(),\n\t)\n\t// Add the tools to the server\n\tmcpServer.AddTool(InfoTool(configPath))\n\tmcpServer.AddTool(DatabasesTool(configPath))\n\tmcpServer.AddTool(RestoreTool(configPath))\n\tmcpServer.AddTool(LTXTool(configPath))\n\tmcpServer.AddTool(VersionTool())\n\tmcpServer.AddTool(StatusTool(configPath))\n\tmcpServer.AddTool(ResetTool(configPath))\n\n\ts.mux = http.NewServeMux()\n\ts.mux.Handle(\"/\", httplog.Logger(server.NewStreamableHTTPServer(mcpServer)))\n\treturn s, nil\n}\n\nfunc (s *MCPServer) Start(addr string) {\n\ts.httpServer = \u0026http.Server{\n\t\tAddr: addr,\n\t\tHandler: s.mux,\n\t\tReadHeaderTimeout: 30 * time.Second,\n\t}\n\tgo func() {\n\t\tslog.Info(\"Starting MCP Streamable HTTP server\", \"addr\", addr)\n\t\tif err := s.httpServer.ListenAndServe(); err != nil {\n\t\t\tslog.Error(\"MCP server error\", \"error\", err)\n\t\t}\n\t}()\n}\n\nfunc (s *MCPServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n\ts.mux.ServeHTTP(w, r)\n}\n\n// Close attempts to gracefully shutdown the server.\nfunc (s *MCPServer) Close() error {\n\tctx, cancel := context.WithTimeout(s.ctx, 10*time.Second)\n\tdefer cancel()\n\treturn s.httpServer.Shutdown(ctx)\n}\n\n// isReplicaURL returns true if the path looks like a replica URL (s3://, gs://, etc.)\n// rather than a local database path. The CLI rejects -config when using replica URLs.\nfunc isReplicaURL(path string) bool {\n\treturn strings.Contains(path, \"://\")\n}\n\nfunc DatabasesTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_databases\",\n\t\tmcp.WithDescription(\"List databases and their replicas as defined in the Litestream config file. The default path is /etc/litestream.yml but is not required.\"),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"databases\"}\n\t\tconfig := configPath\n\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\tconfig = configVal\n\t\t}\n\t\targs = append(args, \"-config\", config)\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc InfoTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_info\",\n\t\tmcp.WithDescription(\"Get a comprehensive summary of Litestream's current status including databases, LTX files, and version information.\"),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\tvar summary strings.Builder\n\t\tsummary.WriteString(\"=== Litestream Status Report ===\\n\\n\")\n\n\t\t// Get version info\n\t\tversionCmd := exec.CommandContext(ctx, \"litestream\", \"version\")\n\t\tversionOutput, err := versionCmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\tslog.Error(\"Failed to get version info\", \"error\", err)\n\t\t\treturn mcp.NewToolResultError(\"Failed to get version info: \" + err.Error()), nil\n\t\t}\n\t\tsummary.WriteString(\"Version Information:\\n\")\n\t\tsummary.WriteString(string(versionOutput))\n\t\tsummary.WriteString(\"\\n\")\n\n\t\t// Get databases info\n\t\targs := []string{\"databases\"}\n\t\tconfig := configPath\n\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\tconfig = configVal\n\t\t}\n\t\tsummary.WriteString(\"Current Config Path:\\n\")\n\t\tsummary.WriteString(config + \"\\n\\n\")\n\n\t\targs = append(args, \"-config\", config)\n\t\tdbCmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\tdbOutput, err := dbCmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\tslog.Error(\"Failed to get databases info\", \"error\", err)\n\t\t\treturn mcp.NewToolResultError(\"Failed to get databases info: \" + err.Error()), nil\n\t\t}\n\n\t\tsummary.WriteString(\"Databases:\\n\")\n\t\tsummary.WriteString(string(dbOutput))\n\t\tsummary.WriteString(\"\\n\")\n\n\t\t// Parse database paths from output\n\t\tscanner := bufio.NewScanner(strings.NewReader(string(dbOutput)))\n\t\t// Skip header line\n\t\tscanner.Scan()\n\t\tvar dbPaths []string\n\t\tfor scanner.Scan() {\n\t\t\tfields := strings.Fields(scanner.Text())\n\t\t\tif len(fields) \u003e 0 {\n\t\t\t\tdbPaths = append(dbPaths, fields[0])\n\t\t\t}\n\t\t}\n\n\t\t// Get LTX files info for each database\n\t\tsummary.WriteString(\"LTX Files:\\n\")\n\t\tfor _, dbPath := range dbPaths {\n\t\t\tltxArgs := []string{\"ltx\"}\n\t\t\tif config != \"\" {\n\t\t\t\tltxArgs = append(ltxArgs, \"-config\", config)\n\t\t\t}\n\t\t\tltxArgs = append(ltxArgs, dbPath)\n\t\t\tltxCmd := exec.CommandContext(ctx, \"litestream\", ltxArgs...)\n\t\t\tltxOutput, err := ltxCmd.CombinedOutput()\n\t\t\tif err != nil {\n\t\t\t\tsummary.WriteString(\"Failed to get LTX files for \" + dbPath + \": \" + err.Error() + \"\\n\")\n\t\t\t\tsummary.WriteString(string(ltxOutput))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsummary.WriteString(\"Database: \" + dbPath + \"\\n\")\n\t\t\tsummary.WriteString(string(ltxOutput))\n\t\t\tsummary.WriteString(\"\\n\")\n\t\t}\n\n\t\treturn mcp.NewToolResultText(summary.String()), nil\n\t}\n}\n\nfunc RestoreTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_restore\",\n\t\tmcp.WithDescription(\"Restore a database from a Litestream replica.\"),\n\t\tmcp.WithString(\"path\", mcp.Required(), mcp.Description(\"Database path or replica URL.\")),\n\t\tmcp.WithString(\"o\", mcp.Description(\"Output path for the restored database. Optional.\")),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t\tmcp.WithString(\"txid\", mcp.Description(\"Restore up to a specific transaction ID. Optional.\")),\n\t\tmcp.WithString(\"timestamp\", mcp.Description(\"Restore to a specific point-in-time (RFC3339). Optional.\")),\n\t\tmcp.WithString(\"parallelism\", mcp.Description(\"Number of WAL files to download in parallel. Optional.\")),\n\t\tmcp.WithBoolean(\"if_db_not_exists\", mcp.Description(\"Return 0 if the database already exists. Optional.\")),\n\t\tmcp.WithBoolean(\"if_replica_exists\", mcp.Description(\"Return 0 if no backups found. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"restore\"}\n\t\tif o, err := req.RequireString(\"o\"); err == nil {\n\t\t\targs = append(args, \"-o\", o)\n\t\t}\n\n\t\t// Get path first to determine if it's a replica URL\n\t\tpath, _ := req.RequireString(\"path\")\n\n\t\t// Only add -config for database paths, not replica URLs\n\t\t// The CLI rejects -config when restoring from a replica URL\n\t\tif !isReplicaURL(path) {\n\t\t\tconfig := configPath\n\t\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\t\tconfig = configVal\n\t\t\t}\n\t\t\tif config != \"\" {\n\t\t\t\targs = append(args, \"-config\", config)\n\t\t\t}\n\t\t}\n\n\t\tif txid, err := req.RequireString(\"txid\"); err == nil {\n\t\t\targs = append(args, \"-txid\", txid)\n\t\t}\n\t\tif timestamp, err := req.RequireString(\"timestamp\"); err == nil {\n\t\t\targs = append(args, \"-timestamp\", timestamp)\n\t\t}\n\t\tif parallelism, err := req.RequireString(\"parallelism\"); err == nil {\n\t\t\targs = append(args, \"-parallelism\", parallelism)\n\t\t}\n\t\tif ifDBNotExists, err := req.RequireBool(\"if_db_not_exists\"); err == nil {\n\t\t\targs = append(args, \"-if-db-not-exists\", strconv.FormatBool(ifDBNotExists))\n\t\t}\n\t\tif ifReplicaExists, err := req.RequireBool(\"if_replica_exists\"); err == nil {\n\t\t\targs = append(args, \"-if-replica-exists\", strconv.FormatBool(ifReplicaExists))\n\t\t}\n\t\tif path != \"\" {\n\t\t\targs = append(args, path)\n\t\t}\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc VersionTool() (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_version\",\n\t\tmcp.WithDescription(\"Print the Litestream binary version.\"),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", \"version\")\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc LTXTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_ltx\",\n\t\tmcp.WithDescription(\"List all LTX files for a database or replica URL.\"),\n\t\tmcp.WithString(\"path\", mcp.Required(), mcp.Description(\"Database path or replica URL.\")),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional, ignored for replica URLs.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"ltx\"}\n\n\t\t// Get path first to determine if it's a replica URL\n\t\tpath, _ := req.RequireString(\"path\")\n\n\t\t// Only add -config for database paths, not replica URLs\n\t\t// The CLI rejects -config when using a replica URL\n\t\tif !isReplicaURL(path) {\n\t\t\tconfig := configPath\n\t\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\t\tconfig = configVal\n\t\t\t}\n\t\t\tif config != \"\" {\n\t\t\t\targs = append(args, \"-config\", config)\n\t\t\t}\n\t\t}\n\n\t\tif path != \"\" {\n\t\t\targs = append(args, path)\n\t\t}\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc StatusTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_status\",\n\t\tmcp.WithDescription(\"Display replication status including database path, status, local transaction ID, and WAL size.\"),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t\tmcp.WithString(\"path\", mcp.Description(\"Filter to a specific database path. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"status\"}\n\t\tconfig := configPath\n\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\tconfig = configVal\n\t\t}\n\t\targs = append(args, \"-config\", config)\n\t\tif path, err := req.RequireString(\"path\"); err == nil {\n\t\t\targs = append(args, path)\n\t\t}\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc ResetTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_reset\",\n\t\tmcp.WithDescription(\"Clear local Litestream state for a database. Removes local LTX files, forcing fresh snapshot on next sync. Database file is not modified.\"),\n\t\tmcp.WithString(\"path\", mcp.Required(), mcp.Description(\"Database path to reset.\")),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"reset\"}\n\t\tconfig := configPath\n\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\tconfig = configVal\n\t\t}\n\t\targs = append(args, \"-config\", config)\n\t\tif path, err := req.RequireString(\"path\"); err == nil {\n\t\t\targs = append(args, path)\n\t\t}\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n","imports":[{"name":"bufio","path":"bufio","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"slog","path":"log/slog","span":{"start":[6,1],"end":[6,12],"bytes":[43,54]}},{"name":"http","path":"net/http","span":{"start":[7,1],"end":[7,12],"bytes":[55,66]}},{"name":"exec","path":"os/exec","span":{"start":[8,1],"end":[8,11],"bytes":[67,77]}},{"name":"strconv","path":"strconv","span":{"start":[9,1],"end":[9,11],"bytes":[78,88]}},{"name":"strings","path":"strings","span":{"start":[10,1],"end":[10,11],"bytes":[89,99]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[100,107]}},{"name":"httplog","path":"github.com/MadAppGang/httplog","span":{"start":[13,1],"end":[13,33],"bytes":[109,141]}},{"name":"mcp","path":"github.com/mark3labs/mcp-go/mcp","span":{"start":[14,1],"end":[14,35],"bytes":[142,176]}},{"name":"server","path":"github.com/mark3labs/mcp-go/server","span":{"start":[15,1],"end":[15,38],"bytes":[177,214]}}],"types":{"MCPServer":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer","kind":"struct","span":{"start":[18,1],"end":[23,2],"bytes":[218,342]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close","kind":"method","span":{"start":[71,1],"end":[75,2],"bytes":[1608,1755]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"72:17":{"kind":"call","span":{"start":[72,17],"end":[72,59],"bytes":[1660,1702]},"callee":null},"73:8":{"kind":"call","span":{"start":[73,8],"end":[73,16],"bytes":[1710,1718]},"callee":null},"74:9":{"kind":"call","span":{"start":[74,9],"end":[74,35],"bytes":[1727,1753]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.ServeHTTP":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.ServeHTTP","kind":"method","span":{"start":[66,1],"end":[68,2],"bytes":[1457,1553]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.ServeHTTP","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[66,1],"end":[66,72],"bytes":[1457,1528]}},{"name":"r","type":"*net/http.Request","span":{"start":[66,1],"end":[66,72],"bytes":[1457,1528]}}],"metrics":{"cyclomatic":1},"body":{"67:2":{"kind":"call","span":{"start":[67,2],"end":[67,23],"bytes":[1530,1551]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start","kind":"method","span":{"start":[52,1],"end":[64,2],"bytes":[1095,1455]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start","parameters":[{"name":"addr","type":"string","span":{"start":[52,1],"end":[52,41],"bytes":[1095,1135]}}],"metrics":{"cyclomatic":2},"body":{"58:5":{"kind":"call","span":{"start":[58,5],"end":[63,5],"bytes":[1267,1453]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1","kind":"function","span":{"start":[58,1],"end":[63,5],"bytes":[1263,1453]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1","parameters":[],"body":{"59:3":{"kind":"call","span":{"start":[59,3],"end":[59,65],"bytes":[1278,1340]},"callee":null},"60:13":{"kind":"call","span":{"start":[60,13],"end":[60,42],"bytes":[1353,1382]},"callee":null},"61:4":{"kind":"call","span":{"start":[61,4],"end":[61,48],"bytes":[1400,1444]},"callee":null}}}}}},"fields":{"configPath":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/configPath","kind":"field","type":"string","span":{"start":[22,1],"end":[22,19],"bytes":[322,340]}},"ctx":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/ctx","kind":"field","type":"context.Context","span":{"start":[19,1],"end":[19,28],"bytes":[242,269]}},"httpServer":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/httpServer","kind":"field","type":"*net/http.Server","span":{"start":[21,1],"end":[21,25],"bytes":[297,321]}},"mux":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/mux","kind":"field","type":"*net/http.ServeMux","span":{"start":[20,1],"end":[20,27],"bytes":[270,296]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool","kind":"function","span":{"start":[83,1],"end":[103,2],"bytes":[2010,2941]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool","parameters":[{"name":"configPath","type":"string","span":{"start":[83,1],"end":[83,75],"bytes":[2010,2084]}}],"return_type":"(github.com/mark3labs/mcp-go/mcp.Tool, github.com/mark3labs/mcp-go/server.ToolHandlerFunc)","metrics":{"cyclomatic":3},"body":{"84:10":{"kind":"call","span":{"start":[84,10],"end":[87,3],"bytes":[2094,2389]},"callee":null},"85:3":{"kind":"call","span":{"start":[85,3],"end":[85,162],"bytes":[2132,2291]},"callee":null},"86:28":{"kind":"call","span":{"start":[86,28],"end":[86,92],"bytes":[2320,2384]},"callee":null},"86:3":{"kind":"call","span":{"start":[86,3],"end":[86,93],"bytes":[2295,2385]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1","kind":"function","span":{"start":[89,1],"end":[102,3],"bytes":[2391,2939]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[89,1],"end":[89,96],"bytes":[2391,2486]}},{"name":"req","type":"github.com/mark3labs/mcp-go/mcp.CallToolRequest","span":{"start":[89,1],"end":[89,96],"bytes":[2391,2486]}}],"return_type":"(*github.com/mark3labs/mcp-go/mcp.CallToolResult, error)","error_channel":["error"],"body":{"101:10":{"kind":"call","span":{"start":[101,10],"end":[101,47],"bytes":[2894,2931]},"callee":null},"101:32":{"kind":"call","span":{"start":[101,32],"end":[101,46],"bytes":[2916,2930]},"callee":null},"92:24":{"kind":"call","span":{"start":[92,24],"end":[92,51],"bytes":[2565,2592]},"callee":null},"95:10":{"kind":"call","span":{"start":[95,10],"end":[95,41],"bytes":[2642,2673]},"callee":null},"96:10":{"kind":"call","span":{"start":[96,10],"end":[96,57],"bytes":[2683,2730]},"callee":null},"97:18":{"kind":"call","span":{"start":[97,18],"end":[97,38],"bytes":[2748,2768]},"callee":null},"99:11":{"kind":"call","span":{"start":[99,11],"end":[99,89],"bytes":[2797,2875]},"callee":null},"99:34":{"kind":"call","span":{"start":[99,34],"end":[99,67],"bytes":[2820,2853]},"callee":null},"99:52":{"kind":"call","span":{"start":[99,52],"end":[99,66],"bytes":[2838,2852]},"callee":null},"99:77":{"kind":"call","span":{"start":[99,77],"end":[99,88],"bytes":[2863,2874]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.InfoTool":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool","kind":"function","span":{"start":[105,1],"end":[181,2],"bytes":[2943,5619]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoTool","parameters":[{"name":"configPath","type":"string","span":{"start":[105,1],"end":[105,70],"bytes":[2943,3012]}}],"return_type":"(github.com/mark3labs/mcp-go/mcp.Tool, github.com/mark3labs/mcp-go/server.ToolHandlerFunc)","metrics":{"cyclomatic":9},"body":{"106:10":{"kind":"call","span":{"start":[106,10],"end":[109,3],"bytes":[3022,3291]},"callee":null},"107:3":{"kind":"call","span":{"start":[107,3],"end":[107,141],"bytes":[3055,3193]},"callee":null},"108:28":{"kind":"call","span":{"start":[108,28],"end":[108,92],"bytes":[3222,3286]},"callee":null},"108:3":{"kind":"call","span":{"start":[108,3],"end":[108,93],"bytes":[3197,3287]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","kind":"function","span":{"start":[111,1],"end":[180,3],"bytes":[3293,5617]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[111,1],"end":[111,96],"bytes":[3293,3388]}},{"name":"req","type":"github.com/mark3labs/mcp-go/mcp.CallToolRequest","span":{"start":[111,1],"end":[111,96],"bytes":[3293,3388]}}],"return_type":"(*github.com/mark3labs/mcp-go/mcp.CallToolResult, error)","error_channel":["error"],"body":{"113:3":{"kind":"call","span":{"start":[113,3],"end":[113,62],"bytes":[3421,3480]},"callee":null},"116:17":{"kind":"call","span":{"start":[116,17],"end":[116,66],"bytes":[3520,3569]},"callee":null},"117:25":{"kind":"call","span":{"start":[117,25],"end":[117,52],"bytes":[3594,3621]},"callee":null},"119:4":{"kind":"call","span":{"start":[119,4],"end":[119,58],"bytes":[3643,3697]},"callee":null},"120:11":{"kind":"call","span":{"start":[120,11],"end":[120,79],"bytes":[3708,3776]},"callee":null},"120:67":{"kind":"call","span":{"start":[120,67],"end":[120,78],"bytes":[3764,3775]},"callee":null},"122:3":{"kind":"call","span":{"start":[122,3],"end":[122,48],"bytes":[3788,3833]},"callee":null},"123:23":{"kind":"call","span":{"start":[123,23],"end":[123,44],"bytes":[3856,3877]},"callee":null},"123:3":{"kind":"call","span":{"start":[123,3],"end":[123,45],"bytes":[3836,3878]},"callee":null},"124:3":{"kind":"call","span":{"start":[124,3],"end":[124,28],"bytes":[3881,3906]},"callee":null},"129:24":{"kind":"call","span":{"start":[129,24],"end":[129,51],"bytes":[4010,4037]},"callee":null},"132:3":{"kind":"call","span":{"start":[132,3],"end":[132,48],"bytes":[4080,4125]},"callee":null},"133:3":{"kind":"call","span":{"start":[133,3],"end":[133,39],"bytes":[4128,4164]},"callee":null},"135:10":{"kind":"call","span":{"start":[135,10],"end":[135,41],"bytes":[4175,4206]},"callee":null},"136:12":{"kind":"call","span":{"start":[136,12],"end":[136,59],"bytes":[4218,4265]},"callee":null},"137:20":{"kind":"call","span":{"start":[137,20],"end":[137,42],"bytes":[4285,4307]},"callee":null},"139:4":{"kind":"call","span":{"start":[139,4],"end":[139,60],"bytes":[4329,4385]},"callee":null},"140:11":{"kind":"call","span":{"start":[140,11],"end":[140,81],"bytes":[4396,4466]},"callee":null},"140:69":{"kind":"call","span":{"start":[140,69],"end":[140,80],"bytes":[4454,4465]},"callee":null},"143:3":{"kind":"call","span":{"start":[143,3],"end":[143,38],"bytes":[4479,4514]},"callee":null},"144:23":{"kind":"call","span":{"start":[144,23],"end":[144,39],"bytes":[4537,4553]},"callee":null},"144:3":{"kind":"call","span":{"start":[144,3],"end":[144,40],"bytes":[4517,4554]},"callee":null},"145:3":{"kind":"call","span":{"start":[145,3],"end":[145,28],"bytes":[4557,4582]},"callee":null},"148:14":{"kind":"call","span":{"start":[148,14],"end":[148,67],"bytes":[4635,4688]},"callee":null},"148:31":{"kind":"call","span":{"start":[148,31],"end":[148,66],"bytes":[4652,4687]},"callee":null},"148:49":{"kind":"call","span":{"start":[148,49],"end":[148,65],"bytes":[4670,4686]},"callee":null},"150:3":{"kind":"call","span":{"start":[150,3],"end":[150,17],"bytes":[4713,4727]},"callee":null},"152:7":{"kind":"call","span":{"start":[152,7],"end":[152,21],"bytes":[4757,4771]},"callee":null},"153:14":{"kind":"call","span":{"start":[153,14],"end":[153,44],"bytes":[4787,4817]},"callee":null},"153:29":{"kind":"call","span":{"start":[153,29],"end":[153,43],"bytes":[4802,4816]},"callee":null},"154:7":{"kind":"call","span":{"start":[154,7],"end":[154,18],"bytes":[4824,4835]},"callee":null},"155:15":{"kind":"call","span":{"start":[155,15],"end":[155,41],"bytes":[4856,4882]},"callee":null},"160:3":{"kind":"call","span":{"start":[160,3],"end":[160,38],"bytes":[4937,4972]},"callee":null},"164:15":{"kind":"call","span":{"start":[164,15],"end":[164,49],"bytes":[5073,5107]},"callee":null},"166:14":{"kind":"call","span":{"start":[166,14],"end":[166,37],"bytes":[5126,5149]},"callee":null},"167:14":{"kind":"call","span":{"start":[167,14],"end":[167,64],"bytes":[5163,5213]},"callee":null},"168:22":{"kind":"call","span":{"start":[168,22],"end":[168,45],"bytes":[5235,5258]},"callee":null},"170:5":{"kind":"call","span":{"start":[170,5],"end":[170,93],"bytes":[5282,5370]},"callee":null},"170:74":{"kind":"call","span":{"start":[170,74],"end":[170,85],"bytes":[5351,5362]},"callee":null},"171:25":{"kind":"call","span":{"start":[171,25],"end":[171,42],"bytes":[5395,5412]},"callee":null},"171:5":{"kind":"call","span":{"start":[171,5],"end":[171,43],"bytes":[5375,5413]},"callee":null},"174:4":{"kind":"call","span":{"start":[174,4],"end":[174,53],"bytes":[5435,5484]},"callee":null},"175:24":{"kind":"call","span":{"start":[175,24],"end":[175,41],"bytes":[5508,5525]},"callee":null},"175:4":{"kind":"call","span":{"start":[175,4],"end":[175,42],"bytes":[5488,5526]},"callee":null},"176:4":{"kind":"call","span":{"start":[176,4],"end":[176,29],"bytes":[5530,5555]},"callee":null},"179:10":{"kind":"call","span":{"start":[179,10],"end":[179,49],"bytes":[5570,5609]},"callee":null},"179:32":{"kind":"call","span":{"start":[179,32],"end":[179,48],"bytes":[5592,5608]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.LTXTool":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool","kind":"function","span":{"start":[259,1],"end":[294,2],"bytes":[8792,10060]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.LTXTool","parameters":[{"name":"configPath","type":"string","span":{"start":[259,1],"end":[259,69],"bytes":[8792,8860]}}],"return_type":"(github.com/mark3labs/mcp-go/mcp.Tool, github.com/mark3labs/mcp-go/server.ToolHandlerFunc)","metrics":{"cyclomatic":6},"body":{"260:10":{"kind":"call","span":{"start":[260,10],"end":[264,3],"bytes":[8870,9190]},"callee":null},"261:3":{"kind":"call","span":{"start":[261,3],"end":[261,75],"bytes":[8902,8974]},"callee":null},"262:26":{"kind":"call","span":{"start":[262,26],"end":[262,40],"bytes":[9001,9015]},"callee":null},"262:3":{"kind":"call","span":{"start":[262,3],"end":[262,91],"bytes":[8978,9066]},"callee":null},"262:42":{"kind":"call","span":{"start":[262,42],"end":[262,90],"bytes":[9017,9065]},"callee":null},"263:28":{"kind":"call","span":{"start":[263,28],"end":[263,118],"bytes":[9095,9185]},"callee":null},"263:3":{"kind":"call","span":{"start":[263,3],"end":[263,119],"bytes":[9070,9186]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1","kind":"function","span":{"start":[266,1],"end":[293,3],"bytes":[9192,10058]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[266,1],"end":[266,96],"bytes":[9192,9287]}},{"name":"req","type":"github.com/mark3labs/mcp-go/mcp.CallToolRequest","span":{"start":[266,1],"end":[266,96],"bytes":[9192,9287]}}],"return_type":"(*github.com/mark3labs/mcp-go/mcp.CallToolResult, error)","error_channel":["error"],"body":{"270:14":{"kind":"call","span":{"start":[270,14],"end":[270,39],"bytes":[9383,9408]},"callee":null},"274:7":{"kind":"call","span":{"start":[274,7],"end":[274,25],"bytes":[9529,9547]},"callee":null},"276:25":{"kind":"call","span":{"start":[276,25],"end":[276,52],"bytes":[9598,9625]},"callee":null},"280:12":{"kind":"call","span":{"start":[280,12],"end":[280,43],"bytes":[9700,9731]},"callee":null},"285:11":{"kind":"call","span":{"start":[285,11],"end":[285,29],"bytes":[9770,9788]},"callee":null},"287:10":{"kind":"call","span":{"start":[287,10],"end":[287,57],"bytes":[9802,9849]},"callee":null},"288:18":{"kind":"call","span":{"start":[288,18],"end":[288,38],"bytes":[9867,9887]},"callee":null},"290:11":{"kind":"call","span":{"start":[290,11],"end":[290,89],"bytes":[9916,9994]},"callee":null},"290:34":{"kind":"call","span":{"start":[290,34],"end":[290,67],"bytes":[9939,9972]},"callee":null},"290:52":{"kind":"call","span":{"start":[290,52],"end":[290,66],"bytes":[9957,9971]},"callee":null},"290:77":{"kind":"call","span":{"start":[290,77],"end":[290,88],"bytes":[9982,9993]},"callee":null},"292:10":{"kind":"call","span":{"start":[292,10],"end":[292,47],"bytes":[10013,10050]},"callee":null},"292:32":{"kind":"call","span":{"start":[292,32],"end":[292,46],"bytes":[10035,10049]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.NewMCP":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","kind":"function","span":{"start":[25,1],"end":[50,2],"bytes":[344,1093]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewMCP","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[25,1],"end":[25,74],"bytes":[344,417]}},{"name":"configPath","type":"string","span":{"start":[25,1],"end":[25,74],"bytes":[344,417]}}],"return_type":"(*github.com/benbjohnson/litestream/cmd/litestream.MCPServer, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"31:15":{"kind":"call","span":{"start":[31,15],"end":[37,3],"bytes":[499,647]},"callee":null},"34:3":{"kind":"call","span":{"start":[34,3],"end":[34,37],"bytes":[560,594]},"callee":null},"35:3":{"kind":"call","span":{"start":[35,3],"end":[35,24],"bytes":[598,619]},"callee":null},"36:3":{"kind":"call","span":{"start":[36,3],"end":[36,23],"bytes":[623,643]},"callee":null},"39:2":{"kind":"call","span":{"start":[39,2],"end":[39,41],"bytes":[681,720]},"callee":null},"39:20":{"kind":"call","span":{"start":[39,20],"end":[39,40],"bytes":[699,719]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool"},"40:2":{"kind":"call","span":{"start":[40,2],"end":[40,46],"bytes":[722,766]},"callee":null},"40:20":{"kind":"call","span":{"start":[40,20],"end":[40,45],"bytes":[740,765]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool"},"41:2":{"kind":"call","span":{"start":[41,2],"end":[41,44],"bytes":[768,810]},"callee":null},"41:20":{"kind":"call","span":{"start":[41,20],"end":[41,43],"bytes":[786,809]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool"},"42:2":{"kind":"call","span":{"start":[42,2],"end":[42,40],"bytes":[812,850]},"callee":null},"42:20":{"kind":"call","span":{"start":[42,20],"end":[42,39],"bytes":[830,849]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool"},"43:2":{"kind":"call","span":{"start":[43,2],"end":[43,34],"bytes":[852,884]},"callee":null},"43:20":{"kind":"call","span":{"start":[43,20],"end":[43,33],"bytes":[870,883]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool"},"44:2":{"kind":"call","span":{"start":[44,2],"end":[44,43],"bytes":[886,927]},"callee":null},"44:20":{"kind":"call","span":{"start":[44,20],"end":[44,42],"bytes":[904,926]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool"},"45:2":{"kind":"call","span":{"start":[45,2],"end":[45,42],"bytes":[929,969]},"callee":null},"45:20":{"kind":"call","span":{"start":[45,20],"end":[45,41],"bytes":[947,968]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool"},"47:10":{"kind":"call","span":{"start":[47,10],"end":[47,28],"bytes":[980,998]},"callee":null},"48:2":{"kind":"call","span":{"start":[48,2],"end":[48,78],"bytes":[1000,1076]},"callee":null},"48:20":{"kind":"call","span":{"start":[48,20],"end":[48,77],"bytes":[1018,1075]},"callee":null},"48:35":{"kind":"call","span":{"start":[48,35],"end":[48,76],"bytes":[1033,1074]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ResetTool":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool","kind":"function","span":{"start":[322,1],"end":[346,2],"bytes":[11128,12225]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ResetTool","parameters":[{"name":"configPath","type":"string","span":{"start":[322,1],"end":[322,71],"bytes":[11128,11198]}}],"return_type":"(github.com/mark3labs/mcp-go/mcp.Tool, github.com/mark3labs/mcp-go/server.ToolHandlerFunc)","metrics":{"cyclomatic":4},"body":{"323:10":{"kind":"call","span":{"start":[323,10],"end":[327,3],"bytes":[11208,11586]},"callee":null},"324:3":{"kind":"call","span":{"start":[324,3],"end":[324,163],"bytes":[11242,11402]},"callee":null},"325:26":{"kind":"call","span":{"start":[325,26],"end":[325,40],"bytes":[11429,11443]},"callee":null},"325:3":{"kind":"call","span":{"start":[325,3],"end":[325,85],"bytes":[11406,11488]},"callee":null},"325:42":{"kind":"call","span":{"start":[325,42],"end":[325,84],"bytes":[11445,11487]},"callee":null},"326:28":{"kind":"call","span":{"start":[326,28],"end":[326,92],"bytes":[11517,11581]},"callee":null},"326:3":{"kind":"call","span":{"start":[326,3],"end":[326,93],"bytes":[11492,11582]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1","kind":"function","span":{"start":[329,1],"end":[345,3],"bytes":[11588,12223]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[329,1],"end":[329,96],"bytes":[11588,11683]}},{"name":"req","type":"github.com/mark3labs/mcp-go/mcp.CallToolRequest","span":{"start":[329,1],"end":[329,96],"bytes":[11588,11683]}}],"return_type":"(*github.com/mark3labs/mcp-go/mcp.CallToolResult, error)","error_channel":["error"],"body":{"332:24":{"kind":"call","span":{"start":[332,24],"end":[332,51],"bytes":[11758,11785]},"callee":null},"335:10":{"kind":"call","span":{"start":[335,10],"end":[335,41],"bytes":[11835,11866]},"callee":null},"336:19":{"kind":"call","span":{"start":[336,19],"end":[336,44],"bytes":[11885,11910]},"callee":null},"337:11":{"kind":"call","span":{"start":[337,11],"end":[337,29],"bytes":[11935,11953]},"callee":null},"339:10":{"kind":"call","span":{"start":[339,10],"end":[339,57],"bytes":[11967,12014]},"callee":null},"340:18":{"kind":"call","span":{"start":[340,18],"end":[340,38],"bytes":[12032,12052]},"callee":null},"342:11":{"kind":"call","span":{"start":[342,11],"end":[342,89],"bytes":[12081,12159]},"callee":null},"342:34":{"kind":"call","span":{"start":[342,34],"end":[342,67],"bytes":[12104,12137]},"callee":null},"342:52":{"kind":"call","span":{"start":[342,52],"end":[342,66],"bytes":[12122,12136]},"callee":null},"342:77":{"kind":"call","span":{"start":[342,77],"end":[342,88],"bytes":[12147,12158]},"callee":null},"344:10":{"kind":"call","span":{"start":[344,10],"end":[344,47],"bytes":[12178,12215]},"callee":null},"344:32":{"kind":"call","span":{"start":[344,32],"end":[344,46],"bytes":[12200,12214]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreTool":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool","kind":"function","span":{"start":[183,1],"end":[242,2],"bytes":[5621,8257]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreTool","parameters":[{"name":"configPath","type":"string","span":{"start":[183,1],"end":[183,73],"bytes":[5621,5693]}}],"return_type":"(github.com/mark3labs/mcp-go/mcp.Tool, github.com/mark3labs/mcp-go/server.ToolHandlerFunc)","metrics":{"cyclomatic":12},"body":{"184:10":{"kind":"call","span":{"start":[184,10],"end":[194,3],"bytes":[5703,6612]},"callee":null},"185:3":{"kind":"call","span":{"start":[185,3],"end":[185,71],"bytes":[5739,5807]},"callee":null},"186:26":{"kind":"call","span":{"start":[186,26],"end":[186,40],"bytes":[5834,5848]},"callee":null},"186:3":{"kind":"call","span":{"start":[186,3],"end":[186,91],"bytes":[5811,5899]},"callee":null},"186:42":{"kind":"call","span":{"start":[186,42],"end":[186,90],"bytes":[5850,5898]},"callee":null},"187:23":{"kind":"call","span":{"start":[187,23],"end":[187,90],"bytes":[5923,5990]},"callee":null},"187:3":{"kind":"call","span":{"start":[187,3],"end":[187,91],"bytes":[5903,5991]},"callee":null},"188:28":{"kind":"call","span":{"start":[188,28],"end":[188,92],"bytes":[6020,6084]},"callee":null},"188:3":{"kind":"call","span":{"start":[188,3],"end":[188,93],"bytes":[5995,6085]},"callee":null},"189:26":{"kind":"call","span":{"start":[189,26],"end":[189,95],"bytes":[6112,6181]},"callee":null},"189:3":{"kind":"call","span":{"start":[189,3],"end":[189,96],"bytes":[6089,6182]},"callee":null},"190:3":{"kind":"call","span":{"start":[190,3],"end":[190,107],"bytes":[6186,6290]},"callee":null},"190:31":{"kind":"call","span":{"start":[190,31],"end":[190,106],"bytes":[6214,6289]},"callee":null},"191:3":{"kind":"call","span":{"start":[191,3],"end":[191,107],"bytes":[6294,6398]},"callee":null},"191:33":{"kind":"call","span":{"start":[191,33],"end":[191,106],"bytes":[6324,6397]},"callee":null},"192:3":{"kind":"call","span":{"start":[192,3],"end":[192,109],"bytes":[6402,6508]},"callee":null},"192:39":{"kind":"call","span":{"start":[192,39],"end":[192,108],"bytes":[6438,6507]},"callee":null},"193:3":{"kind":"call","span":{"start":[193,3],"end":[193,99],"bytes":[6512,6608]},"callee":null},"193:40":{"kind":"call","span":{"start":[193,40],"end":[193,98],"bytes":[6549,6607]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","kind":"function","span":{"start":[196,1],"end":[241,3],"bytes":[6614,8255]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[196,1],"end":[196,96],"bytes":[6614,6709]}},{"name":"req","type":"github.com/mark3labs/mcp-go/mcp.CallToolRequest","span":{"start":[196,1],"end":[196,96],"bytes":[6614,6709]}}],"return_type":"(*github.com/mark3labs/mcp-go/mcp.CallToolResult, error)","error_channel":["error"],"body":{"198:16":{"kind":"call","span":{"start":[198,16],"end":[198,38],"bytes":[6755,6777]},"callee":null},"199:11":{"kind":"call","span":{"start":[199,11],"end":[199,32],"bytes":[6802,6823]},"callee":null},"203:14":{"kind":"call","span":{"start":[203,14],"end":[203,39],"bytes":[6897,6922]},"callee":null},"207:7":{"kind":"call","span":{"start":[207,7],"end":[207,25],"bytes":[7052,7070]},"callee":null},"209:25":{"kind":"call","span":{"start":[209,25],"end":[209,52],"bytes":[7121,7148]},"callee":null},"213:12":{"kind":"call","span":{"start":[213,12],"end":[213,43],"bytes":[7223,7254]},"callee":null},"217:19":{"kind":"call","span":{"start":[217,19],"end":[217,44],"bytes":[7283,7308]},"callee":null},"218:11":{"kind":"call","span":{"start":[218,11],"end":[218,38],"bytes":[7333,7360]},"callee":null},"220:24":{"kind":"call","span":{"start":[220,24],"end":[220,54],"bytes":[7388,7418]},"callee":null},"221:11":{"kind":"call","span":{"start":[221,11],"end":[221,48],"bytes":[7443,7480]},"callee":null},"223:26":{"kind":"call","span":{"start":[223,26],"end":[223,58],"bytes":[7510,7542]},"callee":null},"224:11":{"kind":"call","span":{"start":[224,11],"end":[224,52],"bytes":[7567,7608]},"callee":null},"226:28":{"kind":"call","span":{"start":[226,28],"end":[226,63],"bytes":[7640,7675]},"callee":null},"227:11":{"kind":"call","span":{"start":[227,11],"end":[227,79],"bytes":[7700,7768]},"callee":null},"227:45":{"kind":"call","span":{"start":[227,45],"end":[227,78],"bytes":[7734,7767]},"callee":null},"229:30":{"kind":"call","span":{"start":[229,30],"end":[229,66],"bytes":[7802,7838]},"callee":null},"230:11":{"kind":"call","span":{"start":[230,11],"end":[230,82],"bytes":[7863,7934]},"callee":null},"230:46":{"kind":"call","span":{"start":[230,46],"end":[230,81],"bytes":[7898,7933]},"callee":null},"233:11":{"kind":"call","span":{"start":[233,11],"end":[233,29],"bytes":[7967,7985]},"callee":null},"235:10":{"kind":"call","span":{"start":[235,10],"end":[235,57],"bytes":[7999,8046]},"callee":null},"236:18":{"kind":"call","span":{"start":[236,18],"end":[236,38],"bytes":[8064,8084]},"callee":null},"238:11":{"kind":"call","span":{"start":[238,11],"end":[238,89],"bytes":[8113,8191]},"callee":null},"238:34":{"kind":"call","span":{"start":[238,34],"end":[238,67],"bytes":[8136,8169]},"callee":null},"238:52":{"kind":"call","span":{"start":[238,52],"end":[238,66],"bytes":[8154,8168]},"callee":null},"238:77":{"kind":"call","span":{"start":[238,77],"end":[238,88],"bytes":[8179,8190]},"callee":null},"240:10":{"kind":"call","span":{"start":[240,10],"end":[240,47],"bytes":[8210,8247]},"callee":null},"240:32":{"kind":"call","span":{"start":[240,32],"end":[240,46],"bytes":[8232,8246]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.StatusTool":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool","kind":"function","span":{"start":[296,1],"end":[320,2],"bytes":[10062,11126]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusTool","parameters":[{"name":"configPath","type":"string","span":{"start":[296,1],"end":[296,72],"bytes":[10062,10133]}}],"return_type":"(github.com/mark3labs/mcp-go/mcp.Tool, github.com/mark3labs/mcp-go/server.ToolHandlerFunc)","metrics":{"cyclomatic":4},"body":{"297:10":{"kind":"call","span":{"start":[297,10],"end":[301,3],"bytes":[10143,10486]},"callee":null},"298:3":{"kind":"call","span":{"start":[298,3],"end":[298,121],"bytes":[10178,10296]},"callee":null},"299:28":{"kind":"call","span":{"start":[299,28],"end":[299,92],"bytes":[10325,10389]},"callee":null},"299:3":{"kind":"call","span":{"start":[299,3],"end":[299,93],"bytes":[10300,10390]},"callee":null},"300:26":{"kind":"call","span":{"start":[300,26],"end":[300,90],"bytes":[10417,10481]},"callee":null},"300:3":{"kind":"call","span":{"start":[300,3],"end":[300,91],"bytes":[10394,10482]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1","kind":"function","span":{"start":[303,1],"end":[319,3],"bytes":[10488,11124]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[303,1],"end":[303,96],"bytes":[10488,10583]}},{"name":"req","type":"github.com/mark3labs/mcp-go/mcp.CallToolRequest","span":{"start":[303,1],"end":[303,96],"bytes":[10488,10583]}}],"return_type":"(*github.com/mark3labs/mcp-go/mcp.CallToolResult, error)","error_channel":["error"],"body":{"306:24":{"kind":"call","span":{"start":[306,24],"end":[306,51],"bytes":[10659,10686]},"callee":null},"309:10":{"kind":"call","span":{"start":[309,10],"end":[309,41],"bytes":[10736,10767]},"callee":null},"310:19":{"kind":"call","span":{"start":[310,19],"end":[310,44],"bytes":[10786,10811]},"callee":null},"311:11":{"kind":"call","span":{"start":[311,11],"end":[311,29],"bytes":[10836,10854]},"callee":null},"313:10":{"kind":"call","span":{"start":[313,10],"end":[313,57],"bytes":[10868,10915]},"callee":null},"314:18":{"kind":"call","span":{"start":[314,18],"end":[314,38],"bytes":[10933,10953]},"callee":null},"316:11":{"kind":"call","span":{"start":[316,11],"end":[316,89],"bytes":[10982,11060]},"callee":null},"316:34":{"kind":"call","span":{"start":[316,34],"end":[316,67],"bytes":[11005,11038]},"callee":null},"316:52":{"kind":"call","span":{"start":[316,52],"end":[316,66],"bytes":[11023,11037]},"callee":null},"316:77":{"kind":"call","span":{"start":[316,77],"end":[316,88],"bytes":[11048,11059]},"callee":null},"318:10":{"kind":"call","span":{"start":[318,10],"end":[318,47],"bytes":[11079,11116]},"callee":null},"318:32":{"kind":"call","span":{"start":[318,32],"end":[318,46],"bytes":[11101,11115]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.VersionTool":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool","kind":"function","span":{"start":[244,1],"end":[257,2],"bytes":[8259,8790]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.VersionTool","parameters":[],"return_type":"(github.com/mark3labs/mcp-go/mcp.Tool, github.com/mark3labs/mcp-go/server.ToolHandlerFunc)","metrics":{"cyclomatic":2},"body":{"245:10":{"kind":"call","span":{"start":[245,10],"end":[247,3],"bytes":[8324,8423]},"callee":null},"246:3":{"kind":"call","span":{"start":[246,3],"end":[246,62],"bytes":[8360,8419]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1","kind":"function","span":{"start":[249,1],"end":[256,3],"bytes":[8425,8788]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[249,1],"end":[249,96],"bytes":[8425,8520]}},{"name":"req","type":"github.com/mark3labs/mcp-go/mcp.CallToolRequest","span":{"start":[249,1],"end":[249,96],"bytes":[8425,8520]}}],"return_type":"(*github.com/mark3labs/mcp-go/mcp.CallToolResult, error)","error_channel":["error"],"body":{"250:10":{"kind":"call","span":{"start":[250,10],"end":[250,59],"bytes":[8530,8579]},"callee":null},"251:18":{"kind":"call","span":{"start":[251,18],"end":[251,38],"bytes":[8597,8617]},"callee":null},"253:11":{"kind":"call","span":{"start":[253,11],"end":[253,89],"bytes":[8646,8724]},"callee":null},"253:34":{"kind":"call","span":{"start":[253,34],"end":[253,67],"bytes":[8669,8702]},"callee":null},"253:52":{"kind":"call","span":{"start":[253,52],"end":[253,66],"bytes":[8687,8701]},"callee":null},"253:77":{"kind":"call","span":{"start":[253,77],"end":[253,88],"bytes":[8712,8723]},"callee":null},"255:10":{"kind":"call","span":{"start":[255,10],"end":[255,47],"bytes":[8743,8780]},"callee":null},"255:32":{"kind":"call","span":{"start":[255,32],"end":[255,46],"bytes":[8765,8779]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL":{"id":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL","kind":"function","span":{"start":[79,1],"end":[81,2],"bytes":[1931,2008]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL","parameters":[{"name":"path","type":"string","span":{"start":[79,1],"end":[79,38],"bytes":[1931,1968]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"80:9":{"kind":"call","span":{"start":[80,9],"end":[80,38],"bytes":[1977,2006]},"callee":null}}}},"content_hash":"8cec3283fc0c78fde1799fdc8062ab78364af351093c2e6f302fa2bc67bb60a7"},"cmd/litestream/register.go":{"id":"can://go/litestream/cmd/litestream/register.go","kind":"module","span":{"start":[1,1],"end":[170,1],"bytes":[0,4462]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\ntype RegisterCommand struct{}\n\nfunc (c *RegisterCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-register\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\treplicaFlag := fs.String(\"replica\", \"\", \"replica URL (e.g., s3://bucket/prefix, file:///backup/path)\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream register -replica s3://bucket/prefix /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\tif *replicaFlag == \"\" {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"-replica is required\",\n\t\t\thint: \"litestream register -replica s3://bucket/prefix /path/to/db\",\n\t\t}\n\t}\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\treplicaURL := *replicaFlag\n\n\t// Create HTTP client that connects via Unix socket with timeout.\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.RegisterDatabaseRequest{\n\t\tPath: dbPath,\n\t\tReplicaURL: replicaURL,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tresp, err := client.Post(\"http://localhost/register\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"register failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"register failed: %s\", string(body))\n\t}\n\n\tvar result litestream.RegisterDatabaseResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := RegisterResult{\n\t\tStatus: result.Status,\n\t\tDBPath: result.Path,\n\t\tReplica: replicaURL,\n\t\tSocket: *socketPath,\n\t}\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(confirmation, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"status: %s\\n\", registerDisplayStatus(confirmation.Status))\n\tfmt.Printf(\"db_path: %s\\n\", confirmation.DBPath)\n\tfmt.Printf(\"replica: %s\\n\", confirmation.Replica)\n\tfmt.Printf(\"socket: %s\\n\", confirmation.Socket)\n\n\treturn nil\n}\n\ntype RegisterResult struct {\n\tStatus string `json:\"status\"`\n\tDBPath string `json:\"db_path\"`\n\tReplica string `json:\"replica\"`\n\tSocket string `json:\"socket\"`\n}\n\nfunc registerDisplayStatus(status string) string {\n\tif status == \"already_registered\" {\n\t\treturn \"already registered\"\n\t}\n\treturn status\n}\n\nfunc (c *RegisterCommand) Usage() {\n\tfmt.Println(`\nusage: litestream register [OPTIONS] DB_PATH\n\nRegister a database for replication.\n\nArguments:\n DB_PATH Path to the SQLite database file.\n\nOptions:\n -replica URL\n Replica destination URL (e.g., s3://bucket/prefix, file:///backup/path).\n Required.\n\n -timeout SECONDS\n Maximum time to wait in seconds (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n # Register a database with an S3 replica.\n $ litestream register -replica s3://mybucket/db /path/to/db\n\n # Register a database with a file replica.\n $ litestream register -replica file:///backup/path /path/to/db\n\n # Register using a non-default control socket.\n $ litestream register -socket /tmp/litestream.sock -replica s3://mybucket/db /path/to/db\n\n # Register and emit a JSON confirmation.\n $ litestream register -json -replica s3://mybucket/db /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"RegisterCommand":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand","kind":"struct","span":{"start":[17,1],"end":[17,30],"bytes":[149,178]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","kind":"method","span":{"start":[19,1],"end":[117,2],"bytes":[180,3136]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[19,1],"end":[19,74],"bytes":[180,253]}},{"name":"args","type":"[]string","span":{"start":[19,1],"end":[19,74],"bytes":[180,253]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":14},"body":{"103:18":{"kind":"call","span":{"start":[103,18],"end":[103,60],"bytes":[2729,2771]},"callee":null},"105:11":{"kind":"call","span":{"start":[105,11],"end":[105,59],"bytes":[2800,2848]},"callee":null},"107:15":{"kind":"call","span":{"start":[107,15],"end":[107,29],"bytes":[2867,2881]},"callee":null},"107:3":{"kind":"call","span":{"start":[107,3],"end":[107,30],"bytes":[2855,2882]},"callee":null},"111:2":{"kind":"call","span":{"start":[111,2],"end":[111,72],"bytes":[2901,2971]},"callee":null},"111:29":{"kind":"call","span":{"start":[111,29],"end":[111,71],"bytes":[2928,2970]},"callee":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus"},"112:2":{"kind":"call","span":{"start":[112,2],"end":[112,50],"bytes":[2973,3021]},"callee":null},"113:2":{"kind":"call","span":{"start":[113,2],"end":[113,51],"bytes":[3023,3072]},"callee":null},"114:2":{"kind":"call","span":{"start":[114,2],"end":[114,49],"bytes":[3074,3121]},"callee":null},"20:8":{"kind":"call","span":{"start":[20,8],"end":[20,68],"bytes":[261,321]},"callee":null},"21:13":{"kind":"call","span":{"start":[21,13],"end":[21,56],"bytes":[334,377]},"callee":null},"22:16":{"kind":"call","span":{"start":[22,16],"end":[22,86],"bytes":[393,463]},"callee":null},"23:17":{"kind":"call","span":{"start":[23,17],"end":[23,104],"bytes":[480,567]},"callee":null},"24:16":{"kind":"call","span":{"start":[24,16],"end":[24,57],"bytes":[583,624]},"callee":null},"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,26],"bytes":[656,670]},"callee":null},"30:5":{"kind":"call","span":{"start":[30,5],"end":[30,14],"bytes":[706,715]},"callee":null},"36:5":{"kind":"call","span":{"start":[36,5],"end":[36,14],"bytes":[869,878]},"callee":null},"37:10":{"kind":"call","span":{"start":[37,10],"end":[37,42],"bytes":[894,926]},"callee":null},"46:10":{"kind":"call","span":{"start":[46,10],"end":[46,54],"bytes":[1124,1168]},"callee":null},"49:12":{"kind":"call","span":{"start":[49,12],"end":[49,21],"bytes":[1184,1193]},"callee":null},"53:19":{"kind":"call","span":{"start":[53,19],"end":[53,42],"bytes":[1308,1331]},"callee":null},"67:18":{"kind":"call","span":{"start":[67,18],"end":[67,35],"bytes":[1690,1707]},"callee":null},"69:10":{"kind":"call","span":{"start":[69,10],"end":[69,58],"bytes":[1734,1782]},"callee":null},"72:15":{"kind":"call","span":{"start":[72,15],"end":[72,101],"bytes":[1801,1887]},"callee":null},"72:76":{"kind":"call","span":{"start":[72,76],"end":[72,100],"bytes":[1862,1886]},"callee":null},"74:10":{"kind":"call","span":{"start":[74,10],"end":[74,68],"bytes":[1914,1972]},"callee":null},"76:8":{"kind":"call","span":{"start":[76,8],"end":[76,25],"bytes":[1983,2000]},"callee":null},"78:15":{"kind":"call","span":{"start":[78,15],"end":[78,36],"bytes":[2016,2037]},"callee":null},"80:10":{"kind":"call","span":{"start":[80,10],"end":[80,56],"bytes":[2064,2110]},"callee":null},"85:13":{"kind":"call","span":{"start":[85,13],"end":[85,43],"bytes":[2205,2235]},"callee":null},"86:11":{"kind":"call","span":{"start":[86,11],"end":[86,59],"bytes":[2283,2331]},"callee":null},"88:10":{"kind":"call","span":{"start":[88,10],"end":[88,57],"bytes":[2345,2392]},"callee":null},"88:44":{"kind":"call","span":{"start":[88,44],"end":[88,56],"bytes":[2379,2391]},"callee":null},"92:12":{"kind":"call","span":{"start":[92,12],"end":[92,41],"bytes":[2456,2485]},"callee":null},"93:10":{"kind":"call","span":{"start":[93,10],"end":[93,57],"bytes":[2509,2556]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run.closure_1","kind":"function","span":{"start":[57,1],"end":[59,6],"bytes":[1427,1568]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[57,1],"end":[57,73],"bytes":[1427,1499]}},{"name":"_","type":"string","span":{"start":[57,1],"end":[57,73],"bytes":[1427,1499]}},{"name":"_","type":"string","span":{"start":[57,1],"end":[57,73],"bytes":[1427,1499]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"58:12":{"kind":"call","span":{"start":[58,12],"end":[58,63],"bytes":[1511,1562]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage","kind":"method","span":{"start":[133,1],"end":[169,2],"bytes":[3439,4461]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"134:2":{"kind":"call","span":{"start":[134,2],"end":[168,7],"bytes":[3476,4459]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv"}}}}},"RegisterResult":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult","kind":"struct","span":{"start":[119,1],"end":[124,2],"bytes":[3138,3298]},"callables":{},"fields":{"DBPath":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult/DBPath","kind":"field","type":"string","span":{"start":[121,1],"end":[121,33],"bytes":[3199,3231]}},"Replica":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult/Replica","kind":"field","type":"string","span":{"start":[122,1],"end":[122,33],"bytes":[3232,3264]}},"Socket":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult/Socket","kind":"field","type":"string","span":{"start":[123,1],"end":[123,32],"bytes":[3265,3296]}},"Status":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult/Status","kind":"field","type":"string","span":{"start":[120,1],"end":[120,32],"bytes":[3167,3198]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus":{"id":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus","kind":"function","span":{"start":[126,1],"end":[131,2],"bytes":[3300,3437]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus","parameters":[{"name":"status","type":"string","span":{"start":[126,1],"end":[126,51],"bytes":[3300,3350]}}],"return_type":"string","metrics":{"cyclomatic":2},"body":{}}},"content_hash":"bf7bcf0236ce1cfa7d72cbccf088d6c7625953264d19f1ec781e8b562b17b80e"},"cmd/litestream/replicate.go":{"id":"can://go/litestream/cmd/litestream/replicate.go","kind":"module","span":{"start":[1,1],"end":[576,1],"bytes":[0,18077]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t_ \"net/http/pprof\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\n\t\"github.com/mattn/go-shellwords\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/abs\"\n\t\"github.com/benbjohnson/litestream/file\"\n\t\"github.com/benbjohnson/litestream/gs\"\n\t\"github.com/benbjohnson/litestream/internal\"\n\t\"github.com/benbjohnson/litestream/nats\"\n\t\"github.com/benbjohnson/litestream/oss\"\n\t\"github.com/benbjohnson/litestream/s3\"\n\t\"github.com/benbjohnson/litestream/sftp\"\n)\n\n// ReplicateCommand represents a command that continuously replicates SQLite databases.\ntype ReplicateCommand struct {\n\tcmd *exec.Cmd // subcommand\n\texecCh chan error // subcommand error channel\n\n\t// One-shot replication flags\n\tonce bool // replicate once and exit\n\tforceSnapshot bool // force snapshot to all replicas\n\tenforceRetention bool // enforce retention of old snapshots\n\n\tConfig Config\n\n\t// MCP server\n\tMCP *MCPServer\n\n\t// Server for IPC control commands.\n\tServer *litestream.Server\n\n\t// Manages the set of databases \u0026 compaction levels.\n\tStore *litestream.Store\n\n\t// Directory monitors for dynamic database discovery.\n\tdirectoryMonitors []*DirectoryMonitor\n\n\t// Done channel for interrupt handling during shutdown. When closed,\n\t// the shutdown sync retry loop exits and any in-flight sync is cancelled.\n\tdone \u003c-chan struct{}\n}\n\nfunc NewReplicateCommand() *ReplicateCommand {\n\treturn \u0026ReplicateCommand{\n\t\texecCh: make(chan error),\n\t}\n}\n\n// ParseFlags parses the CLI flags and loads the configuration file.\nfunc (c *ReplicateCommand) ParseFlags(_ context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-replicate\", flag.ContinueOnError)\n\texecFlag := fs.String(\"exec\", \"\", \"execute subcommand\")\n\tlogLevelFlag := fs.String(\"log-level\", \"\", \"log level (trace, debug, info, warn, error)\")\n\trestoreIfDBNotExists := fs.Bool(\"restore-if-db-not-exists\", false, \"restore from replica if database doesn't exist\")\n\tonceFlag := fs.Bool(\"once\", false, \"replicate once and exit\")\n\tforceSnapshotFlag := fs.Bool(\"force-snapshot\", false, \"force snapshot when replicating once\")\n\tenforceRetentionFlag := fs.Bool(\"enforce-retention\", false, \"enforce retention of old snapshots when replicating once\")\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\t// Load configuration or use CLI args to build db/replica.\n\tswitch fs.NArg() {\n\tcase 0:\n\t\t// No arguments provided, use config file\n\t\tif *configPath == \"\" {\n\t\t\t*configPath = DefaultConfigPath()\n\t\t}\n\t\tif c.Config, err = ReadConfigFile(*configPath, !*noExpandEnv); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Override log level if CLI flag provided (takes precedence over env var)\n\t\tif *logLevelFlag != \"\" {\n\t\t\tc.Config.Logging.Level = *logLevelFlag\n\t\t\t// Set env var so initLog sees CLI flag as highest priority\n\t\t\tos.Setenv(\"LOG_LEVEL\", *logLevelFlag)\n\t\t\tlogOutput := os.Stdout\n\t\t\tif c.Config.Logging.Stderr {\n\t\t\t\tlogOutput = os.Stderr\n\t\t\t}\n\t\t\tinternal.InitLog(logOutput, c.Config.Logging.Level, c.Config.Logging.Type, c.Config.Logging.Source)\n\t\t}\n\n\tcase 1:\n\t\t// Only database path provided, missing replica URL\n\t\treturn fmt.Errorf(\"must specify at least one replica URL for %s\", fs.Arg(0))\n\n\tdefault:\n\t\t// Database path and replica URLs provided via CLI\n\t\tif *configPath != \"\" {\n\t\t\treturn fmt.Errorf(\"cannot specify a replica URL and the -config flag\")\n\t\t}\n\n\t\t// Initialize config with defaults when using command-line arguments\n\t\tc.Config = DefaultConfig()\n\t\tlogLevel := \"INFO\"\n\t\tif *logLevelFlag != \"\" {\n\t\t\tlogLevel = *logLevelFlag\n\t\t\t// Set env var so initLog sees CLI flag as highest priority\n\t\t\tos.Setenv(\"LOG_LEVEL\", *logLevelFlag)\n\t\t}\n\t\tc.Config.Logging.Level = logLevel\n\t\tinternal.InitLog(os.Stdout, logLevel, \"text\", false)\n\n\t\tdbConfig := \u0026DBConfig{\n\t\t\tPath: fs.Arg(0),\n\t\t\tRestoreIfDBNotExists: *restoreIfDBNotExists,\n\t\t}\n\t\tfor _, u := range fs.Args()[1:] {\n\t\t\t// Check if this looks like a flag that was placed after positional arguments\n\t\t\tif strings.HasPrefix(u, \"-\") {\n\t\t\t\treturn fmt.Errorf(\"flag %q must be positioned before DB_PATH and REPLICA_URL arguments\", u)\n\t\t\t}\n\t\t\tsyncInterval := litestream.DefaultSyncInterval\n\t\t\tdbConfig.Replicas = append(dbConfig.Replicas, \u0026ReplicaConfig{\n\t\t\t\tURL: u,\n\t\t\t\tReplicaSettings: ReplicaSettings{\n\t\t\t\t\tSyncInterval: \u0026syncInterval,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tc.Config.DBs = []*DBConfig{dbConfig}\n\t}\n\n\tc.Config.ConfigPath = *configPath\n\n\t// Override config exec command, if specified.\n\tif *execFlag != \"\" {\n\t\tc.Config.Exec = *execFlag\n\t}\n\n\t// Apply restore-if-db-not-exists flag to all databases if specified.\n\t// This allows the CLI flag to work with config files.\n\tif *restoreIfDBNotExists {\n\t\tfor _, dbConfig := range c.Config.DBs {\n\t\t\tdbConfig.RestoreIfDBNotExists = true\n\t\t}\n\t}\n\n\t// Set one-shot replication flags and validate their usage.\n\tc.once = *onceFlag\n\tc.forceSnapshot = *forceSnapshotFlag\n\tc.enforceRetention = *enforceRetentionFlag\n\n\t// Validate flag combinations.\n\tif c.once \u0026\u0026 c.Config.Exec != \"\" {\n\t\treturn fmt.Errorf(\"cannot specify -once flag with -exec\")\n\t}\n\tif c.forceSnapshot \u0026\u0026 !c.once {\n\t\treturn fmt.Errorf(\"cannot specify -force-snapshot flag without -once\")\n\t}\n\tif c.enforceRetention \u0026\u0026 !c.once {\n\t\treturn fmt.Errorf(\"cannot specify -enforce-retention flag without -once\")\n\t}\n\n\treturn nil\n}\n\n// Run loads all databases specified in the configuration.\nfunc (c *ReplicateCommand) Run(ctx context.Context) (err error) {\n\t// Display version information.\n\tslog.Info(\"litestream\", \"version\", Version, \"level\", c.Config.Logging.Level)\n\n\t// Start MCP server if enabled\n\tif c.Config.MCPAddr != \"\" {\n\t\tc.MCP, err = NewMCP(ctx, c.Config.ConfigPath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tgo c.MCP.Start(c.Config.MCPAddr)\n\t}\n\n\t// Setup databases.\n\tif len(c.Config.DBs) == 0 {\n\t\tslog.Error(\"no databases specified in configuration\")\n\t}\n\n\t// Attempt restore for databases that need it (before creating DB objects)\n\tfor _, dbConfig := range c.Config.DBs {\n\t\tif dbConfig.RestoreIfDBNotExists \u0026\u0026 dbConfig.Path != \"\" {\n\t\t\tif err := c.restoreIfNeeded(ctx, dbConfig); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\tvar dbs []*litestream.DB\n\tvar watchables []struct {\n\t\tconfig *DBConfig\n\t\tdbs []*litestream.DB\n\t}\n\tfor _, dbConfig := range c.Config.DBs {\n\t\t// Handle directory configuration\n\t\tif dbConfig.Dir != \"\" {\n\t\t\tdirDbs, err := NewDBsFromDirectoryConfig(dbConfig)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdbs = append(dbs, dirDbs...)\n\t\t\tslog.Info(\"found databases in directory\", \"dir\", dbConfig.Dir, \"count\", len(dirDbs), \"watch\", dbConfig.Watch)\n\t\t\tif dbConfig.Watch {\n\t\t\t\twatchables = append(watchables, struct {\n\t\t\t\t\tconfig *DBConfig\n\t\t\t\t\tdbs []*litestream.DB\n\t\t\t\t}{config: dbConfig, dbs: dirDbs})\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle single database configuration\n\t\t\tdb, err := NewDBFromConfig(dbConfig)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdbs = append(dbs, db)\n\t\t}\n\t}\n\n\tlevels := c.Config.CompactionLevels()\n\tc.Store = litestream.NewStore(dbs, levels)\n\n\t// Only override default snapshot interval if explicitly set in config\n\tif c.Config.Snapshot.Interval != nil {\n\t\tc.Store.SnapshotInterval = *c.Config.Snapshot.Interval\n\t}\n\t// Only override default snapshot retention if explicitly set in config\n\tif c.Config.Snapshot.Retention != nil {\n\t\tc.Store.SnapshotRetention = *c.Config.Snapshot.Retention\n\t}\n\tif c.Config.L0Retention != nil {\n\t\tc.Store.SetL0Retention(*c.Config.L0Retention)\n\t}\n\tif c.Config.L0RetentionCheckInterval != nil {\n\t\tc.Store.L0RetentionCheckInterval = *c.Config.L0RetentionCheckInterval\n\t}\n\tif c.Config.ShutdownSyncTimeout != nil {\n\t\tc.Store.SetShutdownSyncTimeout(*c.Config.ShutdownSyncTimeout)\n\t}\n\tif c.Config.ShutdownSyncInterval != nil {\n\t\tc.Store.SetShutdownSyncInterval(*c.Config.ShutdownSyncInterval)\n\t}\n\tif c.Config.VerifyCompaction {\n\t\tc.Store.SetVerifyCompaction(true)\n\t}\n\tif c.Config.Retention.Enabled != nil \u0026\u0026 !*c.Config.Retention.Enabled {\n\t\tc.Store.SetRetentionEnabled(false)\n\t}\n\tif c.Config.Validation.Interval != nil {\n\t\tc.Store.ValidationInterval = *c.Config.Validation.Interval\n\t}\n\tif c.done != nil {\n\t\tc.Store.SetDone(c.done)\n\t}\n\tif c.Config.HeartbeatURL != \"\" {\n\t\tinterval := litestream.DefaultHeartbeatInterval\n\t\tif c.Config.HeartbeatInterval != nil {\n\t\t\tinterval = *c.Config.HeartbeatInterval\n\t\t}\n\t\tc.Store.Heartbeat = litestream.NewHeartbeatClient(c.Config.HeartbeatURL, interval)\n\t}\n\n\t// Disable all background monitors when running once.\n\t// This must be done after config settings are applied.\n\tif c.once {\n\t\tc.Store.CompactionMonitorEnabled = false\n\t\tc.Store.L0RetentionCheckInterval = 0\n\t\tfor _, db := range dbs {\n\t\t\tdb.MonitorInterval = 0\n\t\t\tif db.Replica != nil {\n\t\t\t\tdb.Replica.MonitorEnabled = false\n\t\t\t}\n\t\t}\n\t}\n\n\tif err := c.Store.Open(ctx); err != nil {\n\t\treturn fmt.Errorf(\"cannot open store: %w\", err)\n\t}\n\n\tif !c.Store.RetentionEnabled {\n\t\tslog.Warn(\"retention disabled; cloud provider lifecycle policies must handle retention\",\n\t\t\t\"hint\", \"idle databases that stop receiving writes will not generate new snapshots and may lose backup coverage if cloud retention expires\")\n\t}\n\n\t// Start control server if socket is enabled\n\tif c.Config.Socket.Enabled {\n\t\tc.Server = litestream.NewServer(c.Store)\n\t\tc.Server.SocketPath = c.Config.Socket.Path\n\t\tc.Server.SocketPerms = c.Config.Socket.Permissions\n\t\tc.Server.PathExpander = expand\n\t\tc.Server.Version = Version\n\t\tif err := c.Server.Start(); err != nil {\n\t\t\tslog.Warn(\"failed to start control server\", \"error\", err)\n\t\t}\n\t}\n\n\tfor _, entry := range watchables {\n\t\tmonitor, err := NewDirectoryMonitor(ctx, c.Store, entry.config, entry.dbs)\n\t\tif err != nil {\n\t\t\tfor _, m := range c.directoryMonitors {\n\t\t\t\tm.Close()\n\t\t\t}\n\t\t\tif closeErr := c.Store.Close(ctx); closeErr != nil {\n\t\t\t\tslog.Error(\"failed to close store after monitor failure\", \"error\", closeErr)\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"start directory monitor for %s: %w\", entry.config.Dir, err)\n\t\t}\n\t\tc.directoryMonitors = append(c.directoryMonitors, monitor)\n\t}\n\n\t// Notify user that initialization is done.\n\tfor _, db := range c.Store.DBs() {\n\t\tr := db.Replica\n\t\tslog.Info(\"initialized db\", \"path\", db.Path())\n\t\tslogWith := slog.With(\"type\", r.Client.Type(), \"sync-interval\", r.SyncInterval)\n\t\tswitch client := r.Client.(type) {\n\t\tcase *file.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"path\", client.Path())\n\t\tcase *s3.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.Bucket, \"path\", client.Path, \"region\", client.Region, \"endpoint\", client.Endpoint)\n\t\tcase *gs.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.Bucket, \"path\", client.Path)\n\t\tcase *abs.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.Bucket, \"path\", client.Path, \"endpoint\", client.Endpoint)\n\t\tcase *sftp.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"host\", client.Host, \"user\", client.User, \"path\", client.Path)\n\t\tcase *nats.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.BucketName, \"url\", client.URL)\n\t\tcase *oss.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.Bucket, \"path\", client.Path, \"region\", client.Region)\n\t\tdefault:\n\t\t\tslogWith.Info(\"replicating to\")\n\t\t}\n\t}\n\n\t// Serve metrics over HTTP if enabled.\n\tif c.Config.Addr != \"\" {\n\t\thostport := c.Config.Addr\n\t\tif host, port, _ := net.SplitHostPort(c.Config.Addr); port == \"\" {\n\t\t\treturn fmt.Errorf(\"must specify port for bind address: %q\", c.Config.Addr)\n\t\t} else if host == \"\" {\n\t\t\thostport = net.JoinHostPort(\"localhost\", port)\n\t\t}\n\n\t\tslog.Info(\"serving metrics on\", \"url\", fmt.Sprintf(\"http://%s/metrics\", hostport))\n\t\tgo func() {\n\t\t\thttp.Handle(\"/metrics\", promhttp.Handler())\n\t\t\tif err := http.ListenAndServe(c.Config.Addr, nil); err != nil {\n\t\t\t\tslog.Error(\"cannot start metrics server\", \"error\", err)\n\t\t\t}\n\t\t}()\n\t}\n\n\t// Parse exec commands args \u0026 start subprocess.\n\tif c.Config.Exec != \"\" {\n\t\texecArgs, err := shellwords.Parse(c.Config.Exec)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"cannot parse exec command: %w\", err)\n\t\t}\n\n\t\tc.cmd = exec.CommandContext(ctx, execArgs[0], execArgs[1:]...)\n\t\tc.cmd.Env = os.Environ()\n\t\tc.cmd.Stdout = os.Stdout\n\t\tc.cmd.Stderr = os.Stderr\n\t\tif err := c.cmd.Start(); err != nil {\n\t\t\treturn fmt.Errorf(\"cannot start exec command: %w\", err)\n\t\t}\n\t\tgo func() { c.execCh \u003c- c.cmd.Wait() }()\n\t} else if c.once {\n\t\t// Run one-shot replication in a goroutine so the caller can wait on execCh.\n\t\tgo c.runOnce(ctx)\n\t}\n\n\treturn nil\n}\n\n// runOnce performs one-shot replication for all databases.\n// It syncs all databases, optionally takes snapshots, and enforces retention.\nfunc (c *ReplicateCommand) runOnce(ctx context.Context) {\n\tvar err error\n\tdefer func() { c.execCh \u003c- err }()\n\n\tfor _, db := range c.Store.DBs() {\n\t\tslog.Info(\"syncing database\", \"path\", db.Path())\n\n\t\t// Sync the database to process any pending WAL changes.\n\t\tif err = db.Sync(ctx); err != nil {\n\t\t\terr = fmt.Errorf(\"sync database %s: %w\", db.Path(), err)\n\t\t\treturn\n\t\t}\n\n\t\t// Sync the replica to upload any pending LTX files.\n\t\tif err = db.Replica.Sync(ctx); err != nil {\n\t\t\terr = fmt.Errorf(\"sync replica for %s: %w\", db.Path(), err)\n\t\t\treturn\n\t\t}\n\n\t\t// Force a snapshot if requested.\n\t\tif c.forceSnapshot {\n\t\t\tslog.Info(\"taking snapshot\", \"path\", db.Path())\n\t\t\tif _, err = db.Snapshot(ctx); err != nil {\n\t\t\t\terr = fmt.Errorf(\"snapshot %s: %w\", db.Path(), err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Enforce retention if requested.\n\t\tif c.enforceRetention {\n\t\t\tslog.Info(\"enforcing retention\", \"path\", db.Path())\n\t\t\tif err = c.Store.EnforceSnapshotRetention(ctx, db); err != nil {\n\t\t\t\terr = fmt.Errorf(\"enforce retention for %s: %w\", db.Path(), err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tslog.Info(\"one-shot replication complete\")\n}\n\n// Close closes all open databases.\nfunc (c *ReplicateCommand) Close(ctx context.Context) error {\n\tfor _, monitor := range c.directoryMonitors {\n\t\tmonitor.Close()\n\t}\n\tc.directoryMonitors = nil\n\n\tif c.Server != nil {\n\t\tif err := c.Server.Close(); err != nil {\n\t\t\tslog.Error(\"error closing control server\", \"error\", err)\n\t\t}\n\t}\n\tif c.Store != nil {\n\t\tif err := c.Store.Close(ctx); err != nil {\n\t\t\tif errors.Is(err, litestream.ErrShutdownInterrupted) {\n\t\t\t\tslog.Warn(\"shutdown sync skipped by user interrupt\", \"error\", err)\n\t\t\t} else {\n\t\t\t\tslog.Error(\"failed to close database\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\tif c.Config.MCPAddr != \"\" \u0026\u0026 c.MCP != nil {\n\t\tif err := c.MCP.Close(); err != nil {\n\t\t\tslog.Error(\"error closing MCP server\", \"error\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetDone sets the done channel used for interrupt handling during shutdown.\n// When the channel is closed, the shutdown sync retry loop exits.\nfunc (c *ReplicateCommand) SetDone(done \u003c-chan struct{}) {\n\tc.done = done\n}\n\n// restoreIfNeeded restores a database from its replica if the database doesn't\n// exist and the RestoreIfDBNotExists option is enabled. If no backup exists\n// (first start scenario), it returns nil to allow fresh replication to begin.\nfunc (c *ReplicateCommand) restoreIfNeeded(ctx context.Context, dbConfig *DBConfig) error {\n\tdbPath, err := expand(dbConfig.Path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Skip if database already exists\n\tif _, err := os.Stat(dbPath); !os.IsNotExist(err) {\n\t\tslog.Info(\"database exists, skipping restore\", \"path\", dbPath)\n\t\treturn nil\n\t}\n\n\t// Get replica config (handles both Replica and Replicas fields)\n\tvar rc *ReplicaConfig\n\tif dbConfig.Replica != nil {\n\t\trc = dbConfig.Replica\n\t} else if len(dbConfig.Replicas) \u003e 0 {\n\t\trc = dbConfig.Replicas[0]\n\t} else {\n\t\treturn fmt.Errorf(\"no replica configured for database: %s\", dbPath)\n\t}\n\n\t// Create replica from config (nil db since we're just restoring)\n\tr, err := NewReplicaFromConfig(rc, nil)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot create replica for restore: %w\", err)\n\t}\n\n\t// Attempt restore\n\topt := litestream.NewRestoreOptions()\n\topt.OutputPath = dbPath\n\n\tslog.Info(\"attempting restore before replication\", \"path\", dbPath)\n\tif err := r.Restore(ctx, opt); errors.Is(err, litestream.ErrTxNotAvailable) {\n\t\t// No backup exists yet (first start) - this is OK\n\t\tslog.Info(\"no backup found, starting fresh\", \"path\", dbPath)\n\t\treturn nil\n\t} else if err != nil {\n\t\treturn fmt.Errorf(\"restore failed: %w\", err)\n\t}\n\n\tslog.Info(\"restore completed\", \"path\", dbPath)\n\treturn nil\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *ReplicateCommand) Usage() {\n\tfmt.Printf(`\nThe replicate command starts a server to monitor \u0026 replicate databases.\nYou can specify your database \u0026 replicas in a configuration file or you can\nreplicate a single database file by specifying its path and its replicas in the\ncommand line arguments.\n\nUsage:\n\n\tlitestream replicate [arguments]\n\n\tlitestream replicate [arguments] DB_PATH REPLICA_URL\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-exec CMD\n\t Executes a subcommand. Litestream will exit when the child\n\t process exits. Useful for simple process management.\n\n\t-once\n\t Replicate once and exit. This performs a single sync of all\n\t databases and their replicas, then exits. Cannot be used with -exec.\n\n\t-force-snapshot\n\t Force a snapshot to be taken for all databases. Requires -once.\n\t This is useful for creating a complete backup before maintenance\n\t or when migrating databases between hosts.\n\n\t-enforce-retention\n\t Enforce retention policies for old snapshots. Requires -once.\n\t This removes snapshots that are older than the configured\n\t snapshot retention period.\n\n\t-log-level LEVEL\n\t Sets the log level. Overrides the config file setting.\n\t Valid values: trace, debug, info, warn, error\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\n\t-restore-if-db-not-exists\n\t Restores the database from the replica if it doesn't exist.\n\t On first start with no backup, proceeds normally.\n\nRuntime control commands require the daemon control socket. This includes\nstart, stop, sync, register, unregister, info, and list. Enable it in the config:\n\n\tsocket:\n\t enabled: true\n\t path: /tmp/litestream.sock\n\n`[1:], DefaultConfigPath())\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[34,43]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[44,51]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[52,58]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[59,70]}},{"name":"net","path":"net","span":{"start":[9,1],"end":[9,7],"bytes":[71,77]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[78,89]}},{"name":"pprof","path":"net/http/pprof","alias":"_","span":{"start":[11,1],"end":[11,20],"bytes":[90,109]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[110,115]}},{"name":"exec","path":"os/exec","span":{"start":[13,1],"end":[13,11],"bytes":[116,126]}},{"name":"strings","path":"strings","span":{"start":[14,1],"end":[14,11],"bytes":[127,137]}},{"name":"go-shellwords","path":"github.com/mattn/go-shellwords","span":{"start":[16,1],"end":[16,34],"bytes":[139,172]}},{"name":"promhttp","path":"github.com/prometheus/client_golang/prometheus/promhttp","span":{"start":[17,1],"end":[17,59],"bytes":[173,231]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[19,1],"end":[19,37],"bytes":[233,269]}},{"name":"abs","path":"github.com/benbjohnson/litestream/abs","span":{"start":[20,1],"end":[20,41],"bytes":[270,310]}},{"name":"file","path":"github.com/benbjohnson/litestream/file","span":{"start":[21,1],"end":[21,42],"bytes":[311,352]}},{"name":"gs","path":"github.com/benbjohnson/litestream/gs","span":{"start":[22,1],"end":[22,40],"bytes":[353,392]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[23,1],"end":[23,46],"bytes":[393,438]}},{"name":"nats","path":"github.com/benbjohnson/litestream/nats","span":{"start":[24,1],"end":[24,42],"bytes":[439,480]}},{"name":"oss","path":"github.com/benbjohnson/litestream/oss","span":{"start":[25,1],"end":[25,41],"bytes":[481,521]}},{"name":"s3","path":"github.com/benbjohnson/litestream/s3","span":{"start":[26,1],"end":[26,40],"bytes":[522,561]}},{"name":"sftp","path":"github.com/benbjohnson/litestream/sftp","span":{"start":[27,1],"end":[27,42],"bytes":[562,603]}}],"types":{"ReplicateCommand":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand","kind":"struct","span":{"start":[31,1],"end":[57,2],"bytes":[695,1464]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","kind":"method","span":{"start":[436,1],"end":[462,2],"bytes":[13759,14486]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[436,1],"end":[436,62],"bytes":[13759,13820]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"438:3":{"kind":"call","span":{"start":[438,3],"end":[438,18],"bytes":[13870,13885]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close"},"443:13":{"kind":"call","span":{"start":[443,13],"end":[443,29],"bytes":[13951,13967]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close"},"444:4":{"kind":"call","span":{"start":[444,4],"end":[444,60],"bytes":[13985,14041]},"callee":null},"448:13":{"kind":"call","span":{"start":[448,13],"end":[448,31],"bytes":[14082,14100]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close"},"449:7":{"kind":"call","span":{"start":[449,7],"end":[449,56],"bytes":[14121,14170]},"callee":null},"450:5":{"kind":"call","span":{"start":[450,5],"end":[450,71],"bytes":[14177,14243]},"callee":null},"452:5":{"kind":"call","span":{"start":[452,5],"end":[452,57],"bytes":[14260,14312]},"callee":null},"457:13":{"kind":"call","span":{"start":[457,13],"end":[457,26],"bytes":[14382,14395]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close"},"458:4":{"kind":"call","span":{"start":[458,4],"end":[458,56],"bytes":[14413,14465]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","kind":"method","span":{"start":[66,1],"end":[175,2],"bytes":[1643,5439]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","parameters":[{"name":"_","type":"context.Context","span":{"start":[66,1],"end":[66,86],"bytes":[1643,1728]}},{"name":"args","type":"[]string","span":{"start":[66,1],"end":[66,86],"bytes":[1643,1728]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":20},"body":{"104:10":{"kind":"call","span":{"start":[104,10],"end":[104,79],"bytes":[3285,3354]},"callee":null},"104:69":{"kind":"call","span":{"start":[104,69],"end":[104,78],"bytes":[3344,3353]},"callee":null},"109:11":{"kind":"call","span":{"start":[109,11],"end":[109,74],"bytes":[3454,3517]},"callee":null},"113:14":{"kind":"call","span":{"start":[113,14],"end":[113,29],"bytes":[3607,3622]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig"},"118:4":{"kind":"call","span":{"start":[118,4],"end":[118,41],"bytes":[3765,3802]},"callee":null},"121:3":{"kind":"call","span":{"start":[121,3],"end":[121,55],"bytes":[3845,3897]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"124:26":{"kind":"call","span":{"start":[124,26],"end":[124,35],"bytes":[3949,3958]},"callee":null},"127:21":{"kind":"call","span":{"start":[127,21],"end":[127,30],"bytes":[4032,4041]},"callee":null},"129:7":{"kind":"call","span":{"start":[129,7],"end":[129,32],"bytes":[4135,4160]},"callee":null},"130:12":{"kind":"call","span":{"start":[130,12],"end":[130,96],"bytes":[4174,4258]},"callee":null},"133:24":{"kind":"call","span":{"start":[133,24],"end":[138,6],"bytes":[4337,4475]},"callee":null},"165:10":{"kind":"call","span":{"start":[165,10],"end":[165,60],"bytes":[5147,5197]},"callee":null},"168:10":{"kind":"call","span":{"start":[168,10],"end":[168,73],"bytes":[5243,5306]},"callee":null},"171:10":{"kind":"call","span":{"start":[171,10],"end":[171,76],"bytes":[5355,5421]},"callee":null},"67:8":{"kind":"call","span":{"start":[67,8],"end":[67,69],"bytes":[1736,1797]},"callee":null},"68:14":{"kind":"call","span":{"start":[68,14],"end":[68,57],"bytes":[1811,1854]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"69:18":{"kind":"call","span":{"start":[69,18],"end":[69,91],"bytes":[1872,1945]},"callee":null},"70:26":{"kind":"call","span":{"start":[70,26],"end":[70,118],"bytes":[1971,2063]},"callee":null},"71:14":{"kind":"call","span":{"start":[71,14],"end":[71,63],"bytes":[2077,2126]},"callee":null},"72:23":{"kind":"call","span":{"start":[72,23],"end":[72,95],"bytes":[2149,2221]},"callee":null},"73:26":{"kind":"call","span":{"start":[73,26],"end":[73,121],"bytes":[2247,2342]},"callee":null},"74:29":{"kind":"call","span":{"start":[74,29],"end":[74,51],"bytes":[2371,2393]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"76:12":{"kind":"call","span":{"start":[76,12],"end":[76,26],"bytes":[2425,2439]},"callee":null},"81:9":{"kind":"call","span":{"start":[81,9],"end":[81,18],"bytes":[2539,2548]},"callee":null},"85:18":{"kind":"call","span":{"start":[85,18],"end":[85,37],"bytes":[2646,2665]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"87:22":{"kind":"call","span":{"start":[87,22],"end":[87,64],"bytes":[2691,2733]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"94:4":{"kind":"call","span":{"start":[94,4],"end":[94,41],"bytes":[2978,3015]},"callee":null},"99:4":{"kind":"call","span":{"start":[99,4],"end":[99,103],"bytes":[3108,3207]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","kind":"method","span":{"start":[178,1],"end":[390,2],"bytes":[5500,12474]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[178,1],"end":[178,66],"bytes":[5500,5565]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":53},"body":{"180:2":{"kind":"call","span":{"start":[180,2],"end":[180,78],"bytes":[5600,5676]},"callee":null},"184:16":{"kind":"call","span":{"start":[184,16],"end":[184,48],"bytes":[5754,5786]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP"},"188:6":{"kind":"call","span":{"start":[188,6],"end":[188,35],"bytes":[5828,5857]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start","is_goroutine":true},"192:5":{"kind":"call","span":{"start":[192,5],"end":[192,22],"bytes":[5887,5904]},"callee":null},"193:3":{"kind":"call","span":{"start":[193,3],"end":[193,56],"bytes":[5914,5967]},"callee":null},"199:14":{"kind":"call","span":{"start":[199,14],"end":[199,46],"bytes":[6162,6194]},"callee":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded"},"213:19":{"kind":"call","span":{"start":[213,19],"end":[213,54],"bytes":[6459,6494]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig"},"217:10":{"kind":"call","span":{"start":[217,10],"end":[217,32],"bytes":[6543,6565]},"callee":null},"218:4":{"kind":"call","span":{"start":[218,4],"end":[218,113],"bytes":[6569,6678]},"callee":null},"218:76":{"kind":"call","span":{"start":[218,76],"end":[218,87],"bytes":[6641,6652]},"callee":null},"220:18":{"kind":"call","span":{"start":[220,18],"end":[223,38],"bytes":[6719,6835]},"callee":null},"227:15":{"kind":"call","span":{"start":[227,15],"end":[227,40],"bytes":[6909,6934]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"231:10":{"kind":"call","span":{"start":[231,10],"end":[231,25],"bytes":[6983,6998]},"callee":null},"235:12":{"kind":"call","span":{"start":[235,12],"end":[235,39],"bytes":[7018,7045]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels"},"236:12":{"kind":"call","span":{"start":[236,12],"end":[236,44],"bytes":[7057,7089]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.NewStore"},"247:3":{"kind":"call","span":{"start":[247,3],"end":[247,48],"bytes":[7475,7520]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention"},"253:3":{"kind":"call","span":{"start":[253,3],"end":[253,64],"bytes":[7690,7751]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout"},"256:3":{"kind":"call","span":{"start":[256,3],"end":[256,66],"bytes":[7800,7863]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval"},"259:3":{"kind":"call","span":{"start":[259,3],"end":[259,36],"bytes":[7901,7934]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction"},"262:3":{"kind":"call","span":{"start":[262,3],"end":[262,37],"bytes":[8012,8046]},"callee":null},"268:3":{"kind":"call","span":{"start":[268,3],"end":[268,26],"bytes":[8178,8201]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone"},"275:23":{"kind":"call","span":{"start":[275,23],"end":[275,85],"bytes":[8398,8460]},"callee":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.NewHeartbeatClient"},"291:12":{"kind":"call","span":{"start":[291,12],"end":[291,29],"bytes":[8813,8830]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open"},"292:10":{"kind":"call","span":{"start":[292,10],"end":[292,50],"bytes":[8854,8894]},"callee":null},"296:3":{"kind":"call","span":{"start":[296,3],"end":[297,144],"bytes":[8933,9165]},"callee":null},"302:14":{"kind":"call","span":{"start":[302,14],"end":[302,43],"bytes":[9259,9288]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.NewServer"},"307:13":{"kind":"call","span":{"start":[307,13],"end":[307,29],"bytes":[9461,9477]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start"},"308:4":{"kind":"call","span":{"start":[308,4],"end":[308,61],"bytes":[9495,9552]},"callee":null},"313:19":{"kind":"call","span":{"start":[313,19],"end":[313,77],"bytes":[9615,9673]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor"},"316:5":{"kind":"call","span":{"start":[316,5],"end":[316,14],"bytes":[9739,9748]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close"},"318:19":{"kind":"call","span":{"start":[318,19],"end":[318,37],"bytes":[9772,9790]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close"},"319:5":{"kind":"call","span":{"start":[319,5],"end":[319,81],"bytes":[9814,9890]},"callee":null},"321:11":{"kind":"call","span":{"start":[321,11],"end":[321,82],"bytes":[9906,9977]},"callee":null},"323:25":{"kind":"call","span":{"start":[323,25],"end":[323,61],"bytes":[10006,10042]},"callee":null},"327:21":{"kind":"call","span":{"start":[327,21],"end":[327,34],"bytes":[10112,10125]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"329:3":{"kind":"call","span":{"start":[329,3],"end":[329,49],"bytes":[10148,10194]},"callee":null},"329:39":{"kind":"call","span":{"start":[329,39],"end":[329,48],"bytes":[10184,10193]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"330:15":{"kind":"call","span":{"start":[330,15],"end":[330,82],"bytes":[10209,10276]},"callee":null},"330:33":{"kind":"call","span":{"start":[330,33],"end":[330,48],"bytes":[10227,10242]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"333:4":{"kind":"call","span":{"start":[333,4],"end":[333,58],"bytes":[10345,10399]},"callee":null},"333:44":{"kind":"call","span":{"start":[333,44],"end":[333,57],"bytes":[10385,10398]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Path"},"335:4":{"kind":"call","span":{"start":[335,4],"end":[335,135],"bytes":[10429,10560]},"callee":null},"337:4":{"kind":"call","span":{"start":[337,4],"end":[337,81],"bytes":[10590,10667]},"callee":null},"339:4":{"kind":"call","span":{"start":[339,4],"end":[339,110],"bytes":[10698,10804]},"callee":null},"341:4":{"kind":"call","span":{"start":[341,4],"end":[341,98],"bytes":[10836,10930]},"callee":null},"343:4":{"kind":"call","span":{"start":[343,4],"end":[343,83],"bytes":[10962,11041]},"callee":null},"345:4":{"kind":"call","span":{"start":[345,4],"end":[345,106],"bytes":[11072,11174]},"callee":null},"347:4":{"kind":"call","span":{"start":[347,4],"end":[347,35],"bytes":[11189,11220]},"callee":null},"354:23":{"kind":"call","span":{"start":[354,23],"end":[354,55],"bytes":[11345,11377]},"callee":null},"355:11":{"kind":"call","span":{"start":[355,11],"end":[355,78],"bytes":[11402,11469]},"callee":null},"357:15":{"kind":"call","span":{"start":[357,15],"end":[357,50],"bytes":[11509,11544]},"callee":null},"360:3":{"kind":"call","span":{"start":[360,3],"end":[360,85],"bytes":[11552,11634]},"callee":null},"360:42":{"kind":"call","span":{"start":[360,42],"end":[360,84],"bytes":[11591,11633]},"callee":null},"361:6":{"kind":"call","span":{"start":[361,6],"end":[366,6],"bytes":[11640,11833]},"callee":null,"is_goroutine":true},"371:20":{"kind":"call","span":{"start":[371,20],"end":[371,51],"bytes":[11932,11963]},"callee":null},"373:11":{"kind":"call","span":{"start":[373,11],"end":[373,59],"bytes":[11992,12040]},"callee":null},"376:11":{"kind":"call","span":{"start":[376,11],"end":[376,65],"bytes":[12056,12110]},"callee":null},"377:15":{"kind":"call","span":{"start":[377,15],"end":[377,27],"bytes":[12125,12137]},"callee":null},"380:13":{"kind":"call","span":{"start":[380,13],"end":[380,26],"bytes":[12204,12217]},"callee":null},"381:11":{"kind":"call","span":{"start":[381,11],"end":[381,59],"bytes":[12242,12290]},"callee":null},"383:6":{"kind":"call","span":{"start":[383,6],"end":[383,43],"bytes":[12300,12337]},"callee":null,"is_goroutine":true},"386:6":{"kind":"call","span":{"start":[386,6],"end":[386,20],"bytes":[12442,12456]},"callee":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1","kind":"function","span":{"start":[361,1],"end":[366,6],"bytes":[11635,11833]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1","parameters":[],"body":{"362:28":{"kind":"call","span":{"start":[362,28],"end":[362,46],"bytes":[11676,11694]},"callee":null},"362:4":{"kind":"call","span":{"start":[362,4],"end":[362,47],"bytes":[11652,11695]},"callee":null},"363:14":{"kind":"call","span":{"start":[363,14],"end":[363,53],"bytes":[11709,11748]},"callee":null},"364:5":{"kind":"call","span":{"start":[364,5],"end":[364,60],"bytes":[11767,11822]},"callee":null}}},"closure_2":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_2","kind":"function","span":{"start":[383,1],"end":[383,43],"bytes":[12295,12337]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_2","parameters":[],"body":{"383:27":{"kind":"call","span":{"start":[383,27],"end":[383,39],"bytes":[12321,12333]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone","kind":"method","span":{"start":[466,1],"end":[468,2],"bytes":[14633,14708]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone","parameters":[{"name":"done","type":"\u003c-chan struct{}","span":{"start":[466,1],"end":[466,59],"bytes":[14633,14691]}}],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage","kind":"method","span":{"start":[519,1],"end":[575,2],"bytes":[16313,18076]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"520:2":{"kind":"call","span":{"start":[520,2],"end":[574,28],"bytes":[16351,18074]},"callee":null},"574:8":{"kind":"call","span":{"start":[574,8],"end":[574,27],"bytes":[18054,18073]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","kind":"method","span":{"start":[473,1],"end":[516,2],"bytes":[14946,16268]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[473,1],"end":[473,92],"bytes":[14946,15037]}},{"name":"dbConfig","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[473,1],"end":[473,92],"bytes":[14946,15037]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"474:17":{"kind":"call","span":{"start":[474,17],"end":[474,38],"bytes":[15054,15075]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"480:15":{"kind":"call","span":{"start":[480,15],"end":[480,30],"bytes":[15160,15175]},"callee":null},"480:33":{"kind":"call","span":{"start":[480,33],"end":[480,51],"bytes":[15178,15196]},"callee":null},"481:3":{"kind":"call","span":{"start":[481,3],"end":[481,65],"bytes":[15201,15263]},"callee":null},"489:12":{"kind":"call","span":{"start":[489,12],"end":[489,34],"bytes":[15435,15457]},"callee":null},"492:10":{"kind":"call","span":{"start":[492,10],"end":[492,70],"bytes":[15511,15571]},"callee":null},"496:12":{"kind":"call","span":{"start":[496,12],"end":[496,41],"bytes":[15654,15683]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"},"498:10":{"kind":"call","span":{"start":[498,10],"end":[498,66],"bytes":[15710,15766]},"callee":null},"502:9":{"kind":"call","span":{"start":[502,9],"end":[502,39],"bytes":[15799,15829]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewRestoreOptions"},"505:2":{"kind":"call","span":{"start":[505,2],"end":[505,68],"bytes":[15857,15923]},"callee":null},"506:12":{"kind":"call","span":{"start":[506,12],"end":[506,31],"bytes":[15935,15954]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore"},"506:33":{"kind":"call","span":{"start":[506,33],"end":[506,77],"bytes":[15956,16000]},"callee":null},"508:3":{"kind":"call","span":{"start":[508,3],"end":[508,63],"bytes":[16058,16118]},"callee":null},"511:10":{"kind":"call","span":{"start":[511,10],"end":[511,47],"bytes":[16165,16202]},"callee":null},"514:2":{"kind":"call","span":{"start":[514,2],"end":[514,48],"bytes":[16208,16254]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","kind":"method","span":{"start":[394,1],"end":[433,2],"bytes":[12615,13721]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[394,1],"end":[394,58],"bytes":[12615,12672]}}],"metrics":{"cyclomatic":8},"body":{"396:8":{"kind":"call","span":{"start":[396,8],"end":[396,36],"bytes":[12695,12723]},"callee":null},"398:21":{"kind":"call","span":{"start":[398,21],"end":[398,34],"bytes":[12745,12758]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"399:3":{"kind":"call","span":{"start":[399,3],"end":[399,51],"bytes":[12763,12811]},"callee":null},"399:41":{"kind":"call","span":{"start":[399,41],"end":[399,50],"bytes":[12801,12810]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"402:12":{"kind":"call","span":{"start":[402,12],"end":[402,24],"bytes":[12883,12895]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync"},"403:10":{"kind":"call","span":{"start":[403,10],"end":[403,60],"bytes":[12919,12969]},"callee":null},"403:45":{"kind":"call","span":{"start":[403,45],"end":[403,54],"bytes":[12954,12963]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"408:12":{"kind":"call","span":{"start":[408,12],"end":[408,32],"bytes":[13051,13071]},"callee":null},"409:10":{"kind":"call","span":{"start":[409,10],"end":[409,63],"bytes":[13095,13148]},"callee":null},"409:48":{"kind":"call","span":{"start":[409,48],"end":[409,57],"bytes":[13133,13142]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"415:4":{"kind":"call","span":{"start":[415,4],"end":[415,51],"bytes":[13226,13273]},"callee":null},"415:41":{"kind":"call","span":{"start":[415,41],"end":[415,50],"bytes":[13263,13272]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"416:16":{"kind":"call","span":{"start":[416,16],"end":[416,32],"bytes":[13289,13305]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot"},"417:11":{"kind":"call","span":{"start":[417,11],"end":[417,56],"bytes":[13330,13375]},"callee":null},"417:41":{"kind":"call","span":{"start":[417,41],"end":[417,50],"bytes":[13360,13369]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"424:4":{"kind":"call","span":{"start":[424,4],"end":[424,55],"bytes":[13463,13514]},"callee":null},"424:45":{"kind":"call","span":{"start":[424,45],"end":[424,54],"bytes":[13504,13513]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"425:13":{"kind":"call","span":{"start":[425,13],"end":[425,54],"bytes":[13527,13568]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention"},"426:11":{"kind":"call","span":{"start":[426,11],"end":[426,69],"bytes":[13593,13651]},"callee":null},"426:54":{"kind":"call","span":{"start":[426,54],"end":[426,63],"bytes":[13636,13645]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"432:2":{"kind":"call","span":{"start":[432,2],"end":[432,44],"bytes":[13677,13719]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce.closure_1","kind":"function","span":{"start":[396,1],"end":[396,36],"bytes":[12688,12723]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce.closure_1","parameters":[],"body":{}}}}},"fields":{"Config":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/Config","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.Config","span":{"start":[40,1],"end":[40,15],"bytes":[1007,1021]}},"MCP":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/MCP","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream.MCPServer","span":{"start":[43,1],"end":[43,16],"bytes":[1038,1053]}},"Server":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/Server","kind":"field","type":"*github.com/benbjohnson/litestream.Server","span":{"start":[46,1],"end":[46,27],"bytes":[1092,1118]}},"Store":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/Store","kind":"field","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[49,1],"end":[49,25],"bytes":[1174,1198]}},"cmd":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/cmd","kind":"field","type":"*os/exec.Cmd","span":{"start":[32,1],"end":[32,33],"bytes":[726,758]}},"directoryMonitors":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/directoryMonitors","kind":"field","type":"[]*github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor","span":{"start":[52,1],"end":[52,39],"bytes":[1255,1293]}},"done":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/done","kind":"field","type":"\u003c-chan struct{}","span":{"start":[56,1],"end":[56,22],"bytes":[1441,1462]}},"enforceRetention":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/enforceRetention","kind":"field","type":"bool","span":{"start":[38,1],"end":[38,61],"bytes":[945,1005]}},"execCh":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/execCh","kind":"field","type":"chan error","span":{"start":[33,1],"end":[33,47],"bytes":[759,805]}},"forceSnapshot":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/forceSnapshot","kind":"field","type":"bool","span":{"start":[37,1],"end":[37,57],"bytes":[888,944]}},"once":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/once","kind":"field","type":"bool","span":{"start":[36,1],"end":[36,50],"bytes":[838,887]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand":{"id":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand","kind":"function","span":{"start":[59,1],"end":[63,2],"bytes":[1466,1572]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand","parameters":[],"return_type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand","metrics":{"cyclomatic":1},"body":{"61:11":{"kind":"call","span":{"start":[61,11],"end":[61,27],"bytes":[1550,1566]},"callee":null}}}},"content_hash":"aaa1236d303151b5f8390be24542cffb535b6a3842d7b2142b724ffe9b9f4991"},"cmd/litestream/reset.go":{"id":"can://go/litestream/cmd/litestream/reset.go","kind":"module","span":{"start":[1,1],"end":[190,1],"bytes":[0,4629]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// ResetCommand is a command for resetting local Litestream state for a database.\ntype ResetCommand struct{}\n\n// Run executes the command.\nfunc (c *ResetCommand) Run(ctx context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-reset\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tdryRun := fs.Bool(\"dry-run\", false, \"print local state that would be removed without deleting\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\t// Validate arguments - need exactly one database path\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream reset /path/to/db\",\n\t\t}\n\t} else if fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\t// Make absolute if needed\n\tif !filepath.IsAbs(dbPath) {\n\t\tif dbPath, err = filepath.Abs(dbPath); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Load configuration to find the database (if config exists)\n\tvar dbConfig *DBConfig\n\tif *configPath != \"\" {\n\t\tconfig, configErr := ReadConfigFile(*configPath, !*noExpandEnv)\n\t\tif configErr != nil {\n\t\t\treturn fmt.Errorf(\"cannot read config: %w\", configErr)\n\t\t}\n\n\t\t// Find database config\n\t\tfor _, dbc := range config.DBs {\n\t\t\texpandedPath := dbc.Path\n\t\t\tif !filepath.IsAbs(expandedPath) {\n\t\t\t\texpandedPath, _ = filepath.Abs(expandedPath)\n\t\t\t}\n\t\t\tif expandedPath == dbPath {\n\t\t\t\tdbConfig = dbc\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// If no config found, check if database file exists\n\tif _, err := os.Stat(dbPath); os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"database does not exist: %s\", dbPath)\n\t} else if err != nil {\n\t\treturn fmt.Errorf(\"cannot access database: %w\", err)\n\t}\n\n\t// Create DB instance\n\tvar db *litestream.DB\n\tif dbConfig != nil {\n\t\tdb, err = NewDBFromConfig(dbConfig)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"cannot create database from config: %w\", err)\n\t\t}\n\t} else {\n\t\tdb = litestream.NewDB(dbPath)\n\t}\n\n\t// Check if meta path exists\n\tmetaPath := db.MetaPath()\n\tif _, err := os.Stat(metaPath); os.IsNotExist(err) {\n\t\tfmt.Printf(\"No local state to reset for %s\\n\", dbPath)\n\t\tfmt.Printf(\"Meta directory does not exist: %s\\n\", metaPath)\n\t\treturn nil\n\t}\n\n\tif *dryRun {\n\t\tfiles, err := localLTXFiles(db.LTXDir())\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"dry run failed: %w\", err)\n\t\t}\n\n\t\tfmt.Printf(\"Dry run: local Litestream state would be reset for: %s\\n\", dbPath)\n\t\tfmt.Printf(\"Would remove: %s\\n\", db.LTXDir())\n\t\tif len(files) == 0 {\n\t\t\tfmt.Println(\"No local LTX files would be removed.\")\n\t\t\treturn nil\n\t\t}\n\n\t\tfmt.Println(\"Files that would be removed:\")\n\t\tfor _, file := range files {\n\t\t\tfmt.Printf(\" %s\\n\", file)\n\t\t}\n\t\tfmt.Println(\"No files were removed.\")\n\t\treturn nil\n\t}\n\n\t// Perform the reset\n\tfmt.Printf(\"Resetting local Litestream state for: %s\\n\", dbPath)\n\tfmt.Printf(\"Removing: %s\\n\", db.LTXDir())\n\n\tif err := db.ResetLocalState(ctx); err != nil {\n\t\treturn fmt.Errorf(\"reset failed: %w\", err)\n\t}\n\n\tfmt.Println(\"Reset complete. Next replication sync will create a fresh snapshot.\")\n\treturn nil\n}\n\nfunc localLTXFiles(root string) ([]string, error) {\n\tif _, err := os.Stat(root); os.IsNotExist(err) {\n\t\treturn nil, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar files []string\n\tif err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif d.IsDir() {\n\t\t\treturn nil\n\t\t}\n\t\tfiles = append(files, path)\n\t\treturn nil\n\t}); err != nil {\n\t\treturn nil, err\n\t}\n\treturn files, nil\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *ResetCommand) Usage() {\n\tfmt.Printf(`\nThe reset command clears local Litestream state for a database.\n\nThis is useful for recovering from corrupted or missing LTX files. The reset\nremoves local LTX files from the metadata directory, forcing Litestream to\ncreate a fresh snapshot on the next sync. The database file itself is not\nmodified.\n\nUsage:\n\n\tlitestream reset [arguments] \u003cpath\u003e\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\n\t-dry-run\n\t Print the local LTX files that would be removed without deleting them.\n\nExamples:\n\n\t# Reset local state for a specific database\n\tlitestream reset /path/to/database.db\n\n\t# Preview local files that would be removed\n\tlitestream reset -dry-run /path/to/database.db\n\n\t# Reset using a specific configuration file\n\tlitestream reset -config /etc/litestream.yml /path/to/database.db\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"flag","path":"flag","span":{"start":[5,1],"end":[5,8],"bytes":[34,41]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[42,48]}},{"name":"fs","path":"io/fs","span":{"start":[7,1],"end":[7,9],"bytes":[49,57]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[58,63]}},{"name":"filepath","path":"path/filepath","span":{"start":[9,1],"end":[9,17],"bytes":[64,80]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[11,1],"end":[11,37],"bytes":[82,118]}}],"types":{"ResetCommand":{"id":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand","kind":"struct","span":{"start":[15,1],"end":[15,27],"bytes":[204,230]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run":{"id":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","kind":"method","span":{"start":[18,1],"end":[124,2],"bytes":[261,3146]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[18,1],"end":[18,77],"bytes":[261,337]}},{"name":"args","type":"[]string","span":{"start":[18,1],"end":[18,77],"bytes":[261,337]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":21},"body":{"100:3":{"kind":"call","span":{"start":[100,3],"end":[100,48],"bytes":[2508,2553]},"callee":null},"100:36":{"kind":"call","span":{"start":[100,36],"end":[100,47],"bytes":[2541,2552]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"101:6":{"kind":"call","span":{"start":[101,6],"end":[101,16],"bytes":[2559,2569]},"callee":null},"102:4":{"kind":"call","span":{"start":[102,4],"end":[102,55],"bytes":[2580,2631]},"callee":null},"106:3":{"kind":"call","span":{"start":[106,3],"end":[106,46],"bytes":[2653,2696]},"callee":null},"108:4":{"kind":"call","span":{"start":[108,4],"end":[108,30],"bytes":[2731,2757]},"callee":null},"110:3":{"kind":"call","span":{"start":[110,3],"end":[110,40],"bytes":[2764,2801]},"callee":null},"115:2":{"kind":"call","span":{"start":[115,2],"end":[115,66],"bytes":[2842,2906]},"callee":null},"116:2":{"kind":"call","span":{"start":[116,2],"end":[116,43],"bytes":[2908,2949]},"callee":null},"116:31":{"kind":"call","span":{"start":[116,31],"end":[116,42],"bytes":[2937,2948]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"118:12":{"kind":"call","span":{"start":[118,12],"end":[118,35],"bytes":[2962,2985]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState"},"119:10":{"kind":"call","span":{"start":[119,10],"end":[119,45],"bytes":[3009,3044]},"callee":null},"122:2":{"kind":"call","span":{"start":[122,2],"end":[122,84],"bytes":[3050,3132]},"callee":null},"19:8":{"kind":"call","span":{"start":[19,8],"end":[19,65],"bytes":[345,402]},"callee":null},"20:29":{"kind":"call","span":{"start":[20,29],"end":[20,51],"bytes":[431,453]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,97],"bytes":[465,550]},"callee":null},"23:12":{"kind":"call","span":{"start":[23,12],"end":[23,26],"bytes":[582,596]},"callee":null},"28:5":{"kind":"call","span":{"start":[28,5],"end":[28,14],"bytes":[688,697]},"callee":null},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,21],"bytes":[824,833]},"callee":null},"34:10":{"kind":"call","span":{"start":[34,10],"end":[34,42],"bytes":[849,881]},"callee":null},"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,21],"bytes":[897,906]},"callee":null},"40:6":{"kind":"call","span":{"start":[40,6],"end":[40,28],"bytes":[941,963]},"callee":null},"41:20":{"kind":"call","span":{"start":[41,20],"end":[41,40],"bytes":[985,1005]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool"},"49:24":{"kind":"call","span":{"start":[49,24],"end":[49,66],"bytes":[1176,1218]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"51:11":{"kind":"call","span":{"start":[51,11],"end":[51,58],"bytes":[1253,1300]},"callee":null},"57:8":{"kind":"call","span":{"start":[57,8],"end":[57,36],"bytes":[1402,1430]},"callee":null},"58:23":{"kind":"call","span":{"start":[58,23],"end":[58,49],"bytes":[1455,1481]},"callee":null},"68:15":{"kind":"call","span":{"start":[68,15],"end":[68,30],"bytes":[1628,1643]},"callee":null},"68:32":{"kind":"call","span":{"start":[68,32],"end":[68,50],"bytes":[1645,1663]},"callee":null},"69:10":{"kind":"call","span":{"start":[69,10],"end":[69,59],"bytes":[1675,1724]},"callee":null},"71:10":{"kind":"call","span":{"start":[71,10],"end":[71,55],"bytes":[1758,1803]},"callee":null},"77:13":{"kind":"call","span":{"start":[77,13],"end":[77,38],"bytes":[1888,1913]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"79:11":{"kind":"call","span":{"start":[79,11],"end":[79,68],"bytes":[1942,1999]},"callee":null},"82:8":{"kind":"call","span":{"start":[82,8],"end":[82,32],"bytes":[2021,2045]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB"},"86:14":{"kind":"call","span":{"start":[86,14],"end":[86,27],"bytes":[2093,2106]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath"},"87:15":{"kind":"call","span":{"start":[87,15],"end":[87,32],"bytes":[2121,2138]},"callee":null},"87:34":{"kind":"call","span":{"start":[87,34],"end":[87,52],"bytes":[2140,2158]},"callee":null},"88:3":{"kind":"call","span":{"start":[88,3],"end":[88,57],"bytes":[2163,2217]},"callee":null},"89:3":{"kind":"call","span":{"start":[89,3],"end":[89,62],"bytes":[2220,2279]},"callee":null},"94:17":{"kind":"call","span":{"start":[94,17],"end":[94,43],"bytes":[2327,2353]},"callee":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles"},"94:31":{"kind":"call","span":{"start":[94,31],"end":[94,42],"bytes":[2341,2352]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"96:11":{"kind":"call","span":{"start":[96,11],"end":[96,48],"bytes":[2382,2419]},"callee":null},"99:3":{"kind":"call","span":{"start":[99,3],"end":[99,81],"bytes":[2427,2505]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage":{"id":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage","kind":"method","span":{"start":[150,1],"end":[189,2],"bytes":[3638,4628]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"151:2":{"kind":"call","span":{"start":[151,2],"end":[188,3],"bytes":[3672,4626]},"callee":null},"187:3":{"kind":"call","span":{"start":[187,3],"end":[187,22],"bytes":[4603,4622]},"callee":null}}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles":{"id":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","kind":"function","span":{"start":[126,1],"end":[147,2],"bytes":[3148,3593]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","parameters":[{"name":"root","type":"string","span":{"start":[126,1],"end":[126,52],"bytes":[3148,3199]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"127:15":{"kind":"call","span":{"start":[127,15],"end":[127,28],"bytes":[3214,3227]},"callee":null},"127:30":{"kind":"call","span":{"start":[127,30],"end":[127,48],"bytes":[3229,3247]},"callee":null},"134:12":{"kind":"call","span":{"start":[134,12],"end":[143,4],"bytes":[3345,3537]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles.closure_1","kind":"function","span":{"start":[134,1],"end":[143,18],"bytes":[3334,3551]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[134,1],"end":[134,86],"bytes":[3334,3419]}},{"name":"d","type":"io/fs.DirEntry","span":{"start":[134,1],"end":[134,86],"bytes":[3334,3419]}},{"name":"err","type":"error","span":{"start":[134,1],"end":[134,86],"bytes":[3334,3419]}}],"return_type":"error","error_channel":["error"],"body":{"138:6":{"kind":"call","span":{"start":[138,6],"end":[138,15],"bytes":[3461,3470]},"callee":null},"141:11":{"kind":"call","span":{"start":[141,11],"end":[141,30],"bytes":[3501,3520]},"callee":null}}}}}},"content_hash":"a57b2135a633a6531841eb509f9588a256f6a738aaaaf94ed221c80e70b17ec4"},"cmd/litestream/restore.go":{"id":"can://go/litestream/cmd/litestream/restore.go","kind":"module","span":{"start":[1,1],"end":[454,1],"bytes":[0,13339]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"strconv\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// RestoreCommand represents a command to restore a database from a backup.\ntype RestoreCommand struct{}\n\n// Run executes the command.\nfunc (c *RestoreCommand) Run(ctx context.Context, args []string) (err error) {\n\topt := litestream.NewRestoreOptions()\n\n\tfs := flag.NewFlagSet(\"litestream-restore\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tfs.StringVar(\u0026opt.OutputPath, \"o\", \"\", \"output path\")\n\tfs.Var((*txidVar)(\u0026opt.TXID), \"txid\", \"transaction ID\")\n\tfs.IntVar(\u0026opt.Parallelism, \"parallelism\", opt.Parallelism, \"parallelism\")\n\tifDBNotExists := fs.Bool(\"if-db-not-exists\", false, \"\")\n\tifReplicaExists := fs.Bool(\"if-replica-exists\", false, \"\")\n\ttimestampStr := fs.String(\"timestamp\", \"\", \"timestamp\")\n\tdryRun := fs.Bool(\"dry-run\", false, \"print restore plan without writing\")\n\tforce := fs.Bool(\"force\", false, \"overwrite existing output database\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.BoolVar(\u0026opt.Follow, \"f\", false, \"follow mode\")\n\tfs.DurationVar(\u0026opt.FollowInterval, \"follow-interval\", opt.FollowInterval, \"polling interval for follow mode\")\n\tintegrityCheck := fs.String(\"integrity-check\", \"none\", \"post-restore integrity check: none, quick, or full\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t} else if fs.NArg() == 0 || fs.Arg(0) == \"\" {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path or replica URL required\",\n\t\t\thint: \"litestream restore -o /path/to/db s3://bucket/prefix\",\n\t\t}\n\t} else if fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tlogOutput := os.Stdout\n\tif *jsonOutput {\n\t\tlogOutput = os.Stderr\n\t}\n\tinternal.InitLog(logOutput, \"INFO\", \"text\", false)\n\n\t// When follow mode is enabled, set up signal handling so Ctrl+C stops\n\t// the follow loop cleanly.\n\tif opt.Follow {\n\t\tch := signalChan()\n\t\tcancelCtx, cancel := context.WithCancel(ctx)\n\t\tgo func() {\n\t\t\tselect {\n\t\t\tcase \u003c-ch:\n\t\t\t\tcancel()\n\t\t\tcase \u003c-cancelCtx.Done():\n\t\t\t}\n\t\t}()\n\t\tctx = cancelCtx\n\t\tdefer cancel()\n\t}\n\n\tswitch *integrityCheck {\n\tcase \"none\":\n\t\topt.IntegrityCheck = litestream.IntegrityCheckNone\n\tcase \"quick\":\n\t\topt.IntegrityCheck = litestream.IntegrityCheckQuick\n\tcase \"full\":\n\t\topt.IntegrityCheck = litestream.IntegrityCheckFull\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid -integrity-check value: %s\", *integrityCheck)\n\t}\n\n\t// Parse timestamp, if specified.\n\tif *timestampStr != \"\" {\n\t\tif opt.Timestamp, err = time.Parse(time.RFC3339, *timestampStr); err != nil {\n\t\t\treturn errors.New(\"invalid -timestamp, must specify in ISO 8601 format (e.g. 2000-01-01T00:00:00Z)\")\n\t\t}\n\t}\n\n\t// Determine replica to restore from.\n\tvar r *litestream.Replica\n\tif litestream.IsURL(fs.Arg(0)) {\n\t\tif *configPath != \"\" {\n\t\t\treturn fmt.Errorf(\"cannot specify a replica URL and the -config flag\")\n\t\t}\n\t\tif r, err = c.loadFromURL(ctx, fs.Arg(0), *ifDBNotExists, \u0026opt); errors.Is(err, errSkipDBExists) {\n\t\t\tslog.Info(\"database already exists, skipping\")\n\t\t\treturn nil\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif *configPath == \"\" {\n\t\t\t*configPath = DefaultConfigPath()\n\t\t}\n\t\tif r, err = c.loadFromConfig(ctx, fs.Arg(0), *configPath, !*noExpandEnv, *ifDBNotExists, \u0026opt); errors.Is(err, errSkipDBExists) {\n\t\t\tslog.Info(\"database already exists, skipping\")\n\t\t\treturn nil\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif *dryRun {\n\t\tplan, err := c.dryRunPlan(ctx, fs.Arg(0), r, opt)\n\t\tif errors.Is(err, litestream.ErrTxNotAvailable) {\n\t\t\treturn fmt.Errorf(\"no matching backup files available\")\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif *jsonOutput {\n\t\t\toutput, err := json.MarshalIndent(plan, \"\", \" \")\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t\t}\n\t\t\tfmt.Println(string(output))\n\t\t\treturn nil\n\t\t}\n\t\tc.printDryRunPlan(plan)\n\t\treturn nil\n\t}\n\n\tif !opt.Follow {\n\t\tif err := c.prepareOutputPath(opt.OutputPath, *force); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\ttxid := c.restoreTXID(ctx, r, opt)\n\tstart := time.Now()\n\tif err := r.Restore(ctx, opt); errors.Is(err, litestream.ErrTxNotAvailable) {\n\t\tif *ifReplicaExists {\n\t\t\tslog.Info(\"no matching backups found\")\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"no matching backup files available\")\n\t} else if err != nil {\n\t\treturn err\n\t}\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(RestoreResult{\n\t\t\tDBPath: opt.OutputPath,\n\t\t\tReplica: r.Client.Type(),\n\t\t\tTXID: txid,\n\t\t\tDurationMS: time.Since(start).Milliseconds(),\n\t\t\tIntegrityCheck: *integrityCheck,\n\t\t}, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t}\n\treturn nil\n}\n\ntype RestorePlan struct {\n\tSource string `json:\"source\"`\n\tTargetPath string `json:\"target_path\"`\n\tReplica string `json:\"replica\"`\n\tMinTXID string `json:\"min_txid\"`\n\tMaxTXID string `json:\"max_txid\"`\n\tFiles []RestorePlanFile `json:\"files\"`\n}\n\ntype RestorePlanFile struct {\n\tLevel int `json:\"level\"`\n\tName string `json:\"name\"`\n\tMinTXID string `json:\"min_txid\"`\n\tMaxTXID string `json:\"max_txid\"`\n\tSize int64 `json:\"size\"`\n\tTimestamp string `json:\"timestamp\"`\n}\n\ntype RestoreResult struct {\n\tDBPath string `json:\"db_path\"`\n\tReplica string `json:\"replica\"`\n\tTXID string `json:\"txid\"`\n\tDurationMS int64 `json:\"duration_ms\"`\n\tIntegrityCheck string `json:\"integrity_check\"`\n}\n\nfunc (c *RestoreCommand) dryRunPlan(ctx context.Context, source string, r *litestream.Replica, opt litestream.RestoreOptions) (RestorePlan, error) {\n\tif opt.Follow {\n\t\treturn RestorePlan{}, fmt.Errorf(\"cannot use -dry-run with -f\")\n\t}\n\n\tinfos, err := litestream.CalcRestorePlan(ctx, r.Client, opt.TXID, opt.Timestamp, r.Logger())\n\tif err != nil {\n\t\treturn RestorePlan{}, err\n\t}\n\tif len(infos) == 0 {\n\t\treturn RestorePlan{}, litestream.ErrTxNotAvailable\n\t}\n\n\tplan := RestorePlan{\n\t\tSource: source,\n\t\tTargetPath: opt.OutputPath,\n\t\tReplica: r.Client.Type(),\n\t\tMinTXID: infos[0].MinTXID.String(),\n\t\tMaxTXID: infos[len(infos)-1].MaxTXID.String(),\n\t\tFiles: make([]RestorePlanFile, 0, len(infos)),\n\t}\n\tfor _, info := range infos {\n\t\tplan.Files = append(plan.Files, RestorePlanFile{\n\t\t\tLevel: info.Level,\n\t\t\tName: ltx.FormatFilename(info.MinTXID, info.MaxTXID),\n\t\t\tMinTXID: info.MinTXID.String(),\n\t\t\tMaxTXID: info.MaxTXID.String(),\n\t\t\tSize: info.Size,\n\t\t\tTimestamp: info.CreatedAt.Format(time.RFC3339),\n\t\t})\n\t}\n\treturn plan, nil\n}\n\nfunc (c *RestoreCommand) printDryRunPlan(plan RestorePlan) {\n\tfmt.Println(\"Restore plan:\")\n\tfmt.Printf(\" source: %s\\n\", plan.Source)\n\tfmt.Printf(\" target: %s\\n\", plan.TargetPath)\n\tfmt.Printf(\" replica: %s\\n\", plan.Replica)\n\tfmt.Printf(\" txid range: %s - %s\\n\", plan.MinTXID, plan.MaxTXID)\n\tfmt.Println()\n\tfmt.Println(\"Files to fetch:\")\n\n\tw := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)\n\tdefer w.Flush()\n\tfmt.Fprintln(w, \"level\\tfile\\tmin_txid\\tmax_txid\\tsize\\ttimestamp\")\n\tfor _, file := range plan.Files {\n\t\tfmt.Fprintf(w, \"%d\\t%s\\t%s\\t%s\\t%d\\t%s\\n\",\n\t\t\tfile.Level,\n\t\t\tfile.Name,\n\t\t\tfile.MinTXID,\n\t\t\tfile.MaxTXID,\n\t\t\tfile.Size,\n\t\t\tfile.Timestamp,\n\t\t)\n\t}\n}\n\nfunc (c *RestoreCommand) restoreTXID(ctx context.Context, r *litestream.Replica, opt litestream.RestoreOptions) string {\n\tif opt.TXID != 0 {\n\t\treturn opt.TXID.String()\n\t}\n\tif opt.Follow {\n\t\treturn \"\"\n\t}\n\tinfos, err := litestream.CalcRestorePlan(ctx, r.Client, opt.TXID, opt.Timestamp, r.Logger())\n\tif err != nil || len(infos) == 0 {\n\t\treturn \"\"\n\t}\n\treturn infos[len(infos)-1].MaxTXID.String()\n}\n\nfunc (c *RestoreCommand) prepareOutputPath(path string, force bool) error {\n\tinfo, err := os.Stat(path)\n\tif os.IsNotExist(err) {\n\t\treturn nil\n\t} else if err != nil {\n\t\treturn fmt.Errorf(\"cannot access output path: %w\", err)\n\t}\n\tif info.IsDir() {\n\t\treturn fmt.Errorf(\"cannot restore, output path is a directory: %s\", path)\n\t}\n\n\tif info.Size() \u003e 0 \u0026\u0026 !force {\n\t\treturn fmt.Errorf(\"cannot restore, output path already exists and is not empty: %s. Use -force to overwrite\", path)\n\t}\n\n\tfor _, sidecarPath := range []string{path + \"-wal\", path + \"-shm\", path + \"-journal\"} {\n\t\tif _, err := os.Stat(sidecarPath); err == nil \u0026\u0026 !force {\n\t\t\treturn fmt.Errorf(\"cannot restore, SQLite sidecar path already exists: %s. Use -force to overwrite\", sidecarPath)\n\t\t} else if err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"cannot access SQLite sidecar path: %w\", err)\n\t\t}\n\t}\n\n\tfor _, removePath := range []string{path, path + \"-wal\", path + \"-shm\", path + \"-journal\"} {\n\t\tif err := os.Remove(removePath); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"remove existing output path: %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// loadFromURL creates a replica \u0026 updates the restore options from a replica URL.\nfunc (c *RestoreCommand) loadFromURL(ctx context.Context, replicaURL string, ifDBNotExists bool, opt *litestream.RestoreOptions) (*litestream.Replica, error) {\n\tif opt.OutputPath == \"\" {\n\t\treturn nil, \u0026usageError{\n\t\t\tmessage: \"-o is required when restoring from a replica URL\",\n\t\t\thint: fmt.Sprintf(\"litestream restore -o /path/to/db %s\", replicaURL),\n\t\t}\n\t}\n\n\t// Exit successfully if the output file already exists.\n\tif _, err := os.Stat(opt.OutputPath); !os.IsNotExist(err) \u0026\u0026 ifDBNotExists {\n\t\treturn nil, errSkipDBExists\n\t}\n\n\tsyncInterval := litestream.DefaultSyncInterval\n\tr, err := NewReplicaFromConfig(\u0026ReplicaConfig{\n\t\tURL: replicaURL,\n\t\tReplicaSettings: ReplicaSettings{\n\t\t\tSyncInterval: \u0026syncInterval,\n\t\t},\n\t}, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t_, err = r.CalcRestoreTarget(ctx, *opt)\n\treturn r, err\n}\n\n// loadFromConfig returns a replica \u0026 updates the restore options from a DB reference.\nfunc (c *RestoreCommand) loadFromConfig(_ context.Context, dbPath, configPath string, expandEnv, ifDBNotExists bool, opt *litestream.RestoreOptions) (*litestream.Replica, error) {\n\t// Load configuration.\n\tconfig, err := ReadConfigFile(configPath, expandEnv)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Lookup database from configuration file by path.\n\tif dbPath, err = expand(dbPath); err != nil {\n\t\treturn nil, err\n\t}\n\tdbConfig := config.DBConfig(dbPath)\n\tif dbConfig == nil {\n\t\treturn nil, fmt.Errorf(\"database not found in config: %s\", dbPath)\n\t}\n\tdb, err := NewDBFromConfig(dbConfig)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Restore into original database path if not specified.\n\tif opt.OutputPath == \"\" {\n\t\topt.OutputPath = dbPath\n\t}\n\n\t// Exit successfully if the output file already exists.\n\tif _, err := os.Stat(opt.OutputPath); !os.IsNotExist(err) \u0026\u0026 ifDBNotExists {\n\t\treturn nil, errSkipDBExists\n\t}\n\n\treturn db.Replica, nil\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *RestoreCommand) Usage() {\n\tfmt.Printf(`\nThe restore command recovers a database from a previous snapshot and WAL.\n\nUsage:\n\n\tlitestream restore [arguments] DB_PATH\n\n\tlitestream restore [arguments] REPLICA_URL\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\n\t-txid TXID\n\t Restore up to a specific hex-encoded transaction ID (inclusive).\n\t Defaults to use the highest available transaction.\n\n\t-timestamp TIMESTAMP\n\t Restore to a specific point-in-time.\n\t Defaults to use the latest available backup.\n\n\t-o PATH\n\t Output path of the restored database.\n\t Defaults to original DB path.\n\n\t-if-db-not-exists\n\t Returns exit code of 0 if the database already exists.\n\n\t-if-replica-exists\n\t Returns exit code of 0 if no backups found.\n\n\t-dry-run\n\t Print the restore plan and exit without writing a database.\n\n\t-force\n\t Overwrite an existing output database and SQLite sidecar files.\n\n\t-json\n\t Output raw JSON summary on successful restore.\n\n\t-f\n\t Follow mode. After restoring, continuously poll for and apply\n\t new changes. Similar to tail -f. The restored database should\n\t only be opened in read-only mode by consumers.\n\t Cannot be used with -txid or -timestamp.\n\n\t-follow-interval DURATION\n\t Polling interval for follow mode.\n\t Defaults to 1s.\n\n\t-parallelism NUM\n\t Determines the number of WAL files downloaded in parallel.\n\t Defaults to `+strconv.Itoa(litestream.DefaultRestoreParallelism)+`.\n\n\t-integrity-check MODE\n\t Run a post-restore integrity check on the database.\n\t MODE is one of: none, quick, full.\n\t Defaults to none.\n\n\nExamples:\n\n\t# Restore latest replica for database to original location.\n\t$ litestream restore /path/to/db\n\n\t# Restore replica for database to a given point in time.\n\t$ litestream restore -timestamp 2020-01-01T00:00:00Z /path/to/db\n\n\t# Restore latest replica for database to new /tmp directory\n\t$ litestream restore -o /tmp/db /path/to/db\n\n\t# Restore database from S3 replica URL.\n\t$ litestream restore -o /tmp/db s3://mybucket/db\n\n\t# Preview restore plan without writing a database.\n\t$ litestream restore -dry-run -o /tmp/db s3://mybucket/db\n\n\t# Continuously restore (follow) a database from a replica.\n\t$ litestream restore -f -o /tmp/read-replica.db s3://mybucket/db\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n\nvar errSkipDBExists = errors.New(\"database already exists, skipping\")\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[51,60]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[61,68]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[69,75]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[76,87]}},{"name":"os","path":"os","span":{"start":[10,1],"end":[10,6],"bytes":[88,93]}},{"name":"strconv","path":"strconv","span":{"start":[11,1],"end":[11,11],"bytes":[94,104]}},{"name":"tabwriter","path":"text/tabwriter","span":{"start":[12,1],"end":[12,18],"bytes":[105,122]}},{"name":"time","path":"time","span":{"start":[13,1],"end":[13,8],"bytes":[123,130]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[15,1],"end":[15,27],"bytes":[132,158]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[17,1],"end":[17,37],"bytes":[160,196]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[18,1],"end":[18,46],"bytes":[197,242]}}],"types":{"RestoreCommand":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand","kind":"struct","span":{"start":[22,1],"end":[22,29],"bytes":[322,350]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","kind":"method","span":{"start":[25,1],"end":[168,2],"bytes":[381,4831]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[25,1],"end":[25,79],"bytes":[381,459]}},{"name":"args","type":"[]string","span":{"start":[25,1],"end":[25,79],"bytes":[381,459]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":35},"body":{"100:15":{"kind":"call","span":{"start":[100,15],"end":[100,66],"bytes":[3026,3077]},"callee":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL"},"100:34":{"kind":"call","span":{"start":[100,34],"end":[100,43],"bytes":[3045,3054]},"callee":null},"100:68":{"kind":"call","span":{"start":[100,68],"end":[100,99],"bytes":[3079,3110]},"callee":null},"101:4":{"kind":"call","span":{"start":[101,4],"end":[101,50],"bytes":[3116,3162]},"callee":null},"108:18":{"kind":"call","span":{"start":[108,18],"end":[108,37],"bytes":[3272,3291]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"110:15":{"kind":"call","span":{"start":[110,15],"end":[110,97],"bytes":[3310,3392]},"callee":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig"},"110:37":{"kind":"call","span":{"start":[110,37],"end":[110,46],"bytes":[3332,3341]},"callee":null},"110:99":{"kind":"call","span":{"start":[110,99],"end":[110,130],"bytes":[3394,3425]},"callee":null},"111:4":{"kind":"call","span":{"start":[111,4],"end":[111,50],"bytes":[3431,3477]},"callee":null},"119:16":{"kind":"call","span":{"start":[119,16],"end":[119,52],"bytes":[3568,3604]},"callee":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan"},"119:34":{"kind":"call","span":{"start":[119,34],"end":[119,43],"bytes":[3586,3595]},"callee":null},"120:6":{"kind":"call","span":{"start":[120,6],"end":[120,50],"bytes":[3610,3654]},"callee":null},"121:11":{"kind":"call","span":{"start":[121,11],"end":[121,59],"bytes":[3667,3715]},"callee":null},"126:19":{"kind":"call","span":{"start":[126,19],"end":[126,53],"bytes":[3796,3830]},"callee":null},"128:12":{"kind":"call","span":{"start":[128,12],"end":[128,60],"bytes":[3861,3909]},"callee":null},"130:16":{"kind":"call","span":{"start":[130,16],"end":[130,30],"bytes":[3930,3944]},"callee":null},"130:4":{"kind":"call","span":{"start":[130,4],"end":[130,31],"bytes":[3918,3945]},"callee":null},"133:3":{"kind":"call","span":{"start":[133,3],"end":[133,26],"bytes":[3966,3989]},"callee":null},"138:13":{"kind":"call","span":{"start":[138,13],"end":[138,56],"bytes":[4037,4080]},"callee":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath"},"143:10":{"kind":"call","span":{"start":[143,10],"end":[143,36],"bytes":[4126,4152]},"callee":null},"144:11":{"kind":"call","span":{"start":[144,11],"end":[144,21],"bytes":[4163,4173]},"callee":null},"145:12":{"kind":"call","span":{"start":[145,12],"end":[145,31],"bytes":[4185,4204]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore"},"145:33":{"kind":"call","span":{"start":[145,33],"end":[145,77],"bytes":[4206,4250]},"callee":null},"147:4":{"kind":"call","span":{"start":[147,4],"end":[147,42],"bytes":[4280,4318]},"callee":null},"150:10":{"kind":"call","span":{"start":[150,10],"end":[150,58],"bytes":[4346,4394]},"callee":null},"155:18":{"kind":"call","span":{"start":[155,18],"end":[161,15],"bytes":[4470,4703]},"callee":null},"157:20":{"kind":"call","span":{"start":[157,20],"end":[157,35],"bytes":[4558,4573]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"159:20":{"kind":"call","span":{"start":[159,20],"end":[159,37],"bytes":[4619,4636]},"callee":null},"163:11":{"kind":"call","span":{"start":[163,11],"end":[163,59],"bytes":[4732,4780]},"callee":null},"165:15":{"kind":"call","span":{"start":[165,15],"end":[165,29],"bytes":[4799,4813]},"callee":null},"165:3":{"kind":"call","span":{"start":[165,3],"end":[165,30],"bytes":[4787,4814]},"callee":null},"26:9":{"kind":"call","span":{"start":[26,9],"end":[26,39],"bytes":[468,498]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewRestoreOptions"},"28:8":{"kind":"call","span":{"start":[28,8],"end":[28,67],"bytes":[507,566]},"callee":null},"29:29":{"kind":"call","span":{"start":[29,29],"end":[29,51],"bytes":[595,617]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"30:2":{"kind":"call","span":{"start":[30,2],"end":[30,55],"bytes":[619,672]},"callee":null},"31:2":{"kind":"call","span":{"start":[31,2],"end":[31,57],"bytes":[674,729]},"callee":null},"31:9":{"kind":"call","span":{"start":[31,9],"end":[31,30],"bytes":[681,702]},"callee":null},"32:2":{"kind":"call","span":{"start":[32,2],"end":[32,76],"bytes":[731,805]},"callee":null},"33:19":{"kind":"call","span":{"start":[33,19],"end":[33,57],"bytes":[824,862]},"callee":null},"34:21":{"kind":"call","span":{"start":[34,21],"end":[34,60],"bytes":[883,922]},"callee":null},"35:18":{"kind":"call","span":{"start":[35,18],"end":[35,57],"bytes":[940,979]},"callee":null},"36:12":{"kind":"call","span":{"start":[36,12],"end":[36,75],"bytes":[991,1054]},"callee":null},"37:11":{"kind":"call","span":{"start":[37,11],"end":[37,72],"bytes":[1065,1126]},"callee":null},"38:16":{"kind":"call","span":{"start":[38,16],"end":[38,57],"bytes":[1142,1183]},"callee":null},"39:2":{"kind":"call","span":{"start":[39,2],"end":[39,52],"bytes":[1185,1235]},"callee":null},"40:2":{"kind":"call","span":{"start":[40,2],"end":[40,112],"bytes":[1237,1347]},"callee":null},"41:20":{"kind":"call","span":{"start":[41,20],"end":[41,110],"bytes":[1367,1457]},"callee":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool"},"43:12":{"kind":"call","span":{"start":[43,12],"end":[43,26],"bytes":[1489,1503]},"callee":null},"45:12":{"kind":"call","span":{"start":[45,12],"end":[45,21],"bytes":[1542,1551]},"callee":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion"},"45:30":{"kind":"call","span":{"start":[45,30],"end":[45,39],"bytes":[1560,1569]},"callee":null},"50:12":{"kind":"call","span":{"start":[50,12],"end":[50,21],"bytes":[1736,1745]},"callee":null},"51:10":{"kind":"call","span":{"start":[51,10],"end":[51,42],"bytes":[1761,1793]},"callee":null},"58:2":{"kind":"call","span":{"start":[58,2],"end":[58,52],"bytes":[1868,1918]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"63:9":{"kind":"call","span":{"start":[63,9],"end":[63,21],"bytes":[2046,2058]},"callee":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan"},"64:24":{"kind":"call","span":{"start":[64,24],"end":[64,47],"bytes":[2082,2105]},"callee":null},"65:6":{"kind":"call","span":{"start":[65,6],"end":[71,6],"bytes":[2111,2197]},"callee":null,"is_goroutine":true},"73:9":{"kind":"call","span":{"start":[73,9],"end":[73,17],"bytes":[2224,2232]},"callee":null},"84:10":{"kind":"call","span":{"start":[84,10],"end":[84,75],"bytes":[2485,2550]},"callee":null},"89:27":{"kind":"call","span":{"start":[89,27],"end":[89,66],"bytes":[2642,2681]},"callee":null},"90:11":{"kind":"call","span":{"start":[90,11],"end":[90,105],"bytes":[2706,2800]},"callee":null},"96:22":{"kind":"call","span":{"start":[96,22],"end":[96,31],"bytes":[2896,2905]},"callee":null},"96:5":{"kind":"call","span":{"start":[96,5],"end":[96,32],"bytes":[2879,2906]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL"},"98:11":{"kind":"call","span":{"start":[98,11],"end":[98,74],"bytes":[2944,3007]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run.closure_1","kind":"function","span":{"start":[65,1],"end":[71,6],"bytes":[2106,2197]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run.closure_1","parameters":[],"body":{"68:5":{"kind":"call","span":{"start":[68,5],"end":[68,13],"bytes":[2150,2158]},"callee":null},"69:11":{"kind":"call","span":{"start":[69,11],"end":[69,27],"bytes":[2169,2185]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage","kind":"method","span":{"start":[362,1],"end":[451,2],"bytes":[10842,13267]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"363:2":{"kind":"call","span":{"start":[363,2],"end":[450,3],"bytes":[10878,13265]},"callee":null},"420:20":{"kind":"call","span":{"start":[420,20],"end":[420,70],"bytes":[12363,12413]},"callee":null},"449:3":{"kind":"call","span":{"start":[449,3],"end":[449,22],"bytes":[13242,13261]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","kind":"method","span":{"start":[196,1],"end":[228,2],"bytes":[5626,6684]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[196,1],"end":[196,149],"bytes":[5626,5774]}},{"name":"source","type":"string","span":{"start":[196,1],"end":[196,149],"bytes":[5626,5774]}},{"name":"r","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[196,1],"end":[196,149],"bytes":[5626,5774]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[196,1],"end":[196,149],"bytes":[5626,5774]}}],"return_type":"(github.com/benbjohnson/litestream/cmd/litestream.RestorePlan, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"198:25":{"kind":"call","span":{"start":[198,25],"end":[198,66],"bytes":[5816,5857]},"callee":null},"201:16":{"kind":"call","span":{"start":[201,16],"end":[201,94],"bytes":[5877,5955]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan"},"201:83":{"kind":"call","span":{"start":[201,83],"end":[201,93],"bytes":[5944,5954]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"205:5":{"kind":"call","span":{"start":[205,5],"end":[205,15],"bytes":[6008,6018]},"callee":null},"212:15":{"kind":"call","span":{"start":[212,15],"end":[212,30],"bytes":[6171,6186]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"213:15":{"kind":"call","span":{"start":[213,15],"end":[213,40],"bytes":[6202,6227]},"callee":null},"214:15":{"kind":"call","span":{"start":[214,15],"end":[214,51],"bytes":[6243,6279]},"callee":null},"214:21":{"kind":"call","span":{"start":[214,21],"end":[214,31],"bytes":[6249,6259]},"callee":null},"215:15":{"kind":"call","span":{"start":[215,15],"end":[215,53],"bytes":[6295,6333]},"callee":null},"215:42":{"kind":"call","span":{"start":[215,42],"end":[215,52],"bytes":[6322,6332]},"callee":null},"218:16":{"kind":"call","span":{"start":[218,16],"end":[225,5],"bytes":[6383,6661]},"callee":null},"220:15":{"kind":"call","span":{"start":[220,15],"end":[220,61],"bytes":[6459,6505]},"callee":null},"221:15":{"kind":"call","span":{"start":[221,15],"end":[221,36],"bytes":[6521,6542]},"callee":null},"222:15":{"kind":"call","span":{"start":[222,15],"end":[222,36],"bytes":[6558,6579]},"callee":null},"224:15":{"kind":"call","span":{"start":[224,15],"end":[224,50],"bytes":[6620,6655]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","kind":"method","span":{"start":[328,1],"end":[359,2],"bytes":[9862,10797]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","parameters":[{"name":"_","type":"context.Context","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"dbPath","type":"string","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"configPath","type":"string","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"expandEnv","type":"bool","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"ifDBNotExists","type":"bool","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"opt","type":"*github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}}],"return_type":"(*github.com/benbjohnson/litestream.Replica, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"330:17":{"kind":"call","span":{"start":[330,17],"end":[330,54],"bytes":[10082,10119]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"336:19":{"kind":"call","span":{"start":[336,19],"end":[336,33],"bytes":[10230,10244]},"callee":null},"339:14":{"kind":"call","span":{"start":[339,14],"end":[339,37],"bytes":[10293,10316]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig"},"341:15":{"kind":"call","span":{"start":[341,15],"end":[341,69],"bytes":[10353,10407]},"callee":null},"343:13":{"kind":"call","span":{"start":[343,13],"end":[343,38],"bytes":[10423,10448]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"354:15":{"kind":"call","span":{"start":[354,15],"end":[354,38],"bytes":[10674,10697]},"callee":null},"354:41":{"kind":"call","span":{"start":[354,41],"end":[354,59],"bytes":[10700,10718]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","kind":"method","span":{"start":[300,1],"end":[325,2],"bytes":[8949,9773]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[300,1],"end":[300,160],"bytes":[8949,9108]}},{"name":"replicaURL","type":"string","span":{"start":[300,1],"end":[300,160],"bytes":[8949,9108]}},{"name":"ifDBNotExists","type":"bool","span":{"start":[300,1],"end":[300,160],"bytes":[8949,9108]}},{"name":"opt","type":"*github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[300,1],"end":[300,160],"bytes":[8949,9108]}}],"return_type":"(*github.com/benbjohnson/litestream.Replica, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"304:13":{"kind":"call","span":{"start":[304,13],"end":[304,76],"bytes":[9239,9302]},"callee":null},"309:15":{"kind":"call","span":{"start":[309,15],"end":[309,38],"bytes":[9383,9406]},"callee":null},"309:41":{"kind":"call","span":{"start":[309,41],"end":[309,59],"bytes":[9409,9427]},"callee":null},"314:12":{"kind":"call","span":{"start":[314,12],"end":[319,9],"bytes":[9540,9677]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"},"323:11":{"kind":"call","span":{"start":[323,11],"end":[323,41],"bytes":[9726,9756]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget"}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","kind":"method","span":{"start":[268,1],"end":[297,2],"bytes":[7749,8864]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","parameters":[{"name":"path","type":"string","span":{"start":[268,1],"end":[268,76],"bytes":[7749,7824]}},{"name":"force","type":"bool","span":{"start":[268,1],"end":[268,76],"bytes":[7749,7824]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"269:15":{"kind":"call","span":{"start":[269,15],"end":[269,28],"bytes":[7839,7852]},"callee":null},"270:5":{"kind":"call","span":{"start":[270,5],"end":[270,23],"bytes":[7857,7875]},"callee":null},"273:10":{"kind":"call","span":{"start":[273,10],"end":[273,58],"bytes":[7924,7972]},"callee":null},"275:5":{"kind":"call","span":{"start":[275,5],"end":[275,17],"bytes":[7980,7992]},"callee":null},"276:10":{"kind":"call","span":{"start":[276,10],"end":[276,76],"bytes":[8004,8070]},"callee":null},"279:5":{"kind":"call","span":{"start":[279,5],"end":[279,16],"bytes":[8079,8090]},"callee":null},"280:10":{"kind":"call","span":{"start":[280,10],"end":[280,118],"bytes":[8116,8224]},"callee":null},"284:16":{"kind":"call","span":{"start":[284,16],"end":[284,36],"bytes":[8333,8353]},"callee":null},"285:11":{"kind":"call","span":{"start":[285,11],"end":[285,117],"bytes":[8388,8494]},"callee":null},"286:28":{"kind":"call","span":{"start":[286,28],"end":[286,46],"bytes":[8522,8540]},"callee":null},"287:11":{"kind":"call","span":{"start":[287,11],"end":[287,67],"bytes":[8553,8609]},"callee":null},"292:13":{"kind":"call","span":{"start":[292,13],"end":[292,34],"bytes":[8724,8745]},"callee":null},"292:51":{"kind":"call","span":{"start":[292,51],"end":[292,69],"bytes":[8762,8780]},"callee":null},"293:11":{"kind":"call","span":{"start":[293,11],"end":[293,61],"bytes":[8793,8843]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","kind":"method","span":{"start":[230,1],"end":[252,2],"bytes":[6686,7351]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","parameters":[{"name":"plan","type":"github.com/benbjohnson/litestream/cmd/litestream.RestorePlan","span":{"start":[230,1],"end":[230,61],"bytes":[6686,6746]}}],"metrics":{"cyclomatic":2},"body":{"231:2":{"kind":"call","span":{"start":[231,2],"end":[231,30],"bytes":[6748,6776]},"callee":null},"232:2":{"kind":"call","span":{"start":[232,2],"end":[232,43],"bytes":[6778,6819]},"callee":null},"233:2":{"kind":"call","span":{"start":[233,2],"end":[233,47],"bytes":[6821,6866]},"callee":null},"234:2":{"kind":"call","span":{"start":[234,2],"end":[234,45],"bytes":[6868,6911]},"callee":null},"235:2":{"kind":"call","span":{"start":[235,2],"end":[235,67],"bytes":[6913,6978]},"callee":null},"236:2":{"kind":"call","span":{"start":[236,2],"end":[236,15],"bytes":[6980,6993]},"callee":null},"237:2":{"kind":"call","span":{"start":[237,2],"end":[237,32],"bytes":[6995,7025]},"callee":null},"239:7":{"kind":"call","span":{"start":[239,7],"end":[239,54],"bytes":[7033,7080]},"callee":null},"240:8":{"kind":"call","span":{"start":[240,8],"end":[240,17],"bytes":[7088,7097]},"callee":null},"241:2":{"kind":"call","span":{"start":[241,2],"end":[241,69],"bytes":[7099,7166]},"callee":null},"243:3":{"kind":"call","span":{"start":[243,3],"end":[250,4],"bytes":[7204,7346]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","kind":"method","span":{"start":[254,1],"end":[266,2],"bytes":[7353,7747]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[254,1],"end":[254,121],"bytes":[7353,7473]}},{"name":"r","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[254,1],"end":[254,121],"bytes":[7353,7473]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[254,1],"end":[254,121],"bytes":[7353,7473]}}],"return_type":"string","metrics":{"cyclomatic":4},"body":{"256:10":{"kind":"call","span":{"start":[256,10],"end":[256,27],"bytes":[7503,7520]},"callee":null},"261:16":{"kind":"call","span":{"start":[261,16],"end":[261,94],"bytes":[7571,7649]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan"},"261:83":{"kind":"call","span":{"start":[261,83],"end":[261,93],"bytes":[7638,7648]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"262:19":{"kind":"call","span":{"start":[262,19],"end":[262,29],"bytes":[7668,7678]},"callee":null},"265:15":{"kind":"call","span":{"start":[265,15],"end":[265,25],"bytes":[7715,7725]},"callee":null},"265:9":{"kind":"call","span":{"start":[265,9],"end":[265,45],"bytes":[7709,7745]},"callee":null}}}}},"RestorePlan":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan","kind":"struct","span":{"start":[170,1],"end":[177,2],"bytes":[4833,5145]},"callables":{},"fields":{"Files":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/Files","kind":"field","type":"[]github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile","span":{"start":[176,1],"end":[176,45],"bytes":[5099,5143]}},"MaxTXID":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/MaxTXID","kind":"field","type":"string","span":{"start":[175,1],"end":[175,48],"bytes":[5051,5098]}},"MinTXID":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/MinTXID","kind":"field","type":"string","span":{"start":[174,1],"end":[174,48],"bytes":[5003,5050]}},"Replica":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/Replica","kind":"field","type":"string","span":{"start":[173,1],"end":[173,47],"bytes":[4956,5002]}},"Source":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/Source","kind":"field","type":"string","span":{"start":[171,1],"end":[171,46],"bytes":[4859,4904]}},"TargetPath":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/TargetPath","kind":"field","type":"string","span":{"start":[172,1],"end":[172,51],"bytes":[4905,4955]}}}},"RestorePlanFile":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile","kind":"struct","span":{"start":[179,1],"end":[186,2],"bytes":[5147,5384]},"callables":{},"fields":{"Level":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/Level","kind":"field","type":"int","span":{"start":[180,1],"end":[180,33],"bytes":[5177,5209]}},"MaxTXID":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/MaxTXID","kind":"field","type":"string","span":{"start":[183,1],"end":[183,36],"bytes":[5278,5313]}},"MinTXID":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/MinTXID","kind":"field","type":"string","span":{"start":[182,1],"end":[182,36],"bytes":[5242,5277]}},"Name":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/Name","kind":"field","type":"string","span":{"start":[181,1],"end":[181,32],"bytes":[5210,5241]}},"Size":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/Size","kind":"field","type":"int64","span":{"start":[184,1],"end":[184,32],"bytes":[5314,5345]}},"Timestamp":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/Timestamp","kind":"field","type":"string","span":{"start":[185,1],"end":[185,37],"bytes":[5346,5382]}}}},"RestoreResult":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult","kind":"struct","span":{"start":[188,1],"end":[194,2],"bytes":[5386,5624]},"callables":{},"fields":{"DBPath":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/DBPath","kind":"field","type":"string","span":{"start":[189,1],"end":[189,40],"bytes":[5414,5453]}},"DurationMS":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/DurationMS","kind":"field","type":"int64","span":{"start":[192,1],"end":[192,44],"bytes":[5531,5574]}},"IntegrityCheck":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/IntegrityCheck","kind":"field","type":"string","span":{"start":[193,1],"end":[193,48],"bytes":[5575,5622]}},"Replica":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/Replica","kind":"field","type":"string","span":{"start":[190,1],"end":[190,40],"bytes":[5454,5493]}},"TXID":{"id":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/TXID","kind":"field","type":"string","span":{"start":[191,1],"end":[191,37],"bytes":[5494,5530]}}}}},"functions":{},"content_hash":"86e46d8df1604840766b9f0392d007410769da6c8459a88d3b534e8a312e4373"},"cmd/litestream/start.go":{"id":"can://go/litestream/cmd/litestream/start.go","kind":"module","span":{"start":[1,1],"end":[159,1],"bytes":[0,4011]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// StartCommand represents the command to start replication for a database.\ntype StartCommand struct{}\n\n// Run executes the start command.\nfunc (c *StartCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-start\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream start /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\t// Create HTTP client that connects via Unix socket with timeout\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.StartRequest{\n\t\tPath: dbPath,\n\t\tTimeout: *timeout,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tresp, err := client.Post(\"http://localhost/start\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"start failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"start failed: %s\", string(body))\n\t}\n\n\tvar result litestream.StartResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := StartStopResult{\n\t\tStatus: result.Status,\n\t\tDBPath: result.Path,\n\t\tState: \"running\",\n\t\tTXID: result.TXID,\n\t\tSocket: *socketPath,\n\t}\n\tif err := printStartStopResult(confirmation, *jsonOutput); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype StartStopResult struct {\n\tStatus string `json:\"status\"`\n\tDBPath string `json:\"db_path\"`\n\tState string `json:\"state\"`\n\tTXID uint64 `json:\"txid\"`\n\tSocket string `json:\"socket\"`\n}\n\nfunc printStartStopResult(result StartStopResult, jsonOutput bool) error {\n\tif jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"status: %s\\n\", result.Status)\n\tfmt.Printf(\"db_path: %s\\n\", result.DBPath)\n\tfmt.Printf(\"state: %s\\n\", result.State)\n\tfmt.Printf(\"txid: %d\\n\", result.TXID)\n\tfmt.Printf(\"socket: %s\\n\", result.Socket)\n\n\treturn nil\n}\n\n// Usage prints the help text for the start command.\nfunc (c *StartCommand) Usage() {\n\tfmt.Println(`\nusage: litestream start [OPTIONS] DB_PATH\n\nStart replication for a database.\n\nOptions:\n -timeout SECONDS\n Maximum time to wait in seconds (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n # Start replication for a database on the running daemon.\n $ litestream start /path/to/db\n\n # Start replication and emit a JSON confirmation.\n $ litestream start -json /path/to/db\n\n # Start replication using a non-default control socket.\n $ litestream start -socket /tmp/litestream.sock /path/to/db\n\n # Start replication and wait up to 10 seconds for the daemon response.\n $ litestream start -timeout 10 /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"StartCommand":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand","kind":"struct","span":{"start":[18,1],"end":[18,27],"bytes":[225,251]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","kind":"method","span":{"start":[21,1],"end":[99,2],"bytes":[288,2473]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[21,1],"end":[21,71],"bytes":[288,358]}},{"name":"args","type":"[]string","span":{"start":[21,1],"end":[21,71],"bytes":[288,358]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"22:8":{"kind":"call","span":{"start":[22,8],"end":[22,65],"bytes":[366,423]},"callee":null},"23:13":{"kind":"call","span":{"start":[23,13],"end":[23,56],"bytes":[436,479]},"callee":null},"24:16":{"kind":"call","span":{"start":[24,16],"end":[24,86],"bytes":[495,565]},"callee":null},"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,57],"bytes":[581,622]},"callee":null},"27:12":{"kind":"call","span":{"start":[27,12],"end":[27,26],"bytes":[654,668]},"callee":null},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,14],"bytes":[704,713]},"callee":null},"37:5":{"kind":"call","span":{"start":[37,5],"end":[37,14],"bytes":[836,845]},"callee":null},"38:10":{"kind":"call","span":{"start":[38,10],"end":[38,42],"bytes":[861,893]},"callee":null},"41:12":{"kind":"call","span":{"start":[41,12],"end":[41,21],"bytes":[909,918]},"callee":null},"44:19":{"kind":"call","span":{"start":[44,19],"end":[44,42],"bytes":[1004,1027]},"callee":null},"58:18":{"kind":"call","span":{"start":[58,18],"end":[58,35],"bytes":[1367,1384]},"callee":null},"60:10":{"kind":"call","span":{"start":[60,10],"end":[60,58],"bytes":[1411,1459]},"callee":null},"63:15":{"kind":"call","span":{"start":[63,15],"end":[63,98],"bytes":[1478,1561]},"callee":null},"63:73":{"kind":"call","span":{"start":[63,73],"end":[63,97],"bytes":[1536,1560]},"callee":null},"65:10":{"kind":"call","span":{"start":[65,10],"end":[65,68],"bytes":[1588,1646]},"callee":null},"67:8":{"kind":"call","span":{"start":[67,8],"end":[67,25],"bytes":[1657,1674]},"callee":null},"69:15":{"kind":"call","span":{"start":[69,15],"end":[69,36],"bytes":[1690,1711]},"callee":null},"71:10":{"kind":"call","span":{"start":[71,10],"end":[71,56],"bytes":[1738,1784]},"callee":null},"76:13":{"kind":"call","span":{"start":[76,13],"end":[76,43],"bytes":[1879,1909]},"callee":null},"77:11":{"kind":"call","span":{"start":[77,11],"end":[77,56],"bytes":[1957,2002]},"callee":null},"79:10":{"kind":"call","span":{"start":[79,10],"end":[79,54],"bytes":[2016,2060]},"callee":null},"79:41":{"kind":"call","span":{"start":[79,41],"end":[79,53],"bytes":[2047,2059]},"callee":null},"83:12":{"kind":"call","span":{"start":[83,12],"end":[83,41],"bytes":[2113,2142]},"callee":null},"84:10":{"kind":"call","span":{"start":[84,10],"end":[84,57],"bytes":[2166,2213]},"callee":null},"94:12":{"kind":"call","span":{"start":[94,12],"end":[94,59],"bytes":[2381,2428]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run.closure_1","kind":"function","span":{"start":[48,1],"end":[50,6],"bytes":[1123,1264]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[48,1],"end":[48,73],"bytes":[1123,1195]}},{"name":"_","type":"string","span":{"start":[48,1],"end":[48,73],"bytes":[1123,1195]}},{"name":"_","type":"string","span":{"start":[48,1],"end":[48,73],"bytes":[1123,1195]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"49:12":{"kind":"call","span":{"start":[49,12],"end":[49,63],"bytes":[1207,1258]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Usage":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Usage","kind":"method","span":{"start":[129,1],"end":[158,2],"bytes":[3214,4010]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"130:2":{"kind":"call","span":{"start":[130,2],"end":[157,7],"bytes":[3248,4008]},"callee":null}}}}},"StartStopResult":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult","kind":"struct","span":{"start":[101,1],"end":[107,2],"bytes":[2475,2659]},"callables":{},"fields":{"DBPath":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/DBPath","kind":"field","type":"string","span":{"start":[103,1],"end":[103,32],"bytes":[2536,2567]}},"Socket":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/Socket","kind":"field","type":"string","span":{"start":[106,1],"end":[106,31],"bytes":[2627,2657]}},"State":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/State","kind":"field","type":"string","span":{"start":[104,1],"end":[104,30],"bytes":[2568,2597]}},"Status":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/Status","kind":"field","type":"string","span":{"start":[102,1],"end":[102,31],"bytes":[2505,2535]}},"TXID":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/TXID","kind":"field","type":"uint64","span":{"start":[105,1],"end":[105,29],"bytes":[2598,2626]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult":{"id":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","kind":"function","span":{"start":[109,1],"end":[126,2],"bytes":[2661,3159]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","parameters":[{"name":"result","type":"github.com/benbjohnson/litestream/cmd/litestream.StartStopResult","span":{"start":[109,1],"end":[109,75],"bytes":[2661,2735]}},{"name":"jsonOutput","type":"bool","span":{"start":[109,1],"end":[109,75],"bytes":[2661,2735]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"111:18":{"kind":"call","span":{"start":[111,18],"end":[111,54],"bytes":[2770,2806]},"callee":null},"113:11":{"kind":"call","span":{"start":[113,11],"end":[113,59],"bytes":[2835,2883]},"callee":null},"115:15":{"kind":"call","span":{"start":[115,15],"end":[115,29],"bytes":[2902,2916]},"callee":null},"115:3":{"kind":"call","span":{"start":[115,3],"end":[115,30],"bytes":[2890,2917]},"callee":null},"119:2":{"kind":"call","span":{"start":[119,2],"end":[119,43],"bytes":[2936,2977]},"callee":null},"120:2":{"kind":"call","span":{"start":[120,2],"end":[120,44],"bytes":[2979,3021]},"callee":null},"121:2":{"kind":"call","span":{"start":[121,2],"end":[121,41],"bytes":[3023,3062]},"callee":null},"122:2":{"kind":"call","span":{"start":[122,2],"end":[122,39],"bytes":[3064,3101]},"callee":null},"123:2":{"kind":"call","span":{"start":[123,2],"end":[123,43],"bytes":[3103,3144]},"callee":null}}}},"content_hash":"84e42db46c78b62cc29bf708a9610b4ddb39e2e2ce292b681993a6b1316102d6"},"cmd/litestream/status.go":{"id":"can://go/litestream/cmd/litestream/status.go","kind":"module","span":{"start":[1,1],"end":[174,1],"bytes":[0,3920]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"text/tabwriter\"\n\n\t\"github.com/dustin/go-humanize\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// StatusCommand is a command for displaying replication status.\ntype StatusCommand struct{}\n\n// Run executes the command.\nfunc (c *StatusCommand) Run(ctx context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-status\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\t// Load configuration.\n\tif *configPath == \"\" {\n\t\t*configPath = DefaultConfigPath()\n\t}\n\tconfig, err := ReadConfigFile(*configPath, !*noExpandEnv)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// If a specific database path is provided, filter to just that one.\n\tvar filterPath string\n\tif fs.NArg() \u003e 0 {\n\t\tfilterPath = fs.Arg(0)\n\t}\n\n\tstatuses := make([]DBStatus, 0, len(config.DBs))\n\n\tfor _, dbConfig := range config.DBs {\n\t\tdb, err := NewDBFromConfig(dbConfig)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Filter if path specified.\n\t\tif filterPath != \"\" \u0026\u0026 db.Path() != filterPath {\n\t\t\tcontinue\n\t\t}\n\n\t\tstatuses = append(statuses, c.getDBStatus(db))\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(statuses, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tw := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)\n\tdefer w.Flush()\n\n\tfmt.Fprintln(w, \"database\\tstatus\\tlocal txid\\twal size\")\n\tfor _, status := range statuses {\n\t\tfmt.Fprintf(w, \"%s\\t%s\\t%s\\t%s\\n\",\n\t\t\tstatus.Database,\n\t\t\tstatus.Status,\n\t\t\tstatus.LocalTXID,\n\t\t\tstatus.WALSize,\n\t\t)\n\t}\n\n\treturn nil\n}\n\n// DBStatus holds the status information for a single database.\ntype DBStatus struct {\n\tDatabase string `json:\"database\"`\n\tStatus string `json:\"status\"`\n\tLocalTXID string `json:\"local_txid\"`\n\tWALSize string `json:\"wal_size\"`\n}\n\n// getDBStatus gathers status information for a database.\nfunc (c *StatusCommand) getDBStatus(db *litestream.DB) DBStatus {\n\tstatus := DBStatus{\n\t\tDatabase: db.Path(),\n\t\tStatus: \"unknown\",\n\t\tLocalTXID: \"-\",\n\t\tWALSize: \"-\",\n\t}\n\n\t// Check if database file exists.\n\tdbPath := db.Path()\n\tif _, err := os.Stat(dbPath); os.IsNotExist(err) {\n\t\tstatus.Status = \"no database\"\n\t\treturn status\n\t}\n\n\t// Get WAL file size.\n\twalPath := db.WALPath()\n\tif walInfo, err := os.Stat(walPath); err == nil {\n\t\tstatus.WALSize = humanize.Bytes(uint64(walInfo.Size()))\n\t} else if os.IsNotExist(err) {\n\t\tstatus.WALSize = \"0 B\"\n\t}\n\n\t// Get local TXID from L0 directory.\n\t_, maxTXID, err := db.MaxLTX()\n\tif err == nil \u0026\u0026 maxTXID \u003e 0 {\n\t\tstatus.LocalTXID = maxTXID.String()\n\t\tstatus.Status = \"ok\"\n\t} else if err == nil {\n\t\tstatus.Status = \"not initialized\"\n\t} else {\n\t\tstatus.Status = \"error\"\n\t}\n\n\treturn status\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *StatusCommand) Usage() {\n\tfmt.Printf(`\nThe status command displays the replication status of databases.\n\nUsage:\n\n\tlitestream status [arguments] [database path]\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-json\n\t Output raw JSON instead of human-readable text.\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\nIf a database path is provided, only that database's status is shown.\nOtherwise, all configured databases are displayed.\n\nOutput columns:\n database Path to the SQLite database\n status Current status (ok, not initialized, no database, error)\n local txid Latest local transaction ID\n wal size Current WAL file size\n\nNote: To see replica TXID and sync status, inspect daemon diagnostics or logs\nwhile the replication daemon is running.\n\nExamples:\n\n\t$ litestream status\n\t$ litestream status /path/to/db\n\t$ litestream status -json\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"tabwriter","path":"text/tabwriter","span":{"start":[9,1],"end":[9,18],"bytes":[72,89]}},{"name":"go-humanize","path":"github.com/dustin/go-humanize","span":{"start":[11,1],"end":[11,33],"bytes":[91,123]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[13,1],"end":[13,37],"bytes":[125,161]}}],"types":{"DBStatus":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus","kind":"struct","span":{"start":[86,1],"end":[91,2],"bytes":[1827,1995]},"callables":{},"fields":{"Database":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus/Database","kind":"field","type":"string","span":{"start":[87,1],"end":[87,36],"bytes":[1850,1885]}},"LocalTXID":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus/LocalTXID","kind":"field","type":"string","span":{"start":[89,1],"end":[89,38],"bytes":[1920,1957]}},"Status":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus/Status","kind":"field","type":"string","span":{"start":[88,1],"end":[88,34],"bytes":[1886,1919]}},"WALSize":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus/WALSize","kind":"field","type":"string","span":{"start":[90,1],"end":[90,36],"bytes":[1958,1993]}}}},"StatusCommand":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand","kind":"struct","span":{"start":[17,1],"end":[17,28],"bytes":[230,257]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","kind":"method","span":{"start":[20,1],"end":[83,2],"bytes":[288,1761]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[20,1],"end":[20,78],"bytes":[288,365]}},{"name":"args","type":"[]string","span":{"start":[20,1],"end":[20,78],"bytes":[288,365]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"21:8":{"kind":"call","span":{"start":[21,8],"end":[21,66],"bytes":[373,431]},"callee":null},"22:29":{"kind":"call","span":{"start":[22,29],"end":[22,51],"bytes":[460,482]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"23:16":{"kind":"call","span":{"start":[23,16],"end":[23,57],"bytes":[498,539]},"callee":null},"25:12":{"kind":"call","span":{"start":[25,12],"end":[25,26],"bytes":[571,585]},"callee":null},"31:17":{"kind":"call","span":{"start":[31,17],"end":[31,36],"bytes":[681,700]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"33:17":{"kind":"call","span":{"start":[33,17],"end":[33,59],"bytes":[720,762]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[894,903]},"callee":null},"41:16":{"kind":"call","span":{"start":[41,16],"end":[41,25],"bytes":[925,934]},"callee":null},"44:14":{"kind":"call","span":{"start":[44,14],"end":[44,50],"bytes":[952,988]},"callee":null},"44:34":{"kind":"call","span":{"start":[44,34],"end":[44,49],"bytes":[972,987]},"callee":null},"47:14":{"kind":"call","span":{"start":[47,14],"end":[47,39],"bytes":[1042,1067]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"53:26":{"kind":"call","span":{"start":[53,26],"end":[53,35],"bytes":[1161,1170]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"57:14":{"kind":"call","span":{"start":[57,14],"end":[57,49],"bytes":[1217,1252]},"callee":null},"57:31":{"kind":"call","span":{"start":[57,31],"end":[57,48],"bytes":[1234,1251]},"callee":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus"},"61:18":{"kind":"call","span":{"start":[61,18],"end":[61,56],"bytes":[1292,1330]},"callee":null},"63:11":{"kind":"call","span":{"start":[63,11],"end":[63,59],"bytes":[1359,1407]},"callee":null},"65:15":{"kind":"call","span":{"start":[65,15],"end":[65,29],"bytes":[1426,1440]},"callee":null},"65:3":{"kind":"call","span":{"start":[65,3],"end":[65,30],"bytes":[1414,1441]},"callee":null},"69:7":{"kind":"call","span":{"start":[69,7],"end":[69,54],"bytes":[1465,1512]},"callee":null},"70:8":{"kind":"call","span":{"start":[70,8],"end":[70,17],"bytes":[1520,1529]},"callee":null},"72:2":{"kind":"call","span":{"start":[72,2],"end":[72,59],"bytes":[1532,1589]},"callee":null},"74:3":{"kind":"call","span":{"start":[74,3],"end":[79,4],"bytes":[1627,1743]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage","kind":"method","span":{"start":[132,1],"end":[173,2],"bytes":[2932,3919]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"133:2":{"kind":"call","span":{"start":[133,2],"end":[172,3],"bytes":[2967,3917]},"callee":null},"171:3":{"kind":"call","span":{"start":[171,3],"end":[171,22],"bytes":[3894,3913]},"callee":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}},"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus":{"id":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","kind":"method","span":{"start":[94,1],"end":[129,2],"bytes":[2055,2887]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","parameters":[{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[94,1],"end":[94,66],"bytes":[2055,2120]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream.DBStatus","metrics":{"cyclomatic":6},"body":{"103:12":{"kind":"call","span":{"start":[103,12],"end":[103,21],"bytes":[2276,2285]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"104:15":{"kind":"call","span":{"start":[104,15],"end":[104,30],"bytes":[2300,2315]},"callee":null},"104:32":{"kind":"call","span":{"start":[104,32],"end":[104,50],"bytes":[2317,2335]},"callee":null},"110:13":{"kind":"call","span":{"start":[110,13],"end":[110,25],"bytes":[2425,2437]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"111:21":{"kind":"call","span":{"start":[111,21],"end":[111,37],"bytes":[2458,2474]},"callee":null},"112:20":{"kind":"call","span":{"start":[112,20],"end":[112,58],"bytes":[2508,2546]},"callee":null},"112:35":{"kind":"call","span":{"start":[112,35],"end":[112,57],"bytes":[2523,2545]},"callee":null},"112:42":{"kind":"call","span":{"start":[112,42],"end":[112,56],"bytes":[2530,2544]},"callee":null},"113:12":{"kind":"call","span":{"start":[113,12],"end":[113,30],"bytes":[2558,2576]},"callee":null},"118:21":{"kind":"call","span":{"start":[118,21],"end":[118,32],"bytes":[2666,2677]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"120:22":{"kind":"call","span":{"start":[120,22],"end":[120,38],"bytes":[2731,2747]},"callee":null},"96:14":{"kind":"call","span":{"start":[96,14],"end":[96,23],"bytes":[2155,2164]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}}}}},"functions":{},"content_hash":"98a8f08a6eb5a3cbf7ad03e9f39b80995556107089918886c263347426f999a9"},"cmd/litestream/stop.go":{"id":"can://go/litestream/cmd/litestream/stop.go","kind":"module","span":{"start":[1,1],"end":[133,1],"bytes":[0,3330]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// StopCommand represents the command to stop replication for a database.\ntype StopCommand struct{}\n\n// Run executes the stop command.\nfunc (c *StopCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-stop\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream stop /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\t// Create HTTP client that connects via Unix socket with timeout\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.StopRequest{\n\t\tPath: dbPath,\n\t\tTimeout: *timeout,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tresp, err := client.Post(\"http://localhost/stop\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"stop failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"stop failed: %s\", string(body))\n\t}\n\n\tvar result litestream.StopResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := StartStopResult{\n\t\tStatus: result.Status,\n\t\tDBPath: result.Path,\n\t\tState: \"stopped\",\n\t\tTXID: result.TXID,\n\t\tSocket: *socketPath,\n\t}\n\tif err := printStartStopResult(confirmation, *jsonOutput); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Usage prints the help text for the stop command.\nfunc (c *StopCommand) Usage() {\n\tfmt.Println(`\nusage: litestream stop [OPTIONS] DB_PATH\n\nStop replication for a database.\nStop always waits for shutdown and final sync.\n\nOptions:\n -timeout SECONDS\n Maximum time to wait in seconds (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n # Stop replication for a database.\n $ litestream stop /path/to/db\n\n # Stop replication and emit a JSON confirmation.\n $ litestream stop -json /path/to/db\n\n # Stop replication using a non-default control socket.\n $ litestream stop -socket /tmp/litestream.sock /path/to/db\n\n # Stop replication and wait up to 10 seconds for final sync and shutdown.\n $ litestream stop -timeout 10 /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"StopCommand":{"id":"can://go/litestream/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand","kind":"struct","span":{"start":[18,1],"end":[18,26],"bytes":[223,248]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run":{"id":"can://go/litestream/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","kind":"method","span":{"start":[21,1],"end":[99,2],"bytes":[284,2461]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[21,1],"end":[21,70],"bytes":[284,353]}},{"name":"args","type":"[]string","span":{"start":[21,1],"end":[21,70],"bytes":[284,353]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"22:8":{"kind":"call","span":{"start":[22,8],"end":[22,64],"bytes":[361,417]},"callee":null},"23:13":{"kind":"call","span":{"start":[23,13],"end":[23,56],"bytes":[430,473]},"callee":null},"24:16":{"kind":"call","span":{"start":[24,16],"end":[24,86],"bytes":[489,559]},"callee":null},"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,57],"bytes":[575,616]},"callee":null},"27:12":{"kind":"call","span":{"start":[27,12],"end":[27,26],"bytes":[648,662]},"callee":null},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,14],"bytes":[698,707]},"callee":null},"37:5":{"kind":"call","span":{"start":[37,5],"end":[37,14],"bytes":[829,838]},"callee":null},"38:10":{"kind":"call","span":{"start":[38,10],"end":[38,42],"bytes":[854,886]},"callee":null},"41:12":{"kind":"call","span":{"start":[41,12],"end":[41,21],"bytes":[902,911]},"callee":null},"44:19":{"kind":"call","span":{"start":[44,19],"end":[44,42],"bytes":[997,1020]},"callee":null},"58:18":{"kind":"call","span":{"start":[58,18],"end":[58,35],"bytes":[1359,1376]},"callee":null},"60:10":{"kind":"call","span":{"start":[60,10],"end":[60,58],"bytes":[1403,1451]},"callee":null},"63:15":{"kind":"call","span":{"start":[63,15],"end":[63,97],"bytes":[1470,1552]},"callee":null},"63:72":{"kind":"call","span":{"start":[63,72],"end":[63,96],"bytes":[1527,1551]},"callee":null},"65:10":{"kind":"call","span":{"start":[65,10],"end":[65,68],"bytes":[1579,1637]},"callee":null},"67:8":{"kind":"call","span":{"start":[67,8],"end":[67,25],"bytes":[1648,1665]},"callee":null},"69:15":{"kind":"call","span":{"start":[69,15],"end":[69,36],"bytes":[1681,1702]},"callee":null},"71:10":{"kind":"call","span":{"start":[71,10],"end":[71,56],"bytes":[1729,1775]},"callee":null},"76:13":{"kind":"call","span":{"start":[76,13],"end":[76,43],"bytes":[1870,1900]},"callee":null},"77:11":{"kind":"call","span":{"start":[77,11],"end":[77,55],"bytes":[1948,1992]},"callee":null},"79:10":{"kind":"call","span":{"start":[79,10],"end":[79,53],"bytes":[2006,2049]},"callee":null},"79:40":{"kind":"call","span":{"start":[79,40],"end":[79,52],"bytes":[2036,2048]},"callee":null},"83:12":{"kind":"call","span":{"start":[83,12],"end":[83,41],"bytes":[2101,2130]},"callee":null},"84:10":{"kind":"call","span":{"start":[84,10],"end":[84,57],"bytes":[2154,2201]},"callee":null},"94:12":{"kind":"call","span":{"start":[94,12],"end":[94,59],"bytes":[2369,2416]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run.closure_1","kind":"function","span":{"start":[48,1],"end":[50,6],"bytes":[1116,1257]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[48,1],"end":[48,73],"bytes":[1116,1188]}},{"name":"_","type":"string","span":{"start":[48,1],"end":[48,73],"bytes":[1116,1188]}},{"name":"_","type":"string","span":{"start":[48,1],"end":[48,73],"bytes":[1116,1188]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"49:12":{"kind":"call","span":{"start":[49,12],"end":[49,63],"bytes":[1200,1251]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Usage":{"id":"can://go/litestream/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Usage","kind":"method","span":{"start":[102,1],"end":[132,2],"bytes":[2515,3329]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"103:2":{"kind":"call","span":{"start":[103,2],"end":[131,7],"bytes":[2548,3327]},"callee":null}}}}}},"functions":{},"content_hash":"7980bb929ad3d474f22b95549b12385368f7253b2704c25e3656b0c025b55625"},"cmd/litestream/sync.go":{"id":"can://go/litestream/cmd/litestream/sync.go","kind":"module","span":{"start":[1,1],"end":[162,1],"bytes":[0,4043]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// SyncCommand represents the command to force an immediate sync for a database.\ntype SyncCommand struct{}\n\n// Run executes the sync command.\nfunc (c *SyncCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-sync\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\twait := fs.Bool(\"wait\", false, \"block until sync completes\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream sync /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.SyncRequest{\n\t\tPath: dbPath,\n\t\tWait: *wait,\n\t\tTimeout: *timeout,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tstart := time.Now()\n\tresp, err := client.Post(\"http://localhost/sync\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\tdurationMS := time.Since(start).Milliseconds()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"sync failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"sync failed: %s\", string(body))\n\t}\n\n\tvar result litestream.SyncResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := SyncResult{\n\t\tDBPath: result.Path,\n\t\tTXID: result.TXID,\n\t\tDurationMS: durationMS,\n\t}\n\tif *wait {\n\t\tconfirmation.ReplicaTXID = \u0026result.ReplicatedTXID\n\t}\n\tif err := printSyncResult(confirmation, *jsonOutput); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype SyncResult struct {\n\tDBPath string `json:\"db_path\"`\n\tTXID uint64 `json:\"txid\"`\n\tReplicaTXID *uint64 `json:\"replica_txid,omitempty\"`\n\tDurationMS int64 `json:\"duration_ms\"`\n}\n\nfunc printSyncResult(result SyncResult, jsonOutput bool) error {\n\tif jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"db_path: %s\\n\", result.DBPath)\n\tfmt.Printf(\"txid: %d\\n\", result.TXID)\n\tif result.ReplicaTXID != nil {\n\t\tfmt.Printf(\"replica_txid: %d\\n\", *result.ReplicaTXID)\n\t}\n\tfmt.Printf(\"duration_ms: %d\\n\", result.DurationMS)\n\n\treturn nil\n}\n\n// Usage prints the help text for the sync command.\nfunc (c *SyncCommand) Usage() {\n\tfmt.Println(`\nusage: litestream sync [OPTIONS] DB_PATH\n\nForce an immediate sync for a database.\n\nOptions:\n -wait\n Block until sync completes including remote replication (default: false).\n\n -timeout SECONDS\n Maximum time to wait in seconds, best-effort (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n $ litestream sync /path/to/db\n $ litestream sync -json /path/to/db\n $ litestream sync -wait /path/to/db\n $ litestream sync -wait -timeout 120 /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"SyncCommand":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand","kind":"struct","span":{"start":[18,1],"end":[18,26],"bytes":[230,255]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","kind":"method","span":{"start":[21,1],"end":[106,2],"bytes":[291,2650]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[21,1],"end":[21,70],"bytes":[291,360]}},{"name":"args","type":"[]string","span":{"start":[21,1],"end":[21,70],"bytes":[291,360]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"101:12":{"kind":"call","span":{"start":[101,12],"end":[101,54],"bytes":[2563,2605]},"callee":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult"},"22:8":{"kind":"call","span":{"start":[22,8],"end":[22,64],"bytes":[368,424]},"callee":null},"23:13":{"kind":"call","span":{"start":[23,13],"end":[23,56],"bytes":[437,480]},"callee":null},"24:16":{"kind":"call","span":{"start":[24,16],"end":[24,86],"bytes":[496,566]},"callee":null},"25:10":{"kind":"call","span":{"start":[25,10],"end":[25,62],"bytes":[576,628]},"callee":null},"26:16":{"kind":"call","span":{"start":[26,16],"end":[26,57],"bytes":[644,685]},"callee":null},"28:12":{"kind":"call","span":{"start":[28,12],"end":[28,26],"bytes":[717,731]},"callee":null},"32:5":{"kind":"call","span":{"start":[32,5],"end":[32,14],"bytes":[767,776]},"callee":null},"38:5":{"kind":"call","span":{"start":[38,5],"end":[38,14],"bytes":[898,907]},"callee":null},"39:10":{"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[923,955]},"callee":null},"42:10":{"kind":"call","span":{"start":[42,10],"end":[42,54],"bytes":[988,1032]},"callee":null},"45:12":{"kind":"call","span":{"start":[45,12],"end":[45,21],"bytes":[1048,1057]},"callee":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion"},"47:19":{"kind":"call","span":{"start":[47,19],"end":[47,42],"bytes":[1077,1100]},"callee":null},"62:18":{"kind":"call","span":{"start":[62,18],"end":[62,35],"bytes":[1457,1474]},"callee":null},"64:10":{"kind":"call","span":{"start":[64,10],"end":[64,58],"bytes":[1501,1549]},"callee":null},"67:11":{"kind":"call","span":{"start":[67,11],"end":[67,21],"bytes":[1564,1574]},"callee":null},"68:15":{"kind":"call","span":{"start":[68,15],"end":[68,97],"bytes":[1589,1671]},"callee":null},"68:72":{"kind":"call","span":{"start":[68,72],"end":[68,96],"bytes":[1646,1670]},"callee":null},"70:10":{"kind":"call","span":{"start":[70,10],"end":[70,68],"bytes":[1698,1756]},"callee":null},"72:8":{"kind":"call","span":{"start":[72,8],"end":[72,25],"bytes":[1767,1784]},"callee":null},"73:16":{"kind":"call","span":{"start":[73,16],"end":[73,33],"bytes":[1800,1817]},"callee":null},"75:15":{"kind":"call","span":{"start":[75,15],"end":[75,36],"bytes":[1848,1869]},"callee":null},"77:10":{"kind":"call","span":{"start":[77,10],"end":[77,56],"bytes":[1896,1942]},"callee":null},"82:13":{"kind":"call","span":{"start":[82,13],"end":[82,43],"bytes":[2037,2067]},"callee":null},"83:11":{"kind":"call","span":{"start":[83,11],"end":[83,55],"bytes":[2115,2159]},"callee":null},"85:10":{"kind":"call","span":{"start":[85,10],"end":[85,53],"bytes":[2173,2216]},"callee":null},"85:40":{"kind":"call","span":{"start":[85,40],"end":[85,52],"bytes":[2203,2215]},"callee":null},"89:12":{"kind":"call","span":{"start":[89,12],"end":[89,41],"bytes":[2268,2297]},"callee":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches"},"90:10":{"kind":"call","span":{"start":[90,10],"end":[90,57],"bytes":[2321,2368]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run.closure_1","kind":"function","span":{"start":[51,1],"end":[53,6],"bytes":[1196,1337]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[51,1],"end":[51,73],"bytes":[1196,1268]}},{"name":"_","type":"string","span":{"start":[51,1],"end":[51,73],"bytes":[1196,1268]}},{"name":"_","type":"string","span":{"start":[51,1],"end":[51,73],"bytes":[1196,1268]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"52:12":{"kind":"call","span":{"start":[52,12],"end":[52,63],"bytes":[1280,1331]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Usage":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Usage","kind":"method","span":{"start":[136,1],"end":[161,2],"bytes":[3406,4042]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"137:2":{"kind":"call","span":{"start":[137,2],"end":[160,7],"bytes":[3439,4040]},"callee":null}}}}},"SyncResult":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult","kind":"struct","span":{"start":[108,1],"end":[113,2],"bytes":[2652,2846]},"callables":{},"fields":{"DBPath":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult/DBPath","kind":"field","type":"string","span":{"start":[109,1],"end":[109,38],"bytes":[2677,2714]}},"DurationMS":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult/DurationMS","kind":"field","type":"int64","span":{"start":[112,1],"end":[112,42],"bytes":[2803,2844]}},"ReplicaTXID":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult/ReplicaTXID","kind":"field","type":"*uint64","span":{"start":[111,1],"end":[111,53],"bytes":[2750,2802]}},"TXID":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult/TXID","kind":"field","type":"uint64","span":{"start":[110,1],"end":[110,35],"bytes":[2715,2749]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.printSyncResult":{"id":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","kind":"function","span":{"start":[115,1],"end":[133,2],"bytes":[2848,3352]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","parameters":[{"name":"result","type":"github.com/benbjohnson/litestream/cmd/litestream.SyncResult","span":{"start":[115,1],"end":[115,65],"bytes":[2848,2912]}},{"name":"jsonOutput","type":"bool","span":{"start":[115,1],"end":[115,65],"bytes":[2848,2912]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"117:18":{"kind":"call","span":{"start":[117,18],"end":[117,54],"bytes":[2947,2983]},"callee":null},"119:11":{"kind":"call","span":{"start":[119,11],"end":[119,59],"bytes":[3012,3060]},"callee":null},"121:15":{"kind":"call","span":{"start":[121,15],"end":[121,29],"bytes":[3079,3093]},"callee":null},"121:3":{"kind":"call","span":{"start":[121,3],"end":[121,30],"bytes":[3067,3094]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"125:2":{"kind":"call","span":{"start":[125,2],"end":[125,44],"bytes":[3113,3155]},"callee":null},"126:2":{"kind":"call","span":{"start":[126,2],"end":[126,39],"bytes":[3157,3194]},"callee":null},"128:3":{"kind":"call","span":{"start":[128,3],"end":[128,56],"bytes":[3229,3282]},"callee":null},"130:2":{"kind":"call","span":{"start":[130,2],"end":[130,52],"bytes":[3287,3337]},"callee":null}}}},"content_hash":"f124c02d744ececee52a6c5a31922dc5e6a71a5b9fe8ad28262622a0785c0d9b"},"cmd/litestream/unregister.go":{"id":"can://go/litestream/cmd/litestream/unregister.go","kind":"module","span":{"start":[1,1],"end":[177,1],"bytes":[0,4764]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\ntype UnregisterCommand struct{}\n\nfunc (c *UnregisterCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-unregister\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\tdryRun := fs.Bool(\"dry-run\", false, \"print what would be unregistered without changing the daemon\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream unregister /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\tif *dryRun {\n\t\tfmt.Println(\"Dry run: unregister request preview\")\n\t\tfmt.Printf(\" database: %s\\n\", dbPath)\n\t\tfmt.Printf(\" socket: %s\\n\", *socketPath)\n\t\tfmt.Printf(\" replicas: daemon-managed replica for this database\\n\")\n\t\tfmt.Printf(\" final sync: daemon close will sync the database and replica before the command completes\\n\")\n\t\tfmt.Printf(\" timeout: %ds\\n\", *timeout)\n\t\tfmt.Println(\"No unregister request was sent.\")\n\t\treturn nil\n\t}\n\n\t// Create HTTP client that connects via Unix socket with timeout.\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.UnregisterDatabaseRequest{\n\t\tPath: dbPath,\n\t\tTimeout: *timeout,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tresp, err := client.Post(\"http://localhost/unregister\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"unregister failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"unregister failed: %s\", string(body))\n\t}\n\n\tvar result litestream.UnregisterDatabaseResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := UnregisterResult{\n\t\tStatus: result.Status,\n\t\tDBPath: result.Path,\n\t\tFinalTXID: result.TXID,\n\t\tSocket: *socketPath,\n\t}\n\tif err := printUnregisterResult(confirmation, *jsonOutput); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype UnregisterResult struct {\n\tStatus string `json:\"status\"`\n\tDBPath string `json:\"db_path\"`\n\tFinalTXID uint64 `json:\"final_txid\"`\n\tSocket string `json:\"socket\"`\n}\n\nfunc printUnregisterResult(result UnregisterResult, jsonOutput bool) error {\n\tif jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"status: %s\\n\", result.Status)\n\tfmt.Printf(\"db_path: %s\\n\", result.DBPath)\n\tfmt.Printf(\"final_txid: %d\\n\", result.FinalTXID)\n\tfmt.Printf(\"socket: %s\\n\", result.Socket)\n\n\treturn nil\n}\n\nfunc (c *UnregisterCommand) Usage() {\n\tfmt.Println(`\nusage: litestream unregister [OPTIONS] DB_PATH\n\nUnregister a database from replication.\n\nArguments:\n DB_PATH Path to the SQLite database file.\n\nOptions:\n -timeout SECONDS\n Maximum time to wait in seconds (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -dry-run\n Preview what would be unregistered without changing the daemon.\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n # Unregister a database from the running daemon.\n $ litestream unregister /path/to/db\n\n # Unregister a database and emit a JSON confirmation.\n $ litestream unregister -json /path/to/db\n\n # Preview an unregister request without changing the daemon.\n $ litestream unregister -dry-run /path/to/db\n\n # Unregister a database using a non-default control socket.\n $ litestream unregister -socket /tmp/litestream.sock /path/to/db\n\n # Unregister a database and wait up to 10 seconds for shutdown.\n $ litestream unregister -timeout 10 /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"UnregisterCommand":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand","kind":"struct","span":{"start":[17,1],"end":[17,32],"bytes":[149,180]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","kind":"method","span":{"start":[19,1],"end":[111,2],"bytes":[182,3036]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[19,1],"end":[19,76],"bytes":[182,257]}},{"name":"args","type":"[]string","span":{"start":[19,1],"end":[19,76],"bytes":[182,257]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"106:12":{"kind":"call","span":{"start":[106,12],"end":[106,60],"bytes":[2943,2991]},"callee":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult"},"20:8":{"kind":"call","span":{"start":[20,8],"end":[20,70],"bytes":[265,327]},"callee":null},"21:13":{"kind":"call","span":{"start":[21,13],"end":[21,56],"bytes":[340,383]},"callee":null},"22:16":{"kind":"call","span":{"start":[22,16],"end":[22,86],"bytes":[399,469]},"callee":null},"23:12":{"kind":"call","span":{"start":[23,12],"end":[23,101],"bytes":[481,570]},"callee":null},"24:16":{"kind":"call","span":{"start":[24,16],"end":[24,57],"bytes":[586,627]},"callee":null},"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,26],"bytes":[659,673]},"callee":null},"30:5":{"kind":"call","span":{"start":[30,5],"end":[30,14],"bytes":[709,718]},"callee":null},"36:5":{"kind":"call","span":{"start":[36,5],"end":[36,14],"bytes":[846,855]},"callee":null},"37:10":{"kind":"call","span":{"start":[37,10],"end":[37,42],"bytes":[871,903]},"callee":null},"40:10":{"kind":"call","span":{"start":[40,10],"end":[40,54],"bytes":[936,980]},"callee":null},"43:12":{"kind":"call","span":{"start":[43,12],"end":[43,21],"bytes":[996,1005]},"callee":null},"46:3":{"kind":"call","span":{"start":[46,3],"end":[46,53],"bytes":[1023,1073]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"47:3":{"kind":"call","span":{"start":[47,3],"end":[47,41],"bytes":[1076,1114]},"callee":null},"48:3":{"kind":"call","span":{"start":[48,3],"end":[48,44],"bytes":[1117,1158]},"callee":null},"49:3":{"kind":"call","span":{"start":[49,3],"end":[49,71],"bytes":[1161,1229]},"callee":null},"50:3":{"kind":"call","span":{"start":[50,3],"end":[50,109],"bytes":[1232,1338]},"callee":null},"51:3":{"kind":"call","span":{"start":[51,3],"end":[51,43],"bytes":[1341,1381]},"callee":null},"52:3":{"kind":"call","span":{"start":[52,3],"end":[52,49],"bytes":[1384,1430]},"callee":null},"57:19":{"kind":"call","span":{"start":[57,19],"end":[57,42],"bytes":[1533,1556]},"callee":null},"71:18":{"kind":"call","span":{"start":[71,18],"end":[71,35],"bytes":[1909,1926]},"callee":null},"73:10":{"kind":"call","span":{"start":[73,10],"end":[73,58],"bytes":[1953,2001]},"callee":null},"76:15":{"kind":"call","span":{"start":[76,15],"end":[76,103],"bytes":[2020,2108]},"callee":null},"76:78":{"kind":"call","span":{"start":[76,78],"end":[76,102],"bytes":[2083,2107]},"callee":null},"78:10":{"kind":"call","span":{"start":[78,10],"end":[78,68],"bytes":[2135,2193]},"callee":null},"80:8":{"kind":"call","span":{"start":[80,8],"end":[80,25],"bytes":[2204,2221]},"callee":null},"82:15":{"kind":"call","span":{"start":[82,15],"end":[82,36],"bytes":[2237,2258]},"callee":null},"84:10":{"kind":"call","span":{"start":[84,10],"end":[84,56],"bytes":[2285,2331]},"callee":null},"89:13":{"kind":"call","span":{"start":[89,13],"end":[89,43],"bytes":[2426,2456]},"callee":null},"90:11":{"kind":"call","span":{"start":[90,11],"end":[90,61],"bytes":[2504,2554]},"callee":null},"92:10":{"kind":"call","span":{"start":[92,10],"end":[92,59],"bytes":[2568,2617]},"callee":null},"92:46":{"kind":"call","span":{"start":[92,46],"end":[92,58],"bytes":[2604,2616]},"callee":null},"96:12":{"kind":"call","span":{"start":[96,12],"end":[96,41],"bytes":[2683,2712]},"callee":null},"97:10":{"kind":"call","span":{"start":[97,10],"end":[97,57],"bytes":[2736,2783]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run.closure_1","kind":"function","span":{"start":[61,1],"end":[63,6],"bytes":[1652,1793]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[61,1],"end":[61,73],"bytes":[1652,1724]}},{"name":"_","type":"string","span":{"start":[61,1],"end":[61,73],"bytes":[1652,1724]}},{"name":"_","type":"string","span":{"start":[61,1],"end":[61,73],"bytes":[1652,1724]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"62:12":{"kind":"call","span":{"start":[62,12],"end":[62,63],"bytes":[1736,1787]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Usage":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Usage","kind":"method","span":{"start":[138,1],"end":[176,2],"bytes":[3685,4763]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"139:2":{"kind":"call","span":{"start":[139,2],"end":[175,7],"bytes":[3724,4761]},"callee":null}}}}},"UnregisterResult":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult","kind":"struct","span":{"start":[113,1],"end":[118,2],"bytes":[3038,3211]},"callables":{},"fields":{"DBPath":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult/DBPath","kind":"field","type":"string","span":{"start":[115,1],"end":[115,35],"bytes":[3103,3137]}},"FinalTXID":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult/FinalTXID","kind":"field","type":"uint64","span":{"start":[116,1],"end":[116,38],"bytes":[3138,3175]}},"Socket":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult/Socket","kind":"field","type":"string","span":{"start":[117,1],"end":[117,34],"bytes":[3176,3209]}},"Status":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult/Status","kind":"field","type":"string","span":{"start":[114,1],"end":[114,34],"bytes":[3069,3102]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult":{"id":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","kind":"function","span":{"start":[120,1],"end":[136,2],"bytes":[3213,3683]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","parameters":[{"name":"result","type":"github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult","span":{"start":[120,1],"end":[120,77],"bytes":[3213,3289]}},{"name":"jsonOutput","type":"bool","span":{"start":[120,1],"end":[120,77],"bytes":[3213,3289]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"122:18":{"kind":"call","span":{"start":[122,18],"end":[122,54],"bytes":[3324,3360]},"callee":null},"124:11":{"kind":"call","span":{"start":[124,11],"end":[124,59],"bytes":[3389,3437]},"callee":null},"126:15":{"kind":"call","span":{"start":[126,15],"end":[126,29],"bytes":[3456,3470]},"callee":null},"126:3":{"kind":"call","span":{"start":[126,3],"end":[126,30],"bytes":[3444,3471]},"callee":null},"130:2":{"kind":"call","span":{"start":[130,2],"end":[130,43],"bytes":[3490,3531]},"callee":null},"131:2":{"kind":"call","span":{"start":[131,2],"end":[131,44],"bytes":[3533,3575]},"callee":null},"132:2":{"kind":"call","span":{"start":[132,2],"end":[132,50],"bytes":[3577,3625]},"callee":null},"133:2":{"kind":"call","span":{"start":[133,2],"end":[133,43],"bytes":[3627,3668]},"callee":null}}}},"content_hash":"909fe9bc1d4b8b209baf657348f921a8297a26fbca8d7a9cae91f6b20174a455"},"cmd/litestream/version.go":{"id":"can://go/litestream/cmd/litestream/version.go","kind":"module","span":{"start":[1,1],"end":[110,1],"bytes":[0,2638]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"runtime/debug\"\n)\n\n// defaultVersion is the placeholder used when no version was injected at\n// build time via -ldflags \"-X main.Version=...\".\nconst defaultVersion = \"(development build)\"\n\n// resolveVersion returns the most descriptive version string available:\n// the ldflags-injected value, the VCS-stamped module version, the VCS\n// revision, or the development-build placeholder, in that order.\nfunc resolveVersion(injected string, bi *debug.BuildInfo) string {\n\tif injected != \"\" \u0026\u0026 injected != defaultVersion {\n\t\treturn injected\n\t}\n\tif bi == nil {\n\t\treturn defaultVersion\n\t}\n\n\tif v := bi.Main.Version; v != \"\" \u0026\u0026 v != \"(devel)\" {\n\t\treturn v\n\t}\n\n\trevision, modified, _ := vcsSettings(bi)\n\tif revision == \"\" {\n\t\treturn defaultVersion\n\t}\n\tif len(revision) \u003e 12 {\n\t\trevision = revision[:12]\n\t}\n\tif modified {\n\t\trevision += \"-dirty\"\n\t}\n\treturn fmt.Sprintf(\"(development build %s)\", revision)\n}\n\n// vcsSettings extracts VCS metadata from embedded build info settings.\n// The vcs.time value is the commit timestamp, not the build time.\nfunc vcsSettings(bi *debug.BuildInfo) (revision string, modified bool, commitTime string) {\n\tfor _, s := range bi.Settings {\n\t\tswitch s.Key {\n\t\tcase \"vcs.revision\":\n\t\t\trevision = s.Value\n\t\tcase \"vcs.modified\":\n\t\t\tmodified = s.Value == \"true\"\n\t\tcase \"vcs.time\":\n\t\t\tcommitTime = s.Value\n\t\t}\n\t}\n\treturn revision, modified, commitTime\n}\n\n// VersionCommand represents a command to print the current version.\ntype VersionCommand struct{}\n\n// Run executes the command.\nfunc (c *VersionCommand) Run(_ context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-version\", flag.ContinueOnError)\n\tverbose := fs.Bool(\"verbose\", false, \"print detailed build metadata\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif !*verbose {\n\t\tfmt.Println(Version)\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"Version: %s\\n\", Version)\n\tfmt.Printf(\"Go Version: %s\\n\", runtime.Version())\n\tif bi, ok := debug.ReadBuildInfo(); ok {\n\t\trevision, modified, commitTime := vcsSettings(bi)\n\t\tif revision != \"\" {\n\t\t\tif modified {\n\t\t\t\trevision += \" (dirty)\"\n\t\t\t}\n\t\t\tfmt.Printf(\"Git Commit: %s\\n\", revision)\n\t\t}\n\t\tif commitTime != \"\" {\n\t\t\tfmt.Printf(\"Commit Time: %s\\n\", commitTime)\n\t\t}\n\t}\n\tfmt.Printf(\"OS/Arch: %s/%s\\n\", runtime.GOOS, runtime.GOARCH)\n\n\treturn nil\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *VersionCommand) Usage() {\n\tfmt.Println(`\nPrints the version.\n\nUsage:\n\n\tlitestream version [arguments]\n\nArguments:\n\n\t-verbose\n\t Print detailed build metadata (Go version, commit, build time, OS/arch).\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"flag","path":"flag","span":{"start":[5,1],"end":[5,8],"bytes":[34,41]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[42,48]}},{"name":"runtime","path":"runtime","span":{"start":[7,1],"end":[7,11],"bytes":[49,59]}},{"name":"debug","path":"runtime/debug","span":{"start":[8,1],"end":[8,17],"bytes":[60,76]}}],"types":{"VersionCommand":{"id":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand","kind":"struct","span":{"start":[60,1],"end":[60,29],"bytes":[1499,1527]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run":{"id":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","kind":"method","span":{"start":[63,1],"end":[93,2],"bytes":[1558,2372]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","parameters":[{"name":"_","type":"context.Context","span":{"start":[63,1],"end":[63,77],"bytes":[1558,1634]}},{"name":"args","type":"[]string","span":{"start":[63,1],"end":[63,77],"bytes":[1558,1634]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"64:8":{"kind":"call","span":{"start":[64,8],"end":[64,67],"bytes":[1642,1701]},"callee":null},"65:13":{"kind":"call","span":{"start":[65,13],"end":[65,71],"bytes":[1714,1772]},"callee":null},"67:12":{"kind":"call","span":{"start":[67,12],"end":[67,26],"bytes":[1804,1818]},"callee":null},"72:3":{"kind":"call","span":{"start":[72,3],"end":[72,23],"bytes":[1868,1888]},"callee":null},"76:2":{"kind":"call","span":{"start":[76,2],"end":[76,42],"bytes":[1907,1947]},"callee":null},"77:2":{"kind":"call","span":{"start":[77,2],"end":[77,52],"bytes":[1949,1999]},"callee":null},"77:34":{"kind":"call","span":{"start":[77,34],"end":[77,51],"bytes":[1981,1998]},"callee":null},"78:15":{"kind":"call","span":{"start":[78,15],"end":[78,36],"bytes":[2014,2035]},"callee":null},"79:37":{"kind":"call","span":{"start":[79,37],"end":[79,52],"bytes":[2078,2093]},"callee":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings"},"84:4":{"kind":"call","span":{"start":[84,4],"end":[84,45],"bytes":[2168,2209]},"callee":null},"87:4":{"kind":"call","span":{"start":[87,4],"end":[87,47],"bytes":[2241,2284]},"callee":null},"90:2":{"kind":"call","span":{"start":[90,2],"end":[90,66],"bytes":[2293,2357]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Usage":{"id":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Usage","kind":"method","span":{"start":[96,1],"end":[109,2],"bytes":[2417,2637]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"97:2":{"kind":"call","span":{"start":[97,2],"end":[108,7],"bytes":[2453,2635]},"callee":null}}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.resolveVersion":{"id":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","kind":"function","span":{"start":[18,1],"end":[41,2],"bytes":[460,955]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","parameters":[{"name":"injected","type":"string","span":{"start":[18,1],"end":[18,67],"bytes":[460,526]}},{"name":"bi","type":"*runtime/debug.BuildInfo","span":{"start":[18,1],"end":[18,67],"bytes":[460,526]}}],"return_type":"string","metrics":{"cyclomatic":7},"body":{"30:27":{"kind":"call","span":{"start":[30,27],"end":[30,42],"bytes":[738,753]},"callee":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings"},"34:5":{"kind":"call","span":{"start":[34,5],"end":[34,18],"bytes":[806,819]},"callee":null},"40:9":{"kind":"call","span":{"start":[40,9],"end":[40,56],"bytes":[906,953]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.vcsSettings":{"id":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings","kind":"function","span":{"start":[45,1],"end":[57,2],"bytes":[1096,1428]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.vcsSettings","parameters":[{"name":"bi","type":"*runtime/debug.BuildInfo","span":{"start":[45,1],"end":[45,92],"bytes":[1096,1187]}}],"return_type":"(string, bool, string)","metrics":{"cyclomatic":6},"body":{}}},"content_hash":"ef27995c6f376fd80906b31f6c239dde5ea3d88a99a771ec2962b75139f02da0"},"compaction_level.go":{"id":"can://go/litestream/compaction_level.go","kind":"module","span":{"start":[1,1],"end":[114,1],"bytes":[0,3545]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// SnapshotLevel represents the level which full snapshots are held.\nconst SnapshotLevel = 9\n\n// DefaultCompactionLevels provides the canonical default compaction configuration.\n// Level 0 is raw LTX files, higher levels compact at increasing intervals.\n// These values are also used by cmd/litestream DefaultConfig().\nvar DefaultCompactionLevels = CompactionLevels{\n\t{Level: 0, Interval: 0},\n\t{Level: 1, Interval: 30 * time.Second},\n\t{Level: 2, Interval: 5 * time.Minute},\n\t{Level: 3, Interval: time.Hour},\n}\n\n// CompactionLevel represents a single part of a multi-level compaction.\n// Each level merges LTX files from the previous level into larger time granularities.\ntype CompactionLevel struct {\n\t// The numeric level. Must match the index in the list of levels.\n\tLevel int\n\n\t// The frequency that the level is compacted from the previous level.\n\tInterval time.Duration\n}\n\n// PrevCompactionAt returns the time when the last compaction occurred.\n// Returns the current time if it is exactly a multiple of the level interval.\nfunc (lvl *CompactionLevel) PrevCompactionAt(now time.Time) time.Time {\n\treturn now.Truncate(lvl.Interval).UTC()\n}\n\n// NextCompactionAt returns the time until the next compaction occurs.\n// Returns the current time if it is exactly a multiple of the level interval.\nfunc (lvl *CompactionLevel) NextCompactionAt(now time.Time) time.Time {\n\treturn lvl.PrevCompactionAt(now).Add(lvl.Interval)\n}\n\n// CompactionLevels represents a sorted slice of non-snapshot compaction levels.\ntype CompactionLevels []*CompactionLevel\n\n// Level returns the compaction level at the given index.\n// Returns an error if the index is a snapshot level or is out of bounds.\nfunc (a CompactionLevels) Level(level int) (*CompactionLevel, error) {\n\tif level == SnapshotLevel {\n\t\treturn nil, fmt.Errorf(\"invalid argument, snapshot level\")\n\t}\n\tif level \u003c 0 || level \u003e a.MaxLevel() {\n\t\treturn nil, fmt.Errorf(\"level out of bounds: %d\", level)\n\t}\n\treturn a[level], nil\n}\n\n// MaxLevel return the highest non-snapshot compaction level.\nfunc (a CompactionLevels) MaxLevel() int {\n\treturn len(a) - 1\n}\n\n// Validate returns an error if the levels are invalid.\nfunc (a CompactionLevels) Validate() error {\n\tif len(a) == 0 {\n\t\treturn fmt.Errorf(\"at least one compaction level is required\")\n\t}\n\n\tfor i, lvl := range a {\n\t\tif i != lvl.Level {\n\t\t\treturn fmt.Errorf(\"compaction level number out of order: %d, expected %d\", lvl.Level, i)\n\t\t} else if lvl.Level \u003e SnapshotLevel-1 {\n\t\t\treturn fmt.Errorf(\"compaction level cannot exceed %d\", SnapshotLevel-1)\n\t\t}\n\n\t\tif lvl.Level == 0 \u0026\u0026 lvl.Interval != 0 {\n\t\t\treturn fmt.Errorf(\"cannot set interval on compaction level zero\")\n\t\t}\n\n\t\tif lvl.Level != 0 \u0026\u0026 lvl.Interval \u003c= 0 {\n\t\t\treturn fmt.Errorf(\"interval required for level %d\", lvl.Level)\n\t\t}\n\t}\n\treturn nil\n}\n\n// IsValidLevel returns true if level is a valid compaction level number.\nfunc (a CompactionLevels) IsValidLevel(level int) bool {\n\tif level == SnapshotLevel {\n\t\treturn true\n\t}\n\treturn level \u003e= 0 \u0026\u0026 level \u003c len(a)\n}\n\n// PrevLevel returns the previous compaction level.\n// Returns -1 if there is no previous level.\nfunc (a CompactionLevels) PrevLevel(level int) int {\n\tif level == SnapshotLevel {\n\t\treturn a.MaxLevel()\n\t}\n\treturn level - 1\n}\n\n// NextLevel returns the next compaction level.\n// Returns -1 if there is no next level.\nfunc (a CompactionLevels) NextLevel(level int) int {\n\tif level == SnapshotLevel {\n\t\treturn -1\n\t} else if level == a.MaxLevel() {\n\t\treturn SnapshotLevel\n\t}\n\treturn level + 1\n}\n","imports":[{"name":"fmt","path":"fmt","span":{"start":[4,1],"end":[4,7],"bytes":[29,35]}},{"name":"time","path":"time","span":{"start":[5,1],"end":[5,8],"bytes":[36,43]}}],"types":{"CompactionLevel":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel","kind":"struct","span":{"start":[23,1],"end":[29,2],"bytes":[718,923]},"callables":{"github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt","kind":"method","span":{"start":[39,1],"end":[41,2],"bytes":[1342,1467]},"signature":"github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt","parameters":[{"name":"now","type":"time.Time","span":{"start":[39,1],"end":[39,72],"bytes":[1342,1413]}}],"return_type":"time.Time","metrics":{"cyclomatic":1},"body":{"40:9":{"kind":"call","span":{"start":[40,9],"end":[40,34],"bytes":[1422,1447]},"callee":null}}},"github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","kind":"method","span":{"start":[33,1],"end":[35,2],"bytes":[1076,1190]},"signature":"github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","parameters":[{"name":"now","type":"time.Time","span":{"start":[33,1],"end":[33,72],"bytes":[1076,1147]}}],"return_type":"time.Time","metrics":{"cyclomatic":1},"body":{"34:9":{"kind":"call","span":{"start":[34,9],"end":[34,35],"bytes":[1156,1182]},"callee":null}}}},"fields":{"Interval":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/Interval","kind":"field","type":"time.Duration","span":{"start":[28,1],"end":[28,24],"bytes":[898,921]}},"Level":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/Level","kind":"field","type":"int","span":{"start":[25,1],"end":[25,11],"bytes":[815,825]}}}},"CompactionLevels":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels","kind":"struct","span":{"start":[44,1],"end":[44,41],"bytes":[1550,1590]},"callables":{"github.com/benbjohnson/litestream.CompactionLevels.IsValidLevel":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.IsValidLevel","kind":"method","span":{"start":[88,1],"end":[93,2],"bytes":[2913,3054]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.IsValidLevel","parameters":[{"name":"level","type":"int","span":{"start":[88,1],"end":[88,57],"bytes":[2913,2969]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"92:31":{"kind":"call","span":{"start":[92,31],"end":[92,37],"bytes":[3046,3052]},"callee":null}}},"github.com/benbjohnson/litestream.CompactionLevels.Level":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Level","kind":"method","span":{"start":[48,1],"end":[56,2],"bytes":[1724,2013]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.Level","parameters":[{"name":"level","type":"int","span":{"start":[48,1],"end":[48,71],"bytes":[1724,1794]}}],"return_type":"(*github.com/benbjohnson/litestream.CompactionLevel, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"50:15":{"kind":"call","span":{"start":[50,15],"end":[50,61],"bytes":[1838,1884]},"callee":null},"52:26":{"kind":"call","span":{"start":[52,26],"end":[52,38],"bytes":[1913,1925]},"callee":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel"},"53:15":{"kind":"call","span":{"start":[53,15],"end":[53,59],"bytes":[1942,1986]},"callee":null}}},"github.com/benbjohnson/litestream.CompactionLevels.MaxLevel":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","kind":"method","span":{"start":[59,1],"end":[61,2],"bytes":[2077,2140]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","parameters":[],"return_type":"int","metrics":{"cyclomatic":1},"body":{"60:9":{"kind":"call","span":{"start":[60,9],"end":[60,15],"bytes":[2128,2134]},"callee":null}}},"github.com/benbjohnson/litestream.CompactionLevels.NextLevel":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.NextLevel","kind":"method","span":{"start":[106,1],"end":[113,2],"bytes":[3370,3544]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.NextLevel","parameters":[{"name":"level","type":"int","span":{"start":[106,1],"end":[106,53],"bytes":[3370,3422]}}],"return_type":"int","metrics":{"cyclomatic":3},"body":{"109:21":{"kind":"call","span":{"start":[109,21],"end":[109,33],"bytes":[3484,3496]},"callee":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel"}}},"github.com/benbjohnson/litestream.CompactionLevels.PrevLevel":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel","kind":"method","span":{"start":[97,1],"end":[102,2],"bytes":[3153,3279]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.PrevLevel","parameters":[{"name":"level","type":"int","span":{"start":[97,1],"end":[97,53],"bytes":[3153,3205]}}],"return_type":"int","metrics":{"cyclomatic":2},"body":{"99:10":{"kind":"call","span":{"start":[99,10],"end":[99,22],"bytes":[3244,3256]},"callee":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel"}}},"github.com/benbjohnson/litestream.CompactionLevels.Validate":{"id":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate","kind":"method","span":{"start":[64,1],"end":[85,2],"bytes":[2198,2837]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.Validate","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"65:5":{"kind":"call","span":{"start":[65,5],"end":[65,11],"bytes":[2247,2253]},"callee":null},"66:10":{"kind":"call","span":{"start":[66,10],"end":[66,65],"bytes":[2270,2325]},"callee":null},"71:11":{"kind":"call","span":{"start":[71,11],"end":[71,92],"bytes":[2387,2468]},"callee":null},"73:11":{"kind":"call","span":{"start":[73,11],"end":[73,75],"bytes":[2521,2585]},"callee":null},"77:11":{"kind":"call","span":{"start":[77,11],"end":[77,69],"bytes":[2644,2702]},"callee":null},"81:11":{"kind":"call","span":{"start":[81,11],"end":[81,66],"bytes":[2761,2816]},"callee":null}}}}}},"functions":{},"content_hash":"744ac7ec8fbcc2267945fbae48919c5b8a47f37cd2ea08b3a78c852dee2b895d"},"compactor.go":{"id":"can://go/litestream/compactor.go","kind":"module","span":{"start":[1,1],"end":[427,1],"bytes":[0,12016]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// Compactor handles compaction and retention for LTX files.\n// It operates solely through the ReplicaClient interface, making it\n// suitable for both DB (with local file caching) and VFS (remote-only).\ntype Compactor struct {\n\tclient ReplicaClient\n\tlogger *slog.Logger\n\n\t// VerifyCompaction enables post-compaction TXID consistency verification.\n\t// When enabled, verifies that files at the destination level have\n\t// contiguous TXID ranges after each compaction. Disabled by default.\n\tVerifyCompaction bool\n\n\t// RetentionEnabled controls whether Litestream actively deletes old files\n\t// during retention enforcement. When false, cloud provider lifecycle\n\t// policies handle retention instead. Local file cleanup still occurs.\n\tRetentionEnabled bool\n\n\t// CompactionVerifyErrorCounter is incremented when post-compaction\n\t// verification fails. Optional; if nil, no metric is recorded.\n\tCompactionVerifyErrorCounter prometheus.Counter\n\n\t// LocalFileOpener optionally opens a local LTX file for compaction.\n\t// If nil or returns os.ErrNotExist, falls back to remote.\n\t// This is used by DB to prefer local files over remote for consistency.\n\tLocalFileOpener func(level int, minTXID, maxTXID ltx.TXID) (io.ReadCloser, error)\n\n\t// LocalFileDeleter optionally deletes local LTX files after retention.\n\t// If nil, only remote files are deleted.\n\tLocalFileDeleter func(level int, minTXID, maxTXID ltx.TXID) error\n\n\t// CacheGetter optionally retrieves cached MaxLTXFileInfo for a level.\n\t// If nil, max file info is always fetched from remote.\n\tCacheGetter func(level int) (*ltx.FileInfo, bool)\n\n\t// CacheSetter optionally stores MaxLTXFileInfo for a level.\n\t// If nil, max file info is not cached.\n\tCacheSetter func(level int, info *ltx.FileInfo)\n}\n\n// NewCompactor creates a new Compactor with the given client and logger.\nfunc NewCompactor(client ReplicaClient, logger *slog.Logger) *Compactor {\n\tif logger == nil {\n\t\tlogger = slog.Default()\n\t}\n\treturn \u0026Compactor{\n\t\tclient: client,\n\t\tlogger: logger,\n\t\tRetentionEnabled: true,\n\t}\n}\n\nfunc (c *Compactor) setLogger(logger *slog.Logger) {\n\tc.logger = logger\n}\n\n// MaxLTXFileInfo returns metadata for the last LTX file in a level.\n// Uses cache if available, otherwise fetches from remote.\nfunc (c *Compactor) MaxLTXFileInfo(ctx context.Context, level int) (ltx.FileInfo, error) {\n\tif c.CacheGetter != nil {\n\t\tif info, ok := c.CacheGetter(level); ok {\n\t\t\treturn *info, nil\n\t\t}\n\t}\n\n\titr, err := c.client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn ltx.FileInfo{}, err\n\t}\n\tdefer itr.Close()\n\n\tvar info ltx.FileInfo\n\tfor itr.Next() {\n\t\titem := itr.Item()\n\t\tif item.MaxTXID \u003e info.MaxTXID {\n\t\t\tinfo = *item\n\t\t}\n\t}\n\n\tif c.CacheSetter != nil \u0026\u0026 info.MaxTXID \u003e 0 {\n\t\tc.CacheSetter(level, \u0026info)\n\t}\n\n\treturn info, itr.Close()\n}\n\n// Compact compacts source level files into the destination level.\n// Returns ErrNoCompaction if there are no files to compact.\nfunc (c *Compactor) Compact(ctx context.Context, dstLevel int) (*ltx.FileInfo, error) {\n\tsrcLevel := dstLevel - 1\n\n\tprevMaxInfo, err := c.MaxLTXFileInfo(ctx, dstLevel)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cannot determine max ltx file for destination level: %w\", err)\n\t}\n\tseekTXID := prevMaxInfo.MaxTXID + 1\n\n\titr, err := c.client.LTXFiles(ctx, srcLevel, seekTXID, false)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"source ltx files after %s: %w\", seekTXID, err)\n\t}\n\tdefer itr.Close()\n\n\tvar rdrs []io.Reader\n\tdefer func() {\n\t\tfor _, rd := range rdrs {\n\t\t\tif closer, ok := rd.(io.Closer); ok {\n\t\t\t\t_ = closer.Close()\n\t\t\t}\n\t\t}\n\t}()\n\n\tvar minTXID, maxTXID ltx.TXID\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\n\t\tif minTXID == 0 || info.MinTXID \u003c minTXID {\n\t\t\tminTXID = info.MinTXID\n\t\t}\n\t\tif maxTXID == 0 || info.MaxTXID \u003e maxTXID {\n\t\t\tmaxTXID = info.MaxTXID\n\t\t}\n\n\t\tif c.LocalFileOpener != nil {\n\t\t\tif f, err := c.LocalFileOpener(srcLevel, info.MinTXID, info.MaxTXID); err == nil {\n\t\t\t\trdrs = append(rdrs, f)\n\t\t\t\tcontinue\n\t\t\t} else if !os.IsNotExist(err) {\n\t\t\t\treturn nil, fmt.Errorf(\"open local ltx file: %w\", err)\n\t\t\t}\n\t\t}\n\n\t\tf, err := c.client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, 0, 0)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"open ltx file: %w\", err)\n\t\t}\n\t\trdrs = append(rdrs, internal.NewResumableReader(ctx, c.client, info.Level, info.MinTXID, info.MaxTXID, info.Size, f, c.logger))\n\t}\n\tif len(rdrs) == 0 {\n\t\treturn nil, ErrNoCompaction\n\t}\n\n\tpr, pw := io.Pipe()\n\tgo func() {\n\t\tcomp, err := ltx.NewCompactor(pw, rdrs)\n\t\tif err != nil {\n\t\t\t_ = pw.CloseWithError(fmt.Errorf(\"new ltx compactor: %w\", err))\n\t\t\treturn\n\t\t}\n\t\tcomp.HeaderFlags = ltx.HeaderFlagNoChecksum\n\t\t_ = pw.CloseWithError(comp.Compact(ctx))\n\t}()\n\n\tinfo, err := c.client.WriteLTXFile(ctx, dstLevel, minTXID, maxTXID, pr)\n\t_ = pr.CloseWithError(err)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"write ltx file: %w\", err)\n\t}\n\n\tif c.CacheSetter != nil {\n\t\tc.CacheSetter(dstLevel, info)\n\t}\n\n\t// Verify level consistency if enabled\n\tif c.VerifyCompaction {\n\t\tif err := c.VerifyLevelConsistency(ctx, dstLevel); err != nil {\n\t\t\tc.logger.Warn(\"post-compaction verification failed\",\n\t\t\t\t\"level\", dstLevel,\n\t\t\t\t\"error\", err)\n\t\t\tif c.CompactionVerifyErrorCounter != nil {\n\t\t\t\tc.CompactionVerifyErrorCounter.Inc()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn info, nil\n}\n\n// VerifyLevelConsistency checks that LTX files at the given level have\n// contiguous TXID ranges (prevMaxTXID + 1 == currMinTXID for consecutive files).\n// Returns an error describing any gaps or overlaps found.\nfunc (c *Compactor) VerifyLevelConsistency(ctx context.Context, level int) error {\n\titr, err := c.client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar prevInfo *ltx.FileInfo\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\n\t\t// Skip first file - nothing to compare against\n\t\tif prevInfo == nil {\n\t\t\tprevInfo = info\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check for TXID contiguity: prev.MaxTXID + 1 should equal curr.MinTXID\n\t\texpectedMinTXID := prevInfo.MaxTXID + 1\n\t\tif info.MinTXID != expectedMinTXID {\n\t\t\tif info.MinTXID \u003e expectedMinTXID {\n\t\t\t\treturn fmt.Errorf(\"TXID gap detected: prev.MaxTXID=%s, next.MinTXID=%s (expected %s)\",\n\t\t\t\t\tprevInfo.MaxTXID, info.MinTXID, expectedMinTXID)\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"TXID overlap detected: prev.MaxTXID=%s, next.MinTXID=%s\",\n\t\t\t\tprevInfo.MaxTXID, info.MinTXID)\n\t\t}\n\n\t\tprevInfo = info\n\t}\n\n\tif err := itr.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close iterator: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// EnforceSnapshotRetention enforces retention of snapshot level files by timestamp.\n// Files older than the retention duration are deleted (except the newest is always kept).\n// Returns the minimum snapshot TXID still retained (useful for cascading retention to lower levels).\nfunc (c *Compactor) EnforceSnapshotRetention(ctx context.Context, retention time.Duration) (ltx.TXID, error) {\n\ttimestamp := time.Now().Add(-retention)\n\tc.logger.Debug(\"enforcing snapshot retention\", \"timestamp\", timestamp)\n\n\titr, err := c.client.LTXFiles(ctx, SnapshotLevel, 0, false)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar deleted []*ltx.FileInfo\n\tvar lastInfo *ltx.FileInfo\n\tvar minSnapshotTXID ltx.TXID\n\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tlastInfo = info\n\n\t\tif info.CreatedAt.Before(timestamp) {\n\t\t\tdeleted = append(deleted, info)\n\t\t\tcontinue\n\t\t}\n\n\t\tif minSnapshotTXID == 0 || info.MaxTXID \u003c minSnapshotTXID {\n\t\t\tminSnapshotTXID = info.MaxTXID\n\t\t}\n\t}\n\n\tif len(deleted) \u003e 0 \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\tif !c.RetentionEnabled {\n\t\tc.logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", SnapshotLevel, \"count\", len(deleted))\n\t} else if err := c.client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn 0, fmt.Errorf(\"remove ltx files: %w\", err)\n\t}\n\n\tif c.LocalFileDeleter != nil {\n\t\tfor _, info := range deleted {\n\t\t\tc.logger.Debug(\"deleting local ltx file\",\n\t\t\t\t\"level\", SnapshotLevel,\n\t\t\t\t\"minTXID\", info.MinTXID,\n\t\t\t\t\"maxTXID\", info.MaxTXID)\n\t\t\tif err := c.LocalFileDeleter(SnapshotLevel, info.MinTXID, info.MaxTXID); err != nil {\n\t\t\t\tc.logger.Error(\"failed to remove local ltx file\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn minSnapshotTXID, nil\n}\n\n// EnforceRetentionByTXID deletes files at the given level with maxTXID below the target.\n// Always keeps at least one file.\nfunc (c *Compactor) EnforceRetentionByTXID(ctx context.Context, level int, txID ltx.TXID) error {\n\tc.logger.Debug(\"enforcing retention\", \"level\", level, \"txid\", txID)\n\n\titr, err := c.client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar deleted []*ltx.FileInfo\n\tvar lastInfo *ltx.FileInfo\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tlastInfo = info\n\n\t\tif info.MaxTXID \u003c txID {\n\t\t\tdeleted = append(deleted, info)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tif len(deleted) \u003e 0 \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\tif !c.RetentionEnabled {\n\t\tc.logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", level, \"count\", len(deleted))\n\t} else if err := c.client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn fmt.Errorf(\"remove ltx files: %w\", err)\n\t}\n\n\tif c.LocalFileDeleter != nil {\n\t\tfor _, info := range deleted {\n\t\t\tc.logger.Debug(\"deleting local ltx file\",\n\t\t\t\t\"level\", level,\n\t\t\t\t\"minTXID\", info.MinTXID,\n\t\t\t\t\"maxTXID\", info.MaxTXID)\n\t\t\tif err := c.LocalFileDeleter(level, info.MinTXID, info.MaxTXID); err != nil {\n\t\t\t\tc.logger.Error(\"failed to remove local ltx file\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// EnforceL0Retention retains L0 files based on L1 compaction progress and time.\n// Files are only deleted if they have been compacted into L1 AND are older than retention.\n// This ensures contiguous L0 coverage for VFS reads.\nfunc (c *Compactor) EnforceL0Retention(ctx context.Context, retention time.Duration) error {\n\tif retention \u003c= 0 {\n\t\treturn nil\n\t}\n\n\tc.logger.Debug(\"enforcing l0 retention\", \"retention\", retention)\n\n\titr, err := c.client.LTXFiles(ctx, 1, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch l1 files: %w\", err)\n\t}\n\tvar maxL1TXID ltx.TXID\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tif info.MaxTXID \u003e maxL1TXID {\n\t\t\tmaxL1TXID = info.MaxTXID\n\t\t}\n\t}\n\tif err := itr.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close l1 iterator: %w\", err)\n\t}\n\tif maxL1TXID == 0 {\n\t\treturn nil\n\t}\n\n\tthreshold := time.Now().Add(-retention)\n\titr, err = c.client.LTXFiles(ctx, 0, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch l0 files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar (\n\t\tdeleted []*ltx.FileInfo\n\t\tlastInfo *ltx.FileInfo\n\t\tprocessedAll = true\n\t)\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tlastInfo = info\n\n\t\tcreatedAt := info.CreatedAt\n\t\tif createdAt.IsZero() {\n\t\t\tcreatedAt = threshold\n\t\t}\n\n\t\tif createdAt.After(threshold) {\n\t\t\tprocessedAll = false\n\t\t\tbreak\n\t\t}\n\n\t\tif info.MaxTXID \u003c= maxL1TXID {\n\t\t\tdeleted = append(deleted, info)\n\t\t}\n\t}\n\n\tif processedAll \u0026\u0026 len(deleted) \u003e 0 \u0026\u0026 lastInfo != nil \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\tif len(deleted) == 0 {\n\t\treturn nil\n\t}\n\n\tif !c.RetentionEnabled {\n\t\tc.logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", 0, \"count\", len(deleted))\n\t} else if err := c.client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn fmt.Errorf(\"remove expired l0 files: %w\", err)\n\t}\n\n\tif c.LocalFileDeleter != nil {\n\t\tfor _, info := range deleted {\n\t\t\tc.logger.Debug(\"deleting expired local l0 file\",\n\t\t\t\t\"minTXID\", info.MinTXID,\n\t\t\t\t\"maxTXID\", info.MaxTXID)\n\t\t\tif err := c.LocalFileDeleter(0, info.MinTXID, info.MaxTXID); err != nil {\n\t\t\t\tc.logger.Error(\"failed to remove local l0 file\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tc.logger.Info(\"l0 retention enforced\", \"deleted_count\", len(deleted), \"max_l1_txid\", maxL1TXID)\n\n\treturn nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"fmt","path":"fmt","span":{"start":[5,1],"end":[5,7],"bytes":[40,46]}},{"name":"io","path":"io","span":{"start":[6,1],"end":[6,6],"bytes":[47,52]}},{"name":"slog","path":"log/slog","span":{"start":[7,1],"end":[7,12],"bytes":[53,64]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[65,70]}},{"name":"time","path":"time","span":{"start":[9,1],"end":[9,8],"bytes":[71,78]}},{"name":"prometheus","path":"github.com/prometheus/client_golang/prometheus","span":{"start":[11,1],"end":[11,50],"bytes":[80,129]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[12,1],"end":[12,27],"bytes":[130,156]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[14,1],"end":[14,46],"bytes":[158,203]}}],"types":{"Compactor":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor","kind":"struct","span":{"start":[20,1],"end":[54,2],"bytes":[410,1950]},"callables":{"github.com/benbjohnson/litestream.Compactor.Compact":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","kind":"method","span":{"start":[104,1],"end":[192,2],"bytes":[3132,5454]},"signature":"github.com/benbjohnson/litestream.Compactor.Compact","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[104,1],"end":[104,88],"bytes":[3132,3219]}},{"name":"dstLevel","type":"int","span":{"start":[104,1],"end":[104,88],"bytes":[3132,3219]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":19},"body":{"107:22":{"kind":"call","span":{"start":[107,22],"end":[107,53],"bytes":[3268,3299]},"callee":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo"},"109:15":{"kind":"call","span":{"start":[109,15],"end":[109,89],"bytes":[3331,3405]},"callee":null},"113:14":{"kind":"call","span":{"start":[113,14],"end":[113,63],"bytes":[3460,3509]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"115:15":{"kind":"call","span":{"start":[115,15],"end":[115,73],"bytes":[3541,3599]},"callee":null},"117:8":{"kind":"call","span":{"start":[117,8],"end":[117,19],"bytes":[3610,3621]},"callee":null},"120:8":{"kind":"call","span":{"start":[120,8],"end":[126,5],"bytes":[3652,3766]},"callee":null},"129:6":{"kind":"call","span":{"start":[129,6],"end":[129,16],"bytes":[3804,3814]},"callee":null},"130:11":{"kind":"call","span":{"start":[130,11],"end":[130,21],"bytes":[3827,3837]},"callee":null},"140:17":{"kind":"call","span":{"start":[140,17],"end":[140,72],"bytes":[4040,4095]},"callee":null},"141:12":{"kind":"call","span":{"start":[141,12],"end":[141,27],"bytes":[4121,4136]},"callee":null},"143:15":{"kind":"call","span":{"start":[143,15],"end":[143,33],"bytes":[4164,4182]},"callee":null},"144:17":{"kind":"call","span":{"start":[144,17],"end":[144,59],"bytes":[4201,4243]},"callee":null},"148:13":{"kind":"call","span":{"start":[148,13],"end":[148,84],"bytes":[4266,4337]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"150:16":{"kind":"call","span":{"start":[150,16],"end":[150,52],"bytes":[4371,4407]},"callee":null},"152:10":{"kind":"call","span":{"start":[152,10],"end":[152,130],"bytes":[4421,4541]},"callee":null},"152:23":{"kind":"call","span":{"start":[152,23],"end":[152,129],"bytes":[4434,4540]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader"},"154:5":{"kind":"call","span":{"start":[154,5],"end":[154,14],"bytes":[4549,4558]},"callee":null},"158:12":{"kind":"call","span":{"start":[158,12],"end":[158,21],"bytes":[4611,4620]},"callee":null},"159:5":{"kind":"call","span":{"start":[159,5],"end":[167,5],"bytes":[4625,4868]},"callee":null,"is_goroutine":true},"169:15":{"kind":"call","span":{"start":[169,15],"end":[169,73],"bytes":[4884,4942]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile"},"170:6":{"kind":"call","span":{"start":[170,6],"end":[170,28],"bytes":[4948,4970]},"callee":null},"172:15":{"kind":"call","span":{"start":[172,15],"end":[172,52],"bytes":[5002,5039]},"callee":null},"176:3":{"kind":"call","span":{"start":[176,3],"end":[176,32],"bytes":[5073,5102]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"181:13":{"kind":"call","span":{"start":[181,13],"end":[181,52],"bytes":[5184,5223]},"callee":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency"},"182:4":{"kind":"call","span":{"start":[182,4],"end":[184,18],"bytes":[5241,5334]},"callee":null},"186:5":{"kind":"call","span":{"start":[186,5],"end":[186,41],"bytes":[5385,5421]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_1","kind":"function","span":{"start":[120,1],"end":[126,5],"bytes":[3645,3766]},"signature":"github.com/benbjohnson/litestream.Compactor.Compact.closure_1","parameters":[],"body":{"123:9":{"kind":"call","span":{"start":[123,9],"end":[123,23],"bytes":[3738,3752]},"callee":null}}},"closure_2":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2","kind":"function","span":{"start":[159,1],"end":[167,5],"bytes":[4621,4868]},"signature":"github.com/benbjohnson/litestream.Compactor.Compact.closure_2","parameters":[],"body":{"160:16":{"kind":"call","span":{"start":[160,16],"end":[160,42],"bytes":[4649,4675]},"callee":null},"162:26":{"kind":"call","span":{"start":[162,26],"end":[162,66],"bytes":[4719,4759]},"callee":null},"162:8":{"kind":"call","span":{"start":[162,8],"end":[162,67],"bytes":[4701,4760]},"callee":null},"166:25":{"kind":"call","span":{"start":[166,25],"end":[166,42],"bytes":[4845,4862]},"callee":null},"166:7":{"kind":"call","span":{"start":[166,7],"end":[166,43],"bytes":[4827,4863]},"callee":null}}}}},"github.com/benbjohnson/litestream.Compactor.EnforceL0Retention":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","kind":"method","span":{"start":[342,1],"end":[426,2],"bytes":[10004,12015]},"signature":"github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[342,1],"end":[342,93],"bytes":[10004,10096]}},{"name":"retention","type":"time.Duration","span":{"start":[342,1],"end":[342,93],"bytes":[10004,10096]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":19},"body":{"347:2":{"kind":"call","span":{"start":[347,2],"end":[347,66],"bytes":[10136,10200]},"callee":null},"349:14":{"kind":"call","span":{"start":[349,14],"end":[349,49],"bytes":[10215,10250]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"351:10":{"kind":"call","span":{"start":[351,10],"end":[351,47],"bytes":[10277,10314]},"callee":null},"354:6":{"kind":"call","span":{"start":[354,6],"end":[354,16],"bytes":[10347,10357]},"callee":null},"355:11":{"kind":"call","span":{"start":[355,11],"end":[355,21],"bytes":[10370,10380]},"callee":null},"360:12":{"kind":"call","span":{"start":[360,12],"end":[360,23],"bytes":[10459,10470]},"callee":null},"361:10":{"kind":"call","span":{"start":[361,10],"end":[361,50],"bytes":[10494,10534]},"callee":null},"367:15":{"kind":"call","span":{"start":[367,15],"end":[367,25],"bytes":[10590,10600]},"callee":null},"368:13":{"kind":"call","span":{"start":[368,13],"end":[368,48],"bytes":[10629,10664]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"370:10":{"kind":"call","span":{"start":[370,10],"end":[370,47],"bytes":[10691,10728]},"callee":null},"372:8":{"kind":"call","span":{"start":[372,8],"end":[372,19],"bytes":[10739,10750]},"callee":null},"379:6":{"kind":"call","span":{"start":[379,6],"end":[379,16],"bytes":[10849,10859]},"callee":null},"380:11":{"kind":"call","span":{"start":[380,11],"end":[380,21],"bytes":[10872,10882]},"callee":null},"384:6":{"kind":"call","span":{"start":[384,6],"end":[384,24],"bytes":[10937,10955]},"callee":null},"388:6":{"kind":"call","span":{"start":[388,6],"end":[388,32],"bytes":[10993,11019]},"callee":null},"394:14":{"kind":"call","span":{"start":[394,14],"end":[394,35],"bytes":[11106,11127]},"callee":null},"398:21":{"kind":"call","span":{"start":[398,21],"end":[398,33],"bytes":[11156,11168]},"callee":null},"398:68":{"kind":"call","span":{"start":[398,68],"end":[398,80],"bytes":[11203,11215]},"callee":null},"399:22":{"kind":"call","span":{"start":[399,22],"end":[399,34],"bytes":[11254,11266]},"callee":null},"402:5":{"kind":"call","span":{"start":[402,5],"end":[402,17],"bytes":[11278,11290]},"callee":null},"407:3":{"kind":"call","span":{"start":[407,3],"end":[407,101],"bytes":[11343,11441]},"callee":null},"407:88":{"kind":"call","span":{"start":[407,88],"end":[407,100],"bytes":[11428,11440]},"callee":null},"408:19":{"kind":"call","span":{"start":[408,19],"end":[408,56],"bytes":[11460,11497]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"409:10":{"kind":"call","span":{"start":[409,10],"end":[409,56],"bytes":[11521,11567]},"callee":null},"414:4":{"kind":"call","span":{"start":[414,4],"end":[416,29],"bytes":[11640,11746]},"callee":null},"417:14":{"kind":"call","span":{"start":[417,14],"end":[417,63],"bytes":[11760,11809]},"callee":null},"418:5":{"kind":"call","span":{"start":[418,5],"end":[418,67],"bytes":[11828,11890]},"callee":null},"423:2":{"kind":"call","span":{"start":[423,2],"end":[423,97],"bytes":[11905,12000]},"callee":null},"423:58":{"kind":"call","span":{"start":[423,58],"end":[423,70],"bytes":[11961,11973]},"callee":null}}},"github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","kind":"method","span":{"start":[293,1],"end":[337,2],"bytes":[8549,9775]},"signature":"github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[293,1],"end":[293,98],"bytes":[8549,8646]}},{"name":"level","type":"int","span":{"start":[293,1],"end":[293,98],"bytes":[8549,8646]}},{"name":"txID","type":"github.com/superfly/ltx.TXID","span":{"start":[293,1],"end":[293,98],"bytes":[8549,8646]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"294:2":{"kind":"call","span":{"start":[294,2],"end":[294,69],"bytes":[8648,8715]},"callee":null},"296:14":{"kind":"call","span":{"start":[296,14],"end":[296,53],"bytes":[8730,8769]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"298:10":{"kind":"call","span":{"start":[298,10],"end":[298,48],"bytes":[8796,8834]},"callee":null},"300:8":{"kind":"call","span":{"start":[300,8],"end":[300,19],"bytes":[8845,8856]},"callee":null},"304:6":{"kind":"call","span":{"start":[304,6],"end":[304,16],"bytes":[8920,8930]},"callee":null},"305:11":{"kind":"call","span":{"start":[305,11],"end":[305,21],"bytes":[8943,8953]},"callee":null},"309:14":{"kind":"call","span":{"start":[309,14],"end":[309,35],"bytes":[9013,9034]},"callee":null},"314:33":{"kind":"call","span":{"start":[314,33],"end":[314,45],"bytes":[9087,9099]},"callee":null},"314:5":{"kind":"call","span":{"start":[314,5],"end":[314,17],"bytes":[9059,9071]},"callee":null},"315:22":{"kind":"call","span":{"start":[315,22],"end":[315,34],"bytes":[9138,9150]},"callee":null},"319:3":{"kind":"call","span":{"start":[319,3],"end":[319,105],"bytes":[9186,9288]},"callee":null},"319:92":{"kind":"call","span":{"start":[319,92],"end":[319,104],"bytes":[9275,9287]},"callee":null},"320:19":{"kind":"call","span":{"start":[320,19],"end":[320,56],"bytes":[9307,9344]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"321:10":{"kind":"call","span":{"start":[321,10],"end":[321,49],"bytes":[9368,9407]},"callee":null},"326:4":{"kind":"call","span":{"start":[326,4],"end":[329,29],"bytes":[9480,9599]},"callee":null},"330:14":{"kind":"call","span":{"start":[330,14],"end":[330,67],"bytes":[9613,9666]},"callee":null},"331:5":{"kind":"call","span":{"start":[331,5],"end":[331,68],"bytes":[9685,9748]},"callee":null}}},"github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","kind":"method","span":{"start":[238,1],"end":[289,2],"bytes":[6939,8422]},"signature":"github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[238,1],"end":[238,111],"bytes":[6939,7049]}},{"name":"retention","type":"time.Duration","span":{"start":[238,1],"end":[238,111],"bytes":[6939,7049]}}],"return_type":"(github.com/superfly/ltx.TXID, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"239:15":{"kind":"call","span":{"start":[239,15],"end":[239,25],"bytes":[7064,7074]},"callee":null},"240:2":{"kind":"call","span":{"start":[240,2],"end":[240,72],"bytes":[7092,7162]},"callee":null},"242:14":{"kind":"call","span":{"start":[242,14],"end":[242,61],"bytes":[7177,7224]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"244:13":{"kind":"call","span":{"start":[244,13],"end":[244,51],"bytes":[7254,7292]},"callee":null},"246:8":{"kind":"call","span":{"start":[246,8],"end":[246,19],"bytes":[7303,7314]},"callee":null},"252:6":{"kind":"call","span":{"start":[252,6],"end":[252,16],"bytes":[7409,7419]},"callee":null},"253:11":{"kind":"call","span":{"start":[253,11],"end":[253,21],"bytes":[7432,7442]},"callee":null},"256:6":{"kind":"call","span":{"start":[256,6],"end":[256,38],"bytes":[7467,7499]},"callee":null},"257:14":{"kind":"call","span":{"start":[257,14],"end":[257,35],"bytes":[7515,7536]},"callee":null},"266:33":{"kind":"call","span":{"start":[266,33],"end":[266,45],"bytes":[7690,7702]},"callee":null},"266:5":{"kind":"call","span":{"start":[266,5],"end":[266,17],"bytes":[7662,7674]},"callee":null},"267:22":{"kind":"call","span":{"start":[267,22],"end":[267,34],"bytes":[7741,7753]},"callee":null},"271:100":{"kind":"call","span":{"start":[271,100],"end":[271,112],"bytes":[7886,7898]},"callee":null},"271:3":{"kind":"call","span":{"start":[271,3],"end":[271,113],"bytes":[7789,7899]},"callee":null},"272:19":{"kind":"call","span":{"start":[272,19],"end":[272,56],"bytes":[7918,7955]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"273:13":{"kind":"call","span":{"start":[273,13],"end":[273,52],"bytes":[7982,8021]},"callee":null},"278:4":{"kind":"call","span":{"start":[278,4],"end":[281,29],"bytes":[8094,8221]},"callee":null},"282:14":{"kind":"call","span":{"start":[282,14],"end":[282,75],"bytes":[8235,8296]},"callee":null},"283:5":{"kind":"call","span":{"start":[283,5],"end":[283,68],"bytes":[8315,8378]},"callee":null}}},"github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo","kind":"method","span":{"start":[74,1],"end":[100,2],"bytes":[2460,3002]},"signature":"github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[74,1],"end":[74,91],"bytes":[2460,2550]}},{"name":"level","type":"int","span":{"start":[74,1],"end":[74,91],"bytes":[2460,2550]}}],"return_type":"(github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"76:18":{"kind":"call","span":{"start":[76,18],"end":[76,38],"bytes":[2595,2615]},"callee":null},"81:14":{"kind":"call","span":{"start":[81,14],"end":[81,53],"bytes":[2664,2703]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"85:8":{"kind":"call","span":{"start":[85,8],"end":[85,19],"bytes":[2760,2771]},"callee":null},"88:6":{"kind":"call","span":{"start":[88,6],"end":[88,16],"bytes":[2801,2811]},"callee":null},"89:11":{"kind":"call","span":{"start":[89,11],"end":[89,21],"bytes":[2824,2834]},"callee":null},"96:3":{"kind":"call","span":{"start":[96,3],"end":[96,30],"bytes":[2943,2970]},"callee":null},"99:15":{"kind":"call","span":{"start":[99,15],"end":[99,26],"bytes":[2989,3000]},"callee":null}}},"github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","kind":"method","span":{"start":[197,1],"end":[233,2],"bytes":[5669,6659]},"signature":"github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[197,1],"end":[197,83],"bytes":[5669,5751]}},{"name":"level","type":"int","span":{"start":[197,1],"end":[197,83],"bytes":[5669,5751]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"198:14":{"kind":"call","span":{"start":[198,14],"end":[198,53],"bytes":[5765,5804]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"200:10":{"kind":"call","span":{"start":[200,10],"end":[200,48],"bytes":[5831,5869]},"callee":null},"202:8":{"kind":"call","span":{"start":[202,8],"end":[202,19],"bytes":[5880,5891]},"callee":null},"205:6":{"kind":"call","span":{"start":[205,6],"end":[205,16],"bytes":[5926,5936]},"callee":null},"206:11":{"kind":"call","span":{"start":[206,11],"end":[206,21],"bytes":[5949,5959]},"callee":null},"218:12":{"kind":"call","span":{"start":[218,12],"end":[219,54],"bytes":[6276,6409]},"callee":null},"221:11":{"kind":"call","span":{"start":[221,11],"end":[222,36],"bytes":[6425,6530]},"callee":null},"228:12":{"kind":"call","span":{"start":[228,12],"end":[228,23],"bytes":[6569,6580]},"callee":null},"229:10":{"kind":"call","span":{"start":[229,10],"end":[229,47],"bytes":[6604,6641]},"callee":null}}},"github.com/benbjohnson/litestream.Compactor.setLogger":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.setLogger","kind":"method","span":{"start":[68,1],"end":[70,2],"bytes":[2257,2330]},"signature":"github.com/benbjohnson/litestream.Compactor.setLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[68,1],"end":[68,53],"bytes":[2257,2309]}}],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"CacheGetter":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/CacheGetter","kind":"field","type":"func(level int) (*github.com/superfly/ltx.FileInfo, bool)","span":{"start":[49,1],"end":[49,51],"bytes":[1745,1795]}},"CacheSetter":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/CacheSetter","kind":"field","type":"func(level int, info *github.com/superfly/ltx.FileInfo)","span":{"start":[53,1],"end":[53,49],"bytes":[1900,1948]}},"CompactionVerifyErrorCounter":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/CompactionVerifyErrorCounter","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Counter","span":{"start":[36,1],"end":[36,49],"bytes":[1094,1142]}},"LocalFileDeleter":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/LocalFileDeleter","kind":"field","type":"func(level int, minTXID github.com/superfly/ltx.TXID, maxTXID github.com/superfly/ltx.TXID) error","span":{"start":[45,1],"end":[45,67],"bytes":[1548,1614]}},"LocalFileOpener":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/LocalFileOpener","kind":"field","type":"func(level int, minTXID github.com/superfly/ltx.TXID, maxTXID github.com/superfly/ltx.TXID) (io.ReadCloser, error)","span":{"start":[41,1],"end":[41,83],"bytes":[1348,1430]}},"RetentionEnabled":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/RetentionEnabled","kind":"field","type":"bool","span":{"start":[32,1],"end":[32,23],"bytes":[936,958]}},"VerifyCompaction":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/VerifyCompaction","kind":"field","type":"bool","span":{"start":[27,1],"end":[27,23],"bytes":[693,715]}},"client":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/client","kind":"field","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[21,1],"end":[21,22],"bytes":[434,455]}},"logger":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[22,1],"end":[22,21],"bytes":[456,476]}}}}},"functions":{"github.com/benbjohnson/litestream.NewCompactor":{"id":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.NewCompactor","kind":"function","span":{"start":[57,1],"end":[66,2],"bytes":[2026,2255]},"signature":"github.com/benbjohnson/litestream.NewCompactor","parameters":[{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[57,1],"end":[57,74],"bytes":[2026,2099]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[57,1],"end":[57,74],"bytes":[2026,2099]}}],"return_type":"*github.com/benbjohnson/litestream.Compactor","metrics":{"cyclomatic":2},"body":{"59:12":{"kind":"call","span":{"start":[59,12],"end":[59,26],"bytes":[2131,2145]},"callee":null}}}},"content_hash":"03305762391ff87adf9ad389d530c981333c4ad82035b223a3b612ac6612cb9b"},"db.go":{"id":"can://go/litestream/db.go","kind":"module","span":{"start":[1,1],"end":[3492,1],"bytes":[0,111886]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"database/sql\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc64\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/promauto\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/semaphore\"\n\t\"modernc.org/sqlite\"\n\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// Default DB settings.\nconst (\n\tDefaultMonitorInterval = 1 * time.Second\n\tDefaultCheckpointInterval = 1 * time.Minute\n\tDefaultBusyTimeout = 1 * time.Second\n\tDefaultMinCheckpointPageN = 1000\n\tDefaultTruncatePageN = 121359 // ~500MB with 4KB page size\n\tDefaultMaxSyncWALBytes = 64 \u003c\u003c 20\n\tDefaultShutdownSyncTimeout = 30 * time.Second\n\tDefaultShutdownSyncInterval = 500 * time.Millisecond\n\n\t// Sync error backoff configuration.\n\t// When sync errors occur repeatedly (e.g., disk full), backoff doubles each time.\n\tDefaultSyncBackoffMax = 5 * time.Minute // Maximum backoff between retries\n\tSyncErrorLogInterval = 30 * time.Second // Rate-limit repeated error logging\n)\n\n// DB represents a managed instance of a SQLite database in the file system.\n//\n// Checkpoint Strategy:\n// Litestream uses a progressive 3-tier checkpoint approach to balance WAL size\n// management with write availability:\n//\n// 1. MinCheckpointPageN (PASSIVE): Non-blocking checkpoint at ~1k pages (~4MB).\n// Attempts checkpoint but allows concurrent readers/writers.\n//\n// 2. CheckpointInterval (PASSIVE): Time-based non-blocking checkpoint.\n// Ensures regular checkpointing even with low write volume.\n//\n// 3. TruncatePageN (TRUNCATE): Blocking checkpoint at ~121k pages (~500MB).\n// Emergency brake for runaway WAL growth. Can block writes while waiting\n// for long-lived read transactions. Configurable with a default backstop.\n//\n// The RESTART checkpoint mode was permanently removed due to production issues\n// with indefinite write blocking (issue #724). All checkpoints now use either\n// PASSIVE (non-blocking) or TRUNCATE (emergency only) modes.\ntype DB struct {\n\tmu sync.RWMutex\n\texecSem *semaphore.Weighted\n\tpath string // part to database\n\tmetaPath string // Path to the database metadata.\n\tdb *sql.DB // target database\n\tf *os.File // long-running db file descriptor\n\trtx *sql.Tx // long running read transaction\n\tpageSize int // page size, in bytes\n\tnotify chan struct{} // closes on WAL change\n\tchkMu sync.RWMutex // checkpoint lock\n\topened bool // true if Open() was called and Close() not yet called\n\tsyncState syncState\n\tsyncDiag diagState\n\n\t// last file info for each level\n\tmaxLTXFileInfos struct {\n\t\tsync.Mutex\n\t\tm map[int]*ltx.FileInfo\n\t}\n\n\t// Cached position from the latest L0 LTX file.\n\t// nil means cache is invalid; non-nil is the cached position.\n\tpos struct {\n\t\tsync.Mutex\n\t\tvalue *ltx.Pos\n\t}\n\n\tfileInfo os.FileInfo // db info cached during init\n\tdirInfo os.FileInfo // parent dir info cached during init\n\n\t// openLTXFile opens LTX staging files; overridable in tests to\n\t// inject filesystem errors such as ENOSPC.\n\topenLTXFile func(name string, flag int, perm os.FileMode) (ltxStagingFile, error)\n\n\tctx context.Context\n\tcancel func()\n\twg sync.WaitGroup\n\tDone \u003c-chan struct{}\n\n\t// Metrics\n\tmetricsRegistered bool\n\tdbSizeGauge prometheus.Gauge\n\twalSizeGauge prometheus.Gauge\n\ttotalWALBytesCounter prometheus.Counter\n\ttxIDGauge prometheus.Gauge\n\tsyncNCounter prometheus.Counter\n\tsyncErrorNCounter prometheus.Counter\n\tsyncSecondsCounter prometheus.Counter\n\tdiskFullGauge prometheus.Gauge\n\tcheckpointNCounterVec *prometheus.CounterVec\n\tcheckpointErrorNCounterVec *prometheus.CounterVec\n\tcheckpointSecondsCounterVec *prometheus.CounterVec\n\n\t// Minimum threshold of WAL size, in pages, before a passive checkpoint.\n\t// A passive checkpoint will attempt a checkpoint but fail if there are\n\t// active transactions occurring at the same time.\n\t//\n\t// Uses PASSIVE checkpoint mode (non-blocking). Keeps WAL size manageable\n\t// for faster restores. Default: 1000 pages (~4MB with 4KB page size).\n\tMinCheckpointPageN int\n\n\t// Threshold of WAL size, in pages, before a forced truncation checkpoint.\n\t// A forced truncation checkpoint will block new transactions and wait for\n\t// existing transactions to finish before issuing a checkpoint and\n\t// truncating the WAL.\n\t//\n\t// Uses TRUNCATE checkpoint mode (blocking). Prevents unbounded WAL growth\n\t// from long-lived read transactions. Default: 121359 pages (~500MB with 4KB\n\t// page size). Set to 0 to retain the default emergency threshold.\n\tTruncatePageN int\n\n\t// Time between automatic checkpoints in the WAL. This is done to allow\n\t// more fine-grained WAL files so that restores can be performed with\n\t// better precision.\n\t//\n\t// Uses PASSIVE checkpoint mode (non-blocking). Default: 1 minute.\n\t// Set to 0 to disable time-based checkpoints.\n\tCheckpointInterval time.Duration\n\n\t// Frequency at which to perform db sync.\n\tMonitorInterval time.Duration\n\n\t// Maximum WAL bytes to process in a single sync executor run.\n\t// The limit is checked at commit boundaries so a single transaction\n\t// larger than this may exceed it. Set to zero to process all\n\t// committed WAL frames in one run.\n\tMaxSyncWALBytes int64\n\n\t// The timeout to wait for EBUSY from SQLite.\n\tBusyTimeout time.Duration\n\n\t// Minimum time to retain L0 files after they have been compacted into L1.\n\tL0Retention time.Duration\n\n\t// VerifyCompaction enables post-compaction TXID consistency verification.\n\t// When enabled, verifies that files at the destination level have\n\t// contiguous TXID ranges after each compaction.\n\tVerifyCompaction bool\n\n\t// RetentionEnabled controls whether Litestream actively deletes old files\n\t// during retention enforcement. When false, cloud provider lifecycle\n\t// policies handle retention instead. Local file cleanup still occurs.\n\tRetentionEnabled bool\n\n\t// Remote replica for the database.\n\t// Must be set before calling Open().\n\tReplica *Replica\n\n\t// Compactor handles shared compaction logic.\n\t// Created in NewDB with nil client; client set once in Open() from Replica.Client.\n\tcompactor *Compactor\n\n\t// Shutdown sync retry settings.\n\t// ShutdownSyncTimeout is the total time to retry syncing on shutdown.\n\t// ShutdownSyncInterval is the time between retry attempts.\n\tShutdownSyncTimeout time.Duration\n\tShutdownSyncInterval time.Duration\n\n\t// lastSuccessfulSyncAt tracks when replication last succeeded.\n\t// Used by heartbeat monitoring to determine if a ping should be sent.\n\tlastSuccessfulSyncMu sync.RWMutex\n\tlastSuccessfulSyncAt time.Time\n\n\t// Where to send log messages, defaults to global slog with database epath.\n\tLogger *slog.Logger\n}\n\n// syncState holds mutable sync-tracking fields extracted from DB.\n// These fields are threaded through sync/checkpoint methods via pointer.\ntype syncState struct {\n\ttruncatePassiveFailed bool\n\n\t// syncedSinceCheckpoint tracks whether any data has been synced since\n\t// the last checkpoint. Used to prevent time-based checkpoints from\n\t// triggering when there are no actual database changes, which would\n\t// otherwise create unnecessary LTX files. See issue #896.\n\tsyncedSinceCheckpoint bool\n\n\t// syncedToWALEnd tracks whether the last successful sync reached the\n\t// exact end of the WAL file. When true, a subsequent WAL truncation\n\t// (from checkpoint) is expected and should NOT trigger a full snapshot.\n\t// This prevents issue #927 where every checkpoint triggers unnecessary\n\t// full snapshots because verify() sees the old LTX position exceeds\n\t// the new (truncated) WAL size.\n\tsyncedToWALEnd bool\n\n\t// lastSyncedWALOffset tracks the logical end of the WAL content after\n\t// the last successful sync. This is the WALOffset + WALSize from the\n\t// last LTX file. Used for checkpoint threshold decisions instead of\n\t// file size, which may include stale frames with old salt values after\n\t// a checkpoint. This prevents issue #997 where PASSIVE checkpoints\n\t// trigger a feedback loop because stale file size exceeds threshold.\n\tlastSyncedWALOffset int64\n}\n\ntype syncExecutor struct {\n\tstate syncState\n\tpos ltx.Pos\n\tposChanged bool\n\tl0FileInfo *ltx.FileInfo\n\tsynced bool\n\tcheckpointAttempted bool\n}\n\ntype diagOp string\n\nconst (\n\tdiagOpSync diagOp = \"sync\"\n\tdiagOpCheckpoint diagOp = \"checkpoint\"\n)\n\ntype diagPhase string\n\nconst (\n\tdiagPhaseStarting diagPhase = \"starting\"\n\tdiagPhaseEnsureWAL diagPhase = \"ensure_wal\"\n\tdiagPhaseVerifyAndSync diagPhase = \"verify_and_sync\"\n\tdiagPhaseCheckpointIfNeeded diagPhase = \"checkpoint_if_needed\"\n\tdiagPhaseUpdateMetrics diagPhase = \"update_metrics\"\n\tdiagPhaseStatWAL diagPhase = \"stat_wal\"\n\tdiagPhaseVerify diagPhase = \"verify\"\n\tdiagPhaseSyncLTX diagPhase = \"sync_ltx\"\n\tdiagPhaseSyncOpenLTX diagPhase = \"sync_open_ltx\"\n\tdiagPhaseSyncPageMap diagPhase = \"sync_page_map\"\n\tdiagPhaseSyncPrepareLTX diagPhase = \"sync_prepare_ltx\"\n\tdiagPhaseWriteLTXFromDB diagPhase = \"write_ltx_from_db\"\n\tdiagPhaseWriteLTXFromWAL diagPhase = \"write_ltx_from_wal\"\n\tdiagPhaseCloseLTX diagPhase = \"close_ltx\"\n\tdiagPhaseFsyncLTX diagPhase = \"fsync_ltx\"\n\tdiagPhaseRenameLTX diagPhase = \"rename_ltx\"\n\tdiagPhaseSyncComplete diagPhase = \"sync_complete\"\n\tdiagPhaseCheckpointLock diagPhase = \"checkpoint_lock\"\n\tdiagPhaseCheckpointReadWALHeader diagPhase = \"checkpoint_read_wal_header\"\n\tdiagPhaseCheckpointCopyBefore diagPhase = \"checkpoint_copy_before\"\n\tdiagPhaseCheckpointExec diagPhase = \"checkpoint_exec\"\n\tdiagPhaseCheckpointVerifyRestart diagPhase = \"checkpoint_verify_restart\"\n\tdiagPhaseCheckpointSnapshotBoundaryLock diagPhase = \"checkpoint_snapshot_boundary_lock\"\n\tdiagPhaseCheckpointSnapshotBoundary diagPhase = \"checkpoint_snapshot_boundary\"\n)\n\ntype diagState struct {\n\tsync.RWMutex\n\tactive bool\n\toperation diagOp\n\tphase diagPhase\n\tstartedAt time.Time\n\tupdatedAt time.Time\n\ttxID ltx.TXID\n\twalSize int64\n\tlastSyncedWALOffset int64\n\tsnapshotting bool\n\tcheckpointMode string\n\treason string\n\terr string\n\texecutorWaiterCount int\n\texecutorWaitStarted time.Time\n}\n\n// SyncDiagnostic reports the latest DB sync/checkpoint activity.\ntype SyncDiagnostic struct {\n\tPath string `json:\"path\"`\n\tActive bool `json:\"active\"`\n\tOperation string `json:\"operation,omitempty\"`\n\tPhase string `json:\"phase,omitempty\"`\n\tStartedAt *time.Time `json:\"started_at,omitempty\"`\n\tUpdatedAt *time.Time `json:\"updated_at,omitempty\"`\n\tElapsedSeconds float64 `json:\"elapsed_seconds,omitempty\"`\n\tTXID uint64 `json:\"txid,omitempty\"`\n\tWALSize int64 `json:\"wal_size,omitempty\"`\n\tLastSyncedWALOffset int64 `json:\"last_synced_wal_offset,omitempty\"`\n\tSnapshotting bool `json:\"snapshotting,omitempty\"`\n\tCheckpointMode string `json:\"checkpoint_mode,omitempty\"`\n\tReason string `json:\"reason,omitempty\"`\n\tError string `json:\"error,omitempty\"`\n\tExecutorWaiterCount int `json:\"executor_waiter_count,omitempty\"`\n\tExecutorWaitStarted *time.Time `json:\"executor_wait_started_at,omitempty\"`\n\tExecutorWaitSeconds float64 `json:\"executor_wait_seconds,omitempty\"`\n}\n\n// NewDB returns a new instance of DB for a given path.\nfunc NewDB(path string) *DB {\n\tdir, file := filepath.Split(path)\n\n\tdb := \u0026DB{\n\t\tpath: path,\n\t\tmetaPath: filepath.Join(dir, \".\"+file+MetaDirSuffix),\n\t\texecSem: semaphore.NewWeighted(1),\n\t\tnotify: make(chan struct{}),\n\n\t\tMinCheckpointPageN: DefaultMinCheckpointPageN,\n\t\tTruncatePageN: DefaultTruncatePageN,\n\t\tCheckpointInterval: DefaultCheckpointInterval,\n\t\tMonitorInterval: DefaultMonitorInterval,\n\t\tMaxSyncWALBytes: DefaultMaxSyncWALBytes,\n\t\tBusyTimeout: DefaultBusyTimeout,\n\t\tL0Retention: DefaultL0Retention,\n\t\tRetentionEnabled: true,\n\t\tShutdownSyncTimeout: DefaultShutdownSyncTimeout,\n\t\tShutdownSyncInterval: DefaultShutdownSyncInterval,\n\t\tLogger: slog.With(LogKeyDB, filepath.Base(path)),\n\t}\n\tdb.maxLTXFileInfos.m = make(map[int]*ltx.FileInfo)\n\tdb.openLTXFile = defaultOpenLTXFile\n\n\tdb.ctx, db.cancel = context.WithCancel(context.Background())\n\n\t// Initialize compactor with nil client (set once in Open() from Replica.Client).\n\tdb.compactor = NewCompactor(nil, db.Logger.With(LogKeySubsystem, LogSubsystemCompactor))\n\tdb.compactor.LocalFileOpener = db.openLocalLTXFile\n\tdb.compactor.LocalFileDeleter = db.deleteLocalLTXFile\n\tdb.initMetrics()\n\tdb.compactor.CacheGetter = func(level int) (*ltx.FileInfo, bool) {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdefer db.maxLTXFileInfos.Unlock()\n\t\tinfo, ok := db.maxLTXFileInfos.m[level]\n\t\treturn info, ok\n\t}\n\tdb.compactor.CacheSetter = func(level int, info *ltx.FileInfo) {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdefer db.maxLTXFileInfos.Unlock()\n\t\tdb.maxLTXFileInfos.m[level] = info\n\t}\n\n\treturn db\n}\n\n// initMetrics creates the per-database Prometheus series.\n// Open calls it again because Close deletes them.\nfunc (db *DB) initMetrics() {\n\tdbMetricOwners.Lock()\n\tdefer dbMetricOwners.Unlock()\n\tif db.metricsRegistered {\n\t\treturn\n\t}\n\tdb.metricsRegistered = true\n\tdbMetricOwners.paths[db.path]++\n\tdbMetricOwners.basenames[filepath.Base(db.path)]++\n\n\tdb.dbSizeGauge = dbSizeGaugeVec.WithLabelValues(db.path)\n\tdb.walSizeGauge = walSizeGaugeVec.WithLabelValues(db.path)\n\tdb.totalWALBytesCounter = totalWALBytesCounterVec.WithLabelValues(db.path)\n\tdb.txIDGauge = txIDIndexGaugeVec.WithLabelValues(db.path)\n\tdb.syncNCounter = syncNCounterVec.WithLabelValues(db.path)\n\tdb.syncErrorNCounter = syncErrorNCounterVec.WithLabelValues(db.path)\n\tdb.syncSecondsCounter = syncSecondsCounterVec.WithLabelValues(db.path)\n\tdb.diskFullGauge = diskFullGaugeVec.WithLabelValues(db.path)\n\tdb.checkpointNCounterVec = checkpointNCounterVec.MustCurryWith(prometheus.Labels{\"db\": db.path})\n\tdb.checkpointErrorNCounterVec = checkpointErrorNCounterVec.MustCurryWith(prometheus.Labels{\"db\": db.path})\n\tdb.checkpointSecondsCounterVec = checkpointSecondsCounterVec.MustCurryWith(prometheus.Labels{\"db\": db.path})\n\tdb.compactor.CompactionVerifyErrorCounter = compactionVerifyErrorCounterVec.WithLabelValues(db.path)\n}\n\n// deleteMetrics removes every per-database series so a process that opens many\n// databases over its lifetime does not accumulate series forever.\nfunc (db *DB) deleteMetrics() {\n\tdbMetricOwners.Lock()\n\tdefer dbMetricOwners.Unlock()\n\tif !db.metricsRegistered {\n\t\treturn\n\t}\n\tdb.metricsRegistered = false\n\n\tname := filepath.Base(db.path)\n\tdbMetricOwners.basenames[name]--\n\tif dbMetricOwners.basenames[name] == 0 {\n\t\tdelete(dbMetricOwners.basenames, name)\n\t\tinternal.L0RetentionGaugeVec.DeletePartialMatch(prometheus.Labels{\"db\": name})\n\t}\n\n\tdbMetricOwners.paths[db.path]--\n\tif dbMetricOwners.paths[db.path] != 0 {\n\t\treturn\n\t}\n\tdelete(dbMetricOwners.paths, db.path)\n\n\tlabels := prometheus.Labels{\"db\": db.path}\n\tdbSizeGaugeVec.DeletePartialMatch(labels)\n\twalSizeGaugeVec.DeletePartialMatch(labels)\n\ttotalWALBytesCounterVec.DeletePartialMatch(labels)\n\ttxIDIndexGaugeVec.DeletePartialMatch(labels)\n\tsyncNCounterVec.DeletePartialMatch(labels)\n\tsyncErrorNCounterVec.DeletePartialMatch(labels)\n\tsyncSecondsCounterVec.DeletePartialMatch(labels)\n\tdiskFullGaugeVec.DeletePartialMatch(labels)\n\tcompactionVerifyErrorCounterVec.DeletePartialMatch(labels)\n\tcheckpointNCounterVec.DeletePartialMatch(labels)\n\tcheckpointErrorNCounterVec.DeletePartialMatch(labels)\n\tcheckpointSecondsCounterVec.DeletePartialMatch(labels)\n}\n\n// SetLogger updates the database logger and propagates to subsystems.\nfunc (db *DB) SetLogger(logger *slog.Logger) {\n\tif logger == nil {\n\t\tlogger = slog.Default()\n\t}\n\tdb.Logger = logger\n\tif db.compactor != nil {\n\t\tdb.compactor.setLogger(logger.With(LogKeySubsystem, LogSubsystemCompactor))\n\t}\n\tif db.Replica != nil \u0026\u0026 db.Replica.Client != nil {\n\t\tdb.Replica.Client.SetLogger(db.Replica.Logger())\n\t}\n}\n\n// SQLDB returns a reference to the underlying sql.DB connection.\nfunc (db *DB) SQLDB() *sql.DB {\n\treturn db.db\n}\n\n// Path returns the path to the database.\nfunc (db *DB) Path() string {\n\treturn db.path\n}\n\n// SyncDiagnostic returns the latest sync/checkpoint diagnostic snapshot.\nfunc (db *DB) SyncDiagnostic() SyncDiagnostic {\n\tdb.syncDiag.RLock()\n\tdefer db.syncDiag.RUnlock()\n\n\tdiag := SyncDiagnostic{\n\t\tPath: db.path,\n\t\tActive: db.syncDiag.active,\n\t\tOperation: string(db.syncDiag.operation),\n\t\tPhase: string(db.syncDiag.phase),\n\t\tTXID: uint64(db.syncDiag.txID),\n\t\tWALSize: db.syncDiag.walSize,\n\t\tLastSyncedWALOffset: db.syncDiag.lastSyncedWALOffset,\n\t\tSnapshotting: db.syncDiag.snapshotting,\n\t\tCheckpointMode: db.syncDiag.checkpointMode,\n\t\tReason: db.syncDiag.reason,\n\t\tError: db.syncDiag.err,\n\t\tExecutorWaiterCount: db.syncDiag.executorWaiterCount,\n\t}\n\tif !db.syncDiag.executorWaitStarted.IsZero() {\n\t\tstartedAt := db.syncDiag.executorWaitStarted\n\t\tdiag.ExecutorWaitStarted = \u0026startedAt\n\t\tdiag.ExecutorWaitSeconds = time.Since(db.syncDiag.executorWaitStarted).Seconds()\n\t}\n\tif !db.syncDiag.startedAt.IsZero() {\n\t\tstartedAt := db.syncDiag.startedAt\n\t\tdiag.StartedAt = \u0026startedAt\n\t}\n\tif !db.syncDiag.updatedAt.IsZero() {\n\t\tupdatedAt := db.syncDiag.updatedAt\n\t\tdiag.UpdatedAt = \u0026updatedAt\n\t}\n\tif !db.syncDiag.startedAt.IsZero() {\n\t\tend := db.syncDiag.updatedAt\n\t\tif db.syncDiag.active || end.IsZero() {\n\t\t\tend = time.Now()\n\t\t}\n\t\tdiag.ElapsedSeconds = end.Sub(db.syncDiag.startedAt).Seconds()\n\t}\n\treturn diag\n}\n\nfunc (db *DB) beginSyncDiag(operation diagOp) {\n\tnow := time.Now()\n\twalSize, _ := db.walFileSize()\n\n\tdb.syncDiag.Lock()\n\tdb.syncDiag.active = true\n\tdb.syncDiag.operation = operation\n\tdb.syncDiag.phase = diagPhaseStarting\n\tdb.syncDiag.startedAt = now\n\tdb.syncDiag.updatedAt = now\n\tdb.syncDiag.txID = 0\n\tdb.syncDiag.walSize = walSize\n\tdb.syncDiag.lastSyncedWALOffset = db.syncState.lastSyncedWALOffset\n\tdb.syncDiag.snapshotting = false\n\tdb.syncDiag.checkpointMode = \"\"\n\tdb.syncDiag.reason = \"\"\n\tdb.syncDiag.err = \"\"\n\tdb.syncDiag.Unlock()\n}\n\nfunc (db *DB) setSyncDiagPhase(phase diagPhase, updates ...func(*diagState)) {\n\tdb.syncDiag.Lock()\n\tdefer db.syncDiag.Unlock()\n\tif !db.syncDiag.active {\n\t\treturn\n\t}\n\tdb.syncDiag.phase = phase\n\tdb.syncDiag.updatedAt = time.Now()\n\tfor _, update := range updates {\n\t\tupdate(\u0026db.syncDiag)\n\t}\n}\n\nfunc (db *DB) finishSyncDiag(err error) {\n\tdb.syncDiag.Lock()\n\tdefer db.syncDiag.Unlock()\n\tif !db.syncDiag.active {\n\t\treturn\n\t}\n\tdb.syncDiag.active = false\n\tdb.syncDiag.updatedAt = time.Now()\n\tif err != nil {\n\t\tdb.syncDiag.err = err.Error()\n\t}\n}\n\nfunc (db *DB) beginSyncExecutorWait() {\n\tdb.syncDiag.Lock()\n\tdefer db.syncDiag.Unlock()\n\tif db.syncDiag.executorWaiterCount == 0 {\n\t\tdb.syncDiag.executorWaitStarted = time.Now()\n\t}\n\tdb.syncDiag.executorWaiterCount++\n}\n\nfunc (db *DB) finishSyncExecutorWait() {\n\tdb.syncDiag.Lock()\n\tdefer db.syncDiag.Unlock()\n\tdb.syncDiag.executorWaiterCount--\n\tif db.syncDiag.executorWaiterCount == 0 {\n\t\tdb.syncDiag.executorWaitStarted = time.Time{}\n\t}\n}\n\n// IsOpen returns true if the database has been opened.\nfunc (db *DB) IsOpen() bool {\n\tdb.mu.RLock()\n\tdefer db.mu.RUnlock()\n\treturn db.opened\n}\n\n// WALPath returns the path to the database's WAL file.\nfunc (db *DB) WALPath() string {\n\treturn db.path + \"-wal\"\n}\n\n// MetaPath returns the path to the database metadata.\nfunc (db *DB) MetaPath() string {\n\treturn db.metaPath\n}\n\n// SetMetaPath sets the path to database metadata.\nfunc (db *DB) SetMetaPath(path string) {\n\tdb.metaPath = path\n}\n\n// LTXDir returns path of the root LTX directory.\nfunc (db *DB) LTXDir() string {\n\treturn filepath.Join(db.metaPath, \"ltx\")\n}\n\n// ResetLocalState removes local LTX files, forcing a fresh snapshot on next sync.\n// This is useful for recovering from corrupted or missing LTX files.\n// The database file itself is not modified.\nfunc (db *DB) ResetLocalState(ctx context.Context) error {\n\tdb.Logger.Info(\"resetting local litestream state\",\n\t\t\"meta_path\", db.metaPath,\n\t\t\"ltx_dir\", db.LTXDir())\n\n\t// Remove all LTX files\n\tif err := os.RemoveAll(db.LTXDir()); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"remove ltx directory: %w\", err)\n\t}\n\n\t// Clear cached LTX file info\n\tdb.maxLTXFileInfos.Lock()\n\tdb.maxLTXFileInfos.m = make(map[int]*ltx.FileInfo)\n\tdb.maxLTXFileInfos.Unlock()\n\n\tdb.invalidatePosCache()\n\n\tdb.Logger.Info(\"local state reset complete, next sync will create fresh snapshot\")\n\treturn nil\n}\n\n// LTXLevelDir returns path of the given LTX compaction level.\n// Panics if level is negative.\nfunc (db *DB) LTXLevelDir(level int) string {\n\treturn filepath.Join(db.LTXDir(), strconv.Itoa(level))\n}\n\n// LTXPath returns the local path of a single LTX file.\n// Panics if level or either txn ID is negative.\nfunc (db *DB) LTXPath(level int, minTXID, maxTXID ltx.TXID) string {\n\tassert(level \u003e= 0, \"level cannot be negative\")\n\treturn filepath.Join(db.LTXLevelDir(level), ltx.FormatFilename(minTXID, maxTXID))\n}\n\n// openLocalLTXFile opens a local LTX file for reading.\n// Used by the Compactor to prefer local files over remote.\nfunc (db *DB) openLocalLTXFile(level int, minTXID, maxTXID ltx.TXID) (io.ReadCloser, error) {\n\treturn os.Open(db.LTXPath(level, minTXID, maxTXID))\n}\n\n// deleteLocalLTXFile deletes a local LTX file.\n// Used by the Compactor for retention enforcement.\nfunc (db *DB) deleteLocalLTXFile(level int, minTXID, maxTXID ltx.TXID) error {\n\tpath := db.LTXPath(level, minTXID, maxTXID)\n\tif err := os.Remove(path); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\tif level == 0 {\n\t\tdb.invalidatePosCache()\n\t}\n\treturn nil\n}\n\n// MaxLTX returns the last LTX file written to level 0.\nfunc (db *DB) MaxLTX() (minTXID, maxTXID ltx.TXID, err error) {\n\tents, err := os.ReadDir(db.LTXLevelDir(0))\n\tif os.IsNotExist(err) {\n\t\treturn 0, 0, nil // no LTX files written\n\t} else if err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// Find highest txn ID.\n\tfor _, ent := range ents {\n\t\tif min, max, err := ltx.ParseFilename(ent.Name()); err != nil {\n\t\t\tcontinue // invalid LTX filename\n\t\t} else if max \u003e maxTXID {\n\t\t\tminTXID, maxTXID = min, max\n\t\t}\n\t}\n\treturn minTXID, maxTXID, nil\n}\n\n// FileInfo returns the cached file stats for the database file when it was initialized.\nfunc (db *DB) FileInfo() os.FileInfo {\n\treturn db.fileInfo\n}\n\n// DirInfo returns the cached file stats for the parent directory of the database file when it was initialized.\nfunc (db *DB) DirInfo() os.FileInfo {\n\treturn db.dirInfo\n}\n\n// Pos returns the current replication position of the database.\n// The result is cached and invalidated when L0 LTX files change.\nfunc (db *DB) Pos() (ltx.Pos, error) {\n\tdb.pos.Lock()\n\tdefer db.pos.Unlock()\n\n\tif db.pos.value != nil {\n\t\treturn *db.pos.value, nil\n\t}\n\n\tminTXID, maxTXID, err := db.MaxLTX()\n\tif err != nil {\n\t\treturn ltx.Pos{}, err\n\t} else if minTXID == 0 {\n\t\treturn ltx.Pos{}, nil // no replication yet\n\t}\n\n\tltxPath := db.LTXPath(0, minTXID, maxTXID)\n\tf, err := os.Open(ltxPath)\n\tif err != nil {\n\t\treturn ltx.Pos{}, NewLTXError(\"open\", ltxPath, 0, uint64(minTXID), uint64(maxTXID), err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tdec := ltx.NewDecoder(f)\n\tif err := dec.Verify(); err != nil {\n\t\treturn ltx.Pos{}, NewLTXError(\"verify\", ltxPath, 0, uint64(minTXID), uint64(maxTXID), fmt.Errorf(\"%w: %w\", ErrLTXCorrupted, err))\n\t}\n\n\tpos := dec.PostApplyPos()\n\tdb.pos.value = \u0026pos\n\n\treturn pos, nil\n}\n\n// invalidatePosCache clears the cached position so the next call to Pos()\n// recomputes it from disk. Call this when L0 LTX files are deleted or\n// when the L0 directory is cleared.\nfunc (db *DB) invalidatePosCache() {\n\tdb.pos.Lock()\n\tdb.pos.value = nil\n\tdb.pos.Unlock()\n}\n\n// Notify returns a channel that closes when the shadow WAL changes.\nfunc (db *DB) Notify() \u003c-chan struct{} {\n\tdb.mu.RLock()\n\tdefer db.mu.RUnlock()\n\treturn db.notify\n}\n\n// PageSize returns the page size of the underlying database.\n// Only valid after database exists \u0026 Init() has successfully run.\nfunc (db *DB) PageSize() int {\n\tdb.mu.RLock()\n\tdefer db.mu.RUnlock()\n\treturn db.pageSize\n}\n\n// RecordSuccessfulSync marks the current time as a successful sync.\n// Used by heartbeat monitoring to determine if a ping should be sent.\nfunc (db *DB) RecordSuccessfulSync() {\n\tdb.lastSuccessfulSyncMu.Lock()\n\tdefer db.lastSuccessfulSyncMu.Unlock()\n\tdb.lastSuccessfulSyncAt = time.Now()\n}\n\n// LastSuccessfulSyncAt returns the time of the last successful sync.\nfunc (db *DB) LastSuccessfulSyncAt() time.Time {\n\tdb.lastSuccessfulSyncMu.RLock()\n\tdefer db.lastSuccessfulSyncMu.RUnlock()\n\treturn db.lastSuccessfulSyncAt\n}\n\n// SyncStatus represents the current replication state of the database.\ntype SyncStatus struct {\n\tLocalTXID ltx.TXID\n\tRemoteTXID ltx.TXID\n\tInSync bool\n}\n\n// SyncStatus returns the current replication status of the database, comparing\n// the local transaction position against the remote replica position. The remote\n// position is queried from the replica storage, so this method may perform I/O.\nfunc (db *DB) SyncStatus(ctx context.Context) (SyncStatus, error) {\n\tif db.Replica == nil {\n\t\treturn SyncStatus{}, fmt.Errorf(\"no replica configured\")\n\t}\n\n\tlocalPos, err := db.Pos()\n\tif err != nil {\n\t\treturn SyncStatus{}, fmt.Errorf(\"local position: %w\", err)\n\t}\n\n\tremotePos, err := db.Replica.calcPos(ctx)\n\tif err != nil {\n\t\treturn SyncStatus{}, fmt.Errorf(\"remote position: %w\", err)\n\t}\n\n\treturn SyncStatus{\n\t\tLocalTXID: localPos.TXID,\n\t\tRemoteTXID: remotePos.TXID,\n\t\tInSync: localPos.TXID \u003e 0 \u0026\u0026 localPos.TXID == remotePos.TXID,\n\t}, nil\n}\n\n// SyncAndWait performs a full sync: WAL to LTX files, then LTX files to remote\n// replica. Blocks until both stages complete.\nfunc (db *DB) SyncAndWait(ctx context.Context) error {\n\tif db.Replica == nil {\n\t\treturn fmt.Errorf(\"no replica configured\")\n\t}\n\n\tif err := db.Sync(ctx); err != nil {\n\t\treturn fmt.Errorf(\"db sync: %w\", err)\n\t}\n\tif err := db.Replica.Sync(ctx); err != nil {\n\t\treturn fmt.Errorf(\"replica sync: %w\", err)\n\t}\n\treturn nil\n}\n\n// EnsureExists restores the database from the configured replica if the local\n// database file does not exist. If no backup is available, it returns nil and\n// a fresh database will be created on Open(). Must be called before Open().\nfunc (db *DB) EnsureExists(ctx context.Context) error {\n\tif db.Replica == nil {\n\t\treturn fmt.Errorf(\"no replica configured\")\n\t}\n\tif db.Replica.Client == nil {\n\t\treturn fmt.Errorf(\"no replica client configured\")\n\t}\n\n\tif _, err := os.Stat(db.Path()); err == nil {\n\t\treturn nil\n\t} else if !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"stat database: %w\", err)\n\t}\n\n\tif dir := filepath.Dir(db.Path()); dir != \".\" {\n\t\tif err := os.MkdirAll(dir, 0o750); err != nil {\n\t\t\treturn fmt.Errorf(\"create parent directory: %w\", err)\n\t\t}\n\t}\n\n\topt := NewRestoreOptions()\n\topt.OutputPath = db.Path()\n\topt.IntegrityCheck = IntegrityCheckQuick\n\n\tif err := db.Replica.Restore(ctx, opt); err != nil {\n\t\tif errors.Is(err, ErrTxNotAvailable) || errors.Is(err, ErrNoSnapshots) {\n\t\t\tdb.Logger.Debug(\"no backup found, will create fresh database\")\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"restore from backup: %w\", err)\n\t}\n\n\tdb.Logger.Info(\"database restored from backup\", \"path\", db.Path())\n\treturn nil\n}\n\n// Open initializes the background monitoring goroutine.\nfunc (db *DB) Open() (err error) {\n\tdb.mu.Lock()\n\tif db.opened {\n\t\tdb.mu.Unlock()\n\t\treturn nil // already open\n\t}\n\t// Recreate context for fresh start (handles reopen after close)\n\tdb.ctx, db.cancel = context.WithCancel(context.Background())\n\tdb.mu.Unlock()\n\n\t// Close deletes the per-database series, so recreate them.\n\tdb.initMetrics()\n\n\t// Validate fields on database.\n\tif db.Replica == nil {\n\t\treturn fmt.Errorf(\"replica required before opening database\")\n\t}\n\tif db.Replica.Client == nil {\n\t\treturn fmt.Errorf(\"replica client required before opening database\")\n\t}\n\tif db.MinCheckpointPageN \u003c= 0 {\n\t\treturn fmt.Errorf(\"minimum checkpoint page count required\")\n\t}\n\n\t// Clear old temporary files that my have been left from a crash.\n\tif err := removeTmpFiles(db.metaPath); err != nil {\n\t\treturn fmt.Errorf(\"cannot remove tmp files: %w\", err)\n\t}\n\n\t// Set the compactor client once before starting any goroutines.\n\tdb.compactor.VerifyCompaction = db.VerifyCompaction\n\tdb.compactor.RetentionEnabled = db.RetentionEnabled\n\tdb.compactor.client = db.Replica.Client\n\n\t// Start monitoring SQLite database in a separate goroutine.\n\tif db.MonitorInterval \u003e 0 {\n\t\tdb.wg.Add(1)\n\t\tgo func() { defer db.wg.Done(); db.monitor() }()\n\t}\n\n\t// Mark as opened only after successful initialization.\n\tdb.mu.Lock()\n\tdb.opened = true\n\tdb.mu.Unlock()\n\n\treturn nil\n}\n\n// Close flushes outstanding WAL writes to replicas, releases the read lock,\n// and closes the database. If Done is set, closing it interrupts the shutdown\n// sync retry loop and cancels any in-flight sync attempt.\nfunc (db *DB) Close(ctx context.Context) (err error) {\n\tdb.cancel()\n\tdb.wg.Wait()\n\n\t// Acquire without honoring caller cancellation: the cleanup below\n\t// (read lock release, handle closes, state reset) must always run or\n\t// the DB is left half-closed with its read lock held. Semaphore\n\t// acquisition fails immediately on an already-done context even when\n\t// the semaphore is free.\n\tif err := db.execSem.Acquire(context.WithoutCancel(ctx), 1); err != nil {\n\t\treturn err\n\t}\n\tdefer db.execSem.Release(1)\n\n\t// Perform a final db sync, if initialized.\n\tif db.db != nil {\n\t\tif _, e := db.syncLocked(ctx, 0); e != nil {\n\t\t\terr = e\n\t\t}\n\t}\n\n\t// Ensure replicas perform a final sync and stop replicating.\n\tif db.Replica != nil {\n\t\tif db.db != nil {\n\t\t\tif e := db.syncReplicaWithRetry(ctx); e != nil \u0026\u0026 err == nil {\n\t\t\t\terr = e\n\t\t\t}\n\t\t}\n\t\tdb.Replica.Stop(true)\n\t}\n\n\t// Release the read lock to allow other applications to handle checkpointing.\n\tif db.rtx != nil {\n\t\tif e := db.releaseReadLock(); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\n\tdb.mu.Lock()\n\tsqlDB := db.db\n\tf := db.f\n\tdb.db = nil\n\tdb.f = nil\n\tdb.opened = false\n\tdb.rtx = nil\n\tdb.mu.Unlock()\n\n\tif sqlDB != nil {\n\t\tif e := sqlDB.Close(); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\n\tif f != nil {\n\t\tif e := f.Close(); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\n\t// Remove this database's series now that the final sync has recorded\n\t// its last values.\n\tdb.deleteMetrics()\n\n\treturn err\n}\n\n// syncReplicaWithRetry attempts to sync the replica with retry logic for shutdown.\n// It retries until success, timeout, or context cancellation. If db.Done is non-nil,\n// closing it cancels any in-flight sync attempt and exits the retry loop.\n// If ShutdownSyncTimeout is 0, it performs a single sync attempt without retries.\nfunc (db *DB) syncReplicaWithRetry(ctx context.Context) error {\n\tif db.Replica == nil {\n\t\treturn nil\n\t}\n\n\ttimeout := db.ShutdownSyncTimeout\n\tinterval := db.ShutdownSyncInterval\n\n\t// If timeout is zero, just try once (no retry)\n\tif timeout == 0 {\n\t\treturn db.Replica.Sync(ctx)\n\t}\n\n\t// Use default interval if not set\n\tif interval == 0 {\n\t\tinterval = DefaultShutdownSyncInterval\n\t}\n\n\t// Create deadline context for total retry duration.\n\tdeadlineCtx, deadlineCancel := context.WithTimeout(ctx, timeout)\n\tdefer deadlineCancel()\n\n\t// If db.Done is set, derive a context that cancels when done is closed\n\t// so that in-flight Replica.Sync calls are interrupted immediately.\n\tsyncCtx := deadlineCtx\n\tif db.Done != nil {\n\t\tvar syncCancel context.CancelFunc\n\t\tsyncCtx, syncCancel = context.WithCancel(deadlineCtx)\n\t\tgo func() {\n\t\t\tselect {\n\t\t\tcase \u003c-db.Done:\n\t\t\t\tsyncCancel()\n\t\t\tcase \u003c-deadlineCtx.Done():\n\t\t\t\tsyncCancel()\n\t\t\t}\n\t\t}()\n\t}\n\n\tvar lastErr error\n\tattempt := 0\n\tstartTime := time.Now()\n\n\tfor {\n\t\t// Check if done is already closed before attempting sync\n\t\tif db.Done != nil {\n\t\t\tselect {\n\t\t\tcase \u003c-db.Done:\n\t\t\t\tdb.Logger.Warn(\"shutdown sync skipped, interrupted by signal\",\n\t\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\t\"duration\", time.Since(startTime))\n\t\t\t\treturn fmt.Errorf(\"after %d attempts: %w\", attempt, ErrShutdownInterrupted)\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\tattempt++\n\n\t\t// Try sync\n\t\tif err := db.Replica.Sync(syncCtx); err == nil {\n\t\t\tif attempt \u003e 1 {\n\t\t\t\tdb.Logger.Info(\"shutdown sync succeeded after retry\",\n\t\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\t\"duration\", time.Since(startTime))\n\t\t\t}\n\t\t\treturn nil\n\t\t} else {\n\t\t\tlastErr = err\n\t\t}\n\n\t\t// Check if we should stop retrying (done signal or timeout)\n\t\tselect {\n\t\tcase \u003c-deadlineCtx.Done():\n\t\t\tdb.Logger.Error(\"shutdown sync failed after timeout\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"duration\", time.Since(startTime),\n\t\t\t\t\"error\", lastErr)\n\t\t\treturn fmt.Errorf(\"shutdown sync timeout after %d attempts: %w\", attempt, lastErr)\n\t\tcase \u003c-db.Done:\n\t\t\tdb.Logger.Warn(\"shutdown sync interrupted by signal\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"duration\", time.Since(startTime),\n\t\t\t\t\"error\", lastErr)\n\t\t\treturn fmt.Errorf(\"after %d attempts: %w\", attempt, ErrShutdownInterrupted)\n\t\tdefault:\n\t\t}\n\n\t\t// Log retry with hint about second signal if interruptible\n\t\tif db.Done != nil {\n\t\t\tdb.Logger.Warn(\"shutdown sync failed, retrying (press Ctrl+C again to skip)\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"error\", lastErr,\n\t\t\t\t\"elapsed\", time.Since(startTime),\n\t\t\t\t\"remaining\", time.Until(startTime.Add(timeout)))\n\t\t} else {\n\t\t\tdb.Logger.Warn(\"shutdown sync failed, retrying\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"error\", lastErr,\n\t\t\t\t\"elapsed\", time.Since(startTime),\n\t\t\t\t\"remaining\", time.Until(startTime.Add(timeout)))\n\t\t}\n\n\t\t// Wait before retry, but also listen for done signal\n\t\tselect {\n\t\tcase \u003c-time.After(interval):\n\t\tcase \u003c-deadlineCtx.Done():\n\t\t\treturn fmt.Errorf(\"shutdown sync timeout after %d attempts: %w\", attempt, lastErr)\n\t\tcase \u003c-db.Done:\n\t\t\tdb.Logger.Warn(\"shutdown sync interrupted by signal\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"duration\", time.Since(startTime))\n\t\t\treturn fmt.Errorf(\"after %d attempts: %w\", attempt, ErrShutdownInterrupted)\n\t\t}\n\t}\n}\n\n// setPersistWAL sets the PERSIST_WAL file control on the database connection.\n// This prevents SQLite from removing the WAL file when connections close.\nfunc (db *DB) setPersistWAL(ctx context.Context) error {\n\tconn, err := db.db.Conn(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get connection: %w\", err)\n\t}\n\tdefer conn.Close()\n\n\treturn conn.Raw(func(driverConn interface{}) error {\n\t\tfc, ok := driverConn.(sqlite.FileControl)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"driver does not implement FileControl\")\n\t\t}\n\n\t\t_, err := fc.FileControlPersistWAL(\"main\", 1)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"FileControlPersistWAL: %w\", err)\n\t\t}\n\n\t\treturn nil\n\t})\n}\n\n// init initializes the connection to the database.\n// Skipped if already initialized or if the database file does not exist.\nfunc (db *DB) init(ctx context.Context) (err error) {\n\t// Exit if already initialized.\n\tif db.db != nil {\n\t\treturn nil\n\t}\n\n\t// Exit if no database file exists.\n\tfi, err := os.Stat(db.path)\n\tif os.IsNotExist(err) {\n\t\treturn nil\n\t} else if err != nil {\n\t\treturn err\n\t}\n\tdb.fileInfo = fi\n\n\t// Obtain permissions for parent directory.\n\tif fi, err = os.Stat(filepath.Dir(db.path)); err != nil {\n\t\treturn err\n\t}\n\tdb.dirInfo = fi\n\n\tdsn := fmt.Sprintf(\"file:%s?_pragma=busy_timeout(%d)\u0026_pragma=wal_autocheckpoint(0)\",\n\t\tdb.path, db.BusyTimeout.Milliseconds())\n\n\tif db.db, err = sql.Open(\"sqlite\", dsn); err != nil {\n\t\treturn err\n\t}\n\n\t// Set PERSIST_WAL to prevent WAL file removal when database connections close.\n\tif err := db.setPersistWAL(ctx); err != nil {\n\t\treturn fmt.Errorf(\"set PERSIST_WAL: %w\", err)\n\t}\n\n\t// Open long-running database file descriptor. Required for non-OFD locks.\n\tif db.f, err = os.Open(db.path); err != nil {\n\t\treturn fmt.Errorf(\"open db file descriptor: %w\", err)\n\t}\n\n\t// Ensure database is closed if init fails.\n\t// Initialization can retry on next sync.\n\tdefer func() {\n\t\tif err != nil {\n\t\t\t_ = db.releaseReadLock()\n\t\t\tdb.db.Close()\n\t\t\tdb.f.Close()\n\t\t\tdb.db, db.f = nil, nil\n\t\t}\n\t}()\n\n\t// Enable WAL and ensure it is set. New mode should be returned on success:\n\t// https://www.sqlite.org/pragma.html#pragma_journal_mode\n\tvar mode string\n\tif err := db.db.QueryRowContext(ctx, `PRAGMA journal_mode = wal;`).Scan(\u0026mode); err != nil {\n\t\treturn err\n\t} else if mode != \"wal\" {\n\t\treturn fmt.Errorf(\"enable wal failed, mode=%q\", mode)\n\t}\n\n\t// Create a table to force writes to the WAL when empty.\n\t// There should only ever be one row with id=1.\n\tif _, err := db.db.ExecContext(ctx, `CREATE TABLE IF NOT EXISTS _litestream_seq (id INTEGER PRIMARY KEY, seq INTEGER);`); err != nil {\n\t\treturn fmt.Errorf(\"create _litestream_seq table: %w\", err)\n\t}\n\n\t// Create a lock table to force write locks during sync.\n\t// The sync write transaction always rolls back so no data should be in this table.\n\tif _, err := db.db.ExecContext(ctx, `CREATE TABLE IF NOT EXISTS _litestream_lock (id INTEGER);`); err != nil {\n\t\treturn fmt.Errorf(\"create _litestream_lock table: %w\", err)\n\t}\n\n\t// Start a long-running read transaction to prevent other transactions\n\t// from checkpointing.\n\tif err := db.acquireReadLock(ctx); err != nil {\n\t\treturn fmt.Errorf(\"acquire read lock: %w\", err)\n\t}\n\n\t// Read page size.\n\tif err := db.db.QueryRowContext(ctx, `PRAGMA page_size;`).Scan(\u0026db.pageSize); err != nil {\n\t\treturn fmt.Errorf(\"read page size: %w\", err)\n\t} else if db.pageSize \u003c= 0 {\n\t\treturn fmt.Errorf(\"invalid db page size: %d\", db.pageSize)\n\t}\n\n\t// Ensure meta directory structure exists.\n\tif err := internal.MkdirAll(db.metaPath, db.dirInfo); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure WAL has at least one frame in it.\n\tif err := db.ensureWALExists(ctx); err != nil {\n\t\treturn fmt.Errorf(\"ensure wal exists: %w\", err)\n\t}\n\n\t// Check if database is behind replica (issue #781).\n\t// This must happen before replica.Start() to detect restore scenarios.\n\tif db.Replica != nil {\n\t\tif err := db.checkDatabaseBehindReplica(ctx); err != nil {\n\t\t\treturn fmt.Errorf(\"check database behind replica: %w\", err)\n\t\t}\n\t}\n\n\t// If we have an existing replication files, ensure the headers match.\n\t// if err := db.verifyHeadersMatch(); err != nil {\n\t// \treturn fmt.Errorf(\"cannot determine last wal position: %w\", err)\n\t// }\n\n\t// TODO(gen): Generate diff of current LTX snapshot and save as next LTX file.\n\n\t// Start replication.\n\tif db.Replica != nil {\n\t\tdb.Replica.Start(db.ctx)\n\t}\n\n\treturn nil\n}\n\n/*\n// verifyHeadersMatch returns an error if\nfunc (db *DB) verifyHeadersMatch() error {\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"cannot determine position: %w\", err)\n\t} else if pos.TXID == 0 {\n\t\treturn true, nil // no replication performed yet\n\t}\n\n\thdr0, err := readWALHeader(db.WALPath())\n\tif os.IsNotExist(err) {\n\t\treturn false, fmt.Errorf(\"no wal: %w\", err)\n\t} else if err != nil {\n\t\treturn false, fmt.Errorf(\"read wal header: %w\", err)\n\t}\n\tsalt1 := binary.BigEndian.Uint32(hdr0[16:])\n\tsalt2 := binary.BigEndian.Uint32(hdr0[20:])\n\n\tltxPath := db.LTXPath(0, pos.TXID, pos.TXID)\n\tf, err := os.Open(ltxPath)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"open ltx path: %w\", err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tdec := ltx.NewDecoder(f)\n\tif err := dec.DecodeHeader(); err != nil {\n\t\treturn false, fmt.Errorf(\"decode ltx header: %w\", err)\n\t}\n\thdr1 := dec.Header()\n\tif salt1 != hdr1.WALSalt1 || salt2 != hdr1.WALSalt2 {\n\t\tdb.Logger.Log(internal.LevelTrace, \"salt mismatch\",\n\t\t\t\"path\", ltxPath,\n\t\t\t\"wal\", [2]uint32{salt1, salt2},\n\t\t\t\"ltx\", [2]uint32{hdr1.WALSalt1, hdr1.WALSalt2})\n\t\treturn false, nil\n\t}\n\treturn true, nil\n}\n*/\n\n// acquireReadLock begins a read transaction on the database to prevent checkpointing.\nfunc (db *DB) acquireReadLock(ctx context.Context) error {\n\tif db.rtx != nil {\n\t\treturn nil\n\t}\n\n\t// Start long running read-transaction to prevent checkpoints. The\n\t// transaction outlives this call, and database/sql rolls it back when its\n\t// BeginTx context is cancelled, so detach it from the caller's context\n\t// (e.g. a control socket request that is cancelled when it returns).\n\ttx, err := db.db.BeginTx(context.WithoutCancel(ctx), nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Execute read query to obtain read lock.\n\tif _, err := tx.ExecContext(ctx, `SELECT COUNT(1) FROM _litestream_seq;`); err != nil {\n\t\t_ = tx.Rollback()\n\t\treturn err\n\t}\n\n\t// Track transaction so we can release it later before checkpoint.\n\tdb.rtx = tx\n\treturn nil\n}\n\n// releaseReadLock rolls back the long-running read transaction.\nfunc (db *DB) releaseReadLock() error {\n\t// Ignore if we do not have a read lock.\n\tif db.rtx == nil {\n\t\treturn nil\n\t}\n\n\t// Rollback \u0026 clear read transaction.\n\t// Use rollback() helper to suppress \"already rolled back\" errors that can\n\t// occur during shutdown when concurrent checkpoint and close operations\n\t// both attempt to release the read lock. See issue #934.\n\terr := rollback(db.rtx)\n\tdb.rtx = nil\n\treturn err\n}\n\n// Sync copies pending data from the WAL to the shadow WAL.\nfunc (db *DB) Sync(ctx context.Context) error {\n\tfor {\n\t\tif err := ctx.Err(); err != nil {\n\t\t\treturn context.Cause(ctx)\n\t\t}\n\n\t\tresult, err := db.syncOnce(ctx, db.MaxSyncWALBytes)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t} else if !result.synced || !result.limited || result.syncedToWALEnd {\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\nfunc (db *DB) syncOnce(ctx context.Context, maxSyncWALBytes int64) (syncResult, error) {\n\tif err := db.lockExec(ctx); err != nil {\n\t\treturn syncResult{}, err\n\t}\n\tdefer db.execSem.Release(1)\n\n\treturn db.syncLocked(ctx, maxSyncWALBytes)\n}\n\nfunc (db *DB) lockExec(ctx context.Context) error {\n\tif db.execSem.TryAcquire(1) {\n\t\treturn nil\n\t}\n\tdb.beginSyncExecutorWait()\n\tdefer db.finishSyncExecutorWait()\n\n\tif err := db.execSem.Acquire(ctx, 1); err != nil {\n\t\treturn fmt.Errorf(\"wait for db sync executor: %w\", context.Cause(ctx))\n\t}\n\treturn nil\n}\n\n// addDurationToCounter records positive durations without allowing a clock\n// adjustment to panic a Prometheus counter.\nfunc addDurationToCounter(counter prometheus.Counter, d time.Duration) {\n\tif d \u003e 0 {\n\t\tcounter.Add(d.Seconds())\n\t}\n}\n\nfunc (db *DB) syncLocked(ctx context.Context, maxSyncWALBytes int64) (result syncResult, err error) {\n\tdb.beginSyncDiag(diagOpSync)\n\tdefer func() { db.finishSyncDiag(err) }()\n\n\t// Track total sync metrics.\n\tt := time.Now()\n\tdefer func() {\n\t\tdb.syncNCounter.Inc()\n\t\tif err != nil {\n\t\t\tdb.syncErrorNCounter.Inc()\n\t\t}\n\t\tif isDiskFullError(err) {\n\t\t\tdb.diskFullGauge.Set(1)\n\t\t} else {\n\t\t\tdb.diskFullGauge.Set(0)\n\t\t}\n\t\taddDurationToCounter(db.syncSecondsCounter, time.Since(t))\n\t}()\n\n\texec, err := db.newSyncExecutor(ctx)\n\tif err != nil {\n\t\treturn result, err\n\t} else if exec == nil {\n\t\tdb.Logger.Debug(\"sync: no database found\")\n\t\treturn result, nil\n\t}\n\tdefer db.applySyncExecutor(exec, true)\n\n\t// Ensure WAL has at least one frame in it.\n\tdb.setSyncDiagPhase(diagPhaseEnsureWAL, func(s *diagState) {\n\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t})\n\tif err := db.ensureWALExists(ctx); err != nil {\n\t\treturn result, fmt.Errorf(\"ensure wal exists: %w\", err)\n\t}\n\n\tdb.setSyncDiagPhase(diagPhaseVerifyAndSync, func(s *diagState) {\n\t\ts.txID = exec.pos.TXID + 1\n\t})\n\tresult, err = db.verifyAndSyncWithExecutor(ctx, false, exec, maxSyncWALBytes)\n\tif err != nil {\n\t\treturn result, err\n\t}\n\texec.applySyncResult(result)\n\n\t// Track that data was synced for time-based checkpoint decisions.\n\tif result.synced {\n\t\texec.state.syncedSinceCheckpoint = true\n\t}\n\n\t// Checkpoint checks normally wait until the WAL is fully synced, but the\n\t// emergency truncate threshold must be honored even mid catch-up:\n\t// sustained writes could otherwise keep every chunk limited and defer the\n\t// truncate checkpoint indefinitely, growing the WAL without bound.\n\tif !result.limited || result.syncedToWALEnd || db.exceedsTruncateThreshold(result.origWALSize) {\n\t\tdb.setSyncDiagPhase(diagPhaseCheckpointIfNeeded, func(s *diagState) {\n\t\t\ts.txID = exec.pos.TXID\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\t\tif err := db.checkpointIfNeeded(ctx, exec, result.origWALSize, result.newWALSize); err != nil {\n\t\t\treturn result, fmt.Errorf(\"checkpoint: %w\", err)\n\t\t}\n\t}\n\n\tdb.setSyncDiagPhase(diagPhaseUpdateMetrics, func(s *diagState) {\n\t\ts.txID = exec.pos.TXID\n\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t})\n\n\t// Compute current index and total shadow WAL size.\n\tdb.txIDGauge.Set(float64(exec.pos.TXID))\n\n\t// Update file size metrics.\n\tif fi, err := os.Stat(db.path); err == nil {\n\t\tdb.dbSizeGauge.Set(float64(fi.Size()))\n\t}\n\tdb.walSizeGauge.Set(float64(exec.state.lastSyncedWALOffset))\n\n\treturn result, nil\n}\n\nfunc (db *DB) verifyAndSync(ctx context.Context, checkpointing bool, state *syncState) (syncResult, error) {\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn syncResult{}, fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\treturn db.verifyAndSyncWithExecutor(ctx, checkpointing, \u0026syncExecutor{\n\t\tstate: *state,\n\t\tpos: pos,\n\t}, 0)\n}\n\nfunc (db *DB) verifyAndSyncWithExecutor(ctx context.Context, checkpointing bool, exec *syncExecutor, maxSyncWALBytes int64) (syncResult, error) {\n\tdb.setSyncDiagPhase(diagPhaseStatWAL, func(s *diagState) {\n\t\ts.txID = exec.pos.TXID + 1\n\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t})\n\n\t// Use the last synced WAL offset as the logical size for checkpoint decisions.\n\t// This avoids using file size which may include stale frames with old salt\n\t// values after a checkpoint. See issue #997.\n\torigWALSize := exec.state.lastSyncedWALOffset\n\tif origWALSize == 0 {\n\t\t// First sync - use file size as fallback\n\t\tvar err error\n\t\torigWALSize, err = db.walFileSize()\n\t\tif err != nil {\n\t\t\treturn syncResult{}, fmt.Errorf(\"stat wal before sync: %w\", err)\n\t\t}\n\t}\n\n\t// Verify our last sync matches the current state of the WAL.\n\t// This ensures that the last sync position of the real WAL hasn't\n\t// been overwritten by another process.\n\tdb.setSyncDiagPhase(diagPhaseVerify)\n\tinfo, err := db.verifyWithExecutor(ctx, exec)\n\tif err != nil {\n\t\treturn syncResult{}, fmt.Errorf(\"cannot verify wal state: %w\", err)\n\t}\n\n\tdb.setSyncDiagPhase(diagPhaseSyncLTX, func(s *diagState) {\n\t\ts.txID = exec.pos.TXID + 1\n\t\ts.snapshotting = info.snapshotting\n\t\ts.reason = info.reason\n\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t})\n\tresult, err := db.sync(ctx, checkpointing, exec, info, maxSyncWALBytes)\n\tif err != nil {\n\t\treturn syncResult{}, fmt.Errorf(\"sync: %w\", err)\n\t}\n\n\tresult.origWALSize = origWALSize\n\treturn result, nil\n}\n\n// checkpointIfNeeded performs a checkpoint based on configured thresholds.\n// Checks thresholds in priority order: TruncatePageN → MinCheckpointPageN → CheckpointInterval.\n//\n// TruncatePageN uses TRUNCATE mode (blocking). Others use PASSIVE mode, which\n// briefly holds the write lock to seal the WAL and can be skipped when the\n// database is busy.\n//\n// Time-based checkpoints only trigger if exec.state.syncedSinceCheckpoint is true, indicating\n// that data has been synced since the last checkpoint. This prevents creating unnecessary\n// LTX files when the only WAL data is from internal bookkeeping (like _litestream_seq\n// updates from previous checkpoints). See issue #896.\nfunc (db *DB) checkpointIfNeeded(ctx context.Context, exec *syncExecutor, origWALSize, newWALSize int64) error {\n\tif db.pageSize == 0 {\n\t\treturn nil\n\t}\n\tif !db.exceedsTruncateThreshold(exec.state.lastSyncedWALOffset) {\n\t\texec.state.truncatePassiveFailed = false\n\t}\n\n\t// Priority 1: Emergency truncate checkpoint (TRUNCATE mode, blocking)\n\t// This prevents unbounded WAL growth from long-lived read transactions.\n\tif db.exceedsTruncateThreshold(origWALSize) {\n\t\ttruncateThreshold := calcWALSize(uint32(db.pageSize), uint32(db.effectiveTruncatePageN()))\n\n\t\tif !exec.state.truncatePassiveFailed {\n\t\t\t// Try a PASSIVE checkpoint first: if it restarts the WAL and brings\n\t\t\t// the synced offset below the threshold, the blocking TRUNCATE and\n\t\t\t// its mandatory boundary snapshot are skipped.\n\t\t\tif restarted, err := db.checkpointWithExecutor(ctx, CheckpointModePassive, exec); err != nil {\n\t\t\t\tif !isSQLiteBusyError(err) {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texec.state.truncatePassiveFailed = true\n\t\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"passive checkpoint skipped\", \"reason\", \"database busy\")\n\t\t\t} else if restarted {\n\t\t\t\texec.state.truncatePassiveFailed = false\n\t\t\t\tif !db.exceedsTruncateThreshold(exec.state.lastSyncedWALOffset) {\n\t\t\t\t\tdb.Logger.Info(\"wal restarted by passive checkpoint, skipping truncate checkpoint\",\n\t\t\t\t\t\t\"wal_size\", origWALSize,\n\t\t\t\t\t\t\"threshold\", truncateThreshold)\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t} else if exec.checkpointAttempted {\n\t\t\t\texec.state.truncatePassiveFailed = true\n\t\t\t}\n\t\t}\n\n\t\tdb.Logger.Info(\"forcing truncate checkpoint\",\n\t\t\t\"wal_size\", origWALSize,\n\t\t\t\"threshold\", truncateThreshold)\n\t\trestarted, err := db.checkpointWithExecutor(ctx, CheckpointModeTruncate, exec)\n\t\tif restarted || !db.exceedsTruncateThreshold(exec.state.lastSyncedWALOffset) {\n\t\t\texec.state.truncatePassiveFailed = false\n\t\t}\n\t\treturn err\n\t}\n\n\t// Priority 2: Regular checkpoint at min threshold (PASSIVE mode)\n\tif newWALSize \u003e= calcWALSize(uint32(db.pageSize), uint32(db.MinCheckpointPageN)) {\n\t\tif _, err := db.checkpointWithExecutor(ctx, CheckpointModePassive, exec); err != nil {\n\t\t\t// PASSIVE checkpoints can fail with SQLITE_BUSY when database is locked.\n\t\t\t// This is expected behavior and not an error - just log and continue.\n\t\t\tif isSQLiteBusyError(err) {\n\t\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"passive checkpoint skipped\", \"reason\", \"database busy\")\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Priority 3: Time-based checkpoint (PASSIVE mode)\n\t// Only trigger if there have been actual changes synced since the last\n\t// checkpoint. This prevents creating unnecessary LTX files when the only\n\t// WAL data is from internal bookkeeping (like _litestream_seq updates).\n\tif db.CheckpointInterval \u003e 0 \u0026\u0026 exec.state.syncedSinceCheckpoint {\n\t\t// Get database file modification time\n\t\tfi, err := db.f.Stat()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"stat database: %w\", err)\n\t\t}\n\n\t\t// Only checkpoint if enough time has passed and WAL has data\n\t\tif time.Since(fi.ModTime()) \u003e db.CheckpointInterval \u0026\u0026 newWALSize \u003e calcWALSize(uint32(db.pageSize), 1) {\n\t\t\tif _, err := db.checkpointWithExecutor(ctx, CheckpointModePassive, exec); err != nil {\n\t\t\t\t// PASSIVE checkpoints can fail with SQLITE_BUSY when database is locked.\n\t\t\t\t// This is expected behavior and not an error - just log and continue.\n\t\t\t\tif isSQLiteBusyError(err) {\n\t\t\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"passive checkpoint skipped\", \"reason\", \"database busy\")\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// exceedsTruncateThreshold returns true once walSize has grown past the\n// emergency truncate checkpoint threshold.\nfunc (db *DB) exceedsTruncateThreshold(walSize int64) bool {\n\ttruncatePageN := db.effectiveTruncatePageN()\n\treturn truncatePageN \u003e 0 \u0026\u0026 db.pageSize != 0 \u0026\u0026\n\t\twalSize \u003e= calcWALSize(uint32(db.pageSize), uint32(truncatePageN))\n}\n\nfunc (db *DB) effectiveTruncatePageN() int {\n\tif db.TruncatePageN == 0 {\n\t\treturn DefaultTruncatePageN\n\t}\n\treturn db.TruncatePageN\n}\n\n// isSQLiteBusyError returns true if the error is an SQLITE_BUSY error.\nfunc isSQLiteBusyError(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\t// Check for \"database is locked\" or \"SQLITE_BUSY\" in error message\n\terrStr := err.Error()\n\treturn strings.Contains(errStr, \"database is locked\") ||\n\t\tstrings.Contains(errStr, \"SQLITE_BUSY\")\n}\n\n// isDiskFullError returns true if the error indicates disk space issues.\n// This includes \"no space left on device\" (ENOSPC) and \"disk quota exceeded\" (EDQUOT).\nfunc isDiskFullError(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tif errors.Is(err, ErrDiskFull) || errors.Is(err, syscall.ENOSPC) {\n\t\treturn true\n\t}\n\terrStr := strings.ToLower(err.Error())\n\treturn strings.Contains(errStr, \"no space left on device\") ||\n\t\tstrings.Contains(errStr, \"disk quota exceeded\") ||\n\t\tstrings.Contains(errStr, \"not enough space on the disk\") ||\n\t\tstrings.Contains(errStr, \"database or disk is full\") ||\n\t\tstrings.Contains(errStr, \"enospc\") ||\n\t\tstrings.Contains(errStr, \"edquot\")\n}\n\ntype ltxStagingFile interface {\n\tio.Writer\n\tSync() error\n\tClose() error\n}\n\nfunc defaultOpenLTXFile(name string, flag int, perm os.FileMode) (ltxStagingFile, error) {\n\treturn os.OpenFile(name, flag, perm)\n}\n\n// walFileSize returns the size of the WAL file in bytes.\nfunc (db *DB) walFileSize() (int64, error) {\n\tfi, err := os.Stat(db.WALPath())\n\tif os.IsNotExist(err) {\n\t\treturn 0, nil\n\t} else if err != nil {\n\t\treturn 0, err\n\t}\n\treturn fi.Size(), nil\n}\n\n// calcWALSize returns the size of the WAL for a given page size \u0026 count.\n// Casts to int64 before multiplication to prevent uint32 overflow with large page sizes.\nfunc calcWALSize(pageSize uint32, pageN uint32) int64 {\n\treturn int64(WALHeaderSize) + (int64(WALFrameHeaderSize+pageSize) * int64(pageN))\n}\n\nfunc (db *DB) bumpLitestreamSeq(ctx context.Context) error {\n\t_, err := db.db.ExecContext(ctx, `INSERT INTO _litestream_seq (id, seq) VALUES (1, 1) ON CONFLICT (id) DO UPDATE SET seq = seq + 1`)\n\treturn err\n}\n\n// ensureWALExists checks that the real WAL exists and has a header.\nfunc (db *DB) ensureWALExists(ctx context.Context) (err error) {\n\t// Exit early if WAL header exists.\n\tif fi, err := os.Stat(db.WALPath()); err == nil \u0026\u0026 fi.Size() \u003e= WALHeaderSize {\n\t\treturn nil\n\t}\n\n\t// Otherwise create transaction that updates the internal litestream table.\n\treturn db.bumpLitestreamSeq(ctx)\n}\n\n// checkDatabaseBehindReplica detects when a database has been restored to an\n// earlier state and the replica has a higher TXID. This handles issue #781.\n//\n// If detected, it clears local L0 files and fetches the latest L0 LTX file\n// from the replica to establish a baseline. The next DB.sync() will detect\n// the mismatch and trigger a snapshot at the current database state.\nfunc (db *DB) checkDatabaseBehindReplica(ctx context.Context) error {\n\t// Get database position from local L0 files\n\tdbPos, err := db.Pos()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get database position: %w\", err)\n\t}\n\n\t// Get replica position from remote\n\treplicaInfo, err := db.Replica.MaxLTXFileInfo(ctx, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get replica position: %w\", err)\n\t} else if replicaInfo.MaxTXID == 0 {\n\t\treturn nil // No remote replica data yet\n\t}\n\n\t// Check if database is behind replica\n\tif dbPos.TXID \u003e= replicaInfo.MaxTXID {\n\t\treturn nil // Database is ahead or equal\n\t}\n\n\tdb.Logger.Info(\"detected database behind replica\",\n\t\t\"db_txid\", dbPos.TXID,\n\t\t\"replica_txid\", replicaInfo.MaxTXID)\n\n\t// Clear local L0 files\n\tl0Dir := db.LTXLevelDir(0)\n\tif err := os.RemoveAll(l0Dir); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"remove L0 directory: %w\", err)\n\t}\n\tdb.invalidatePosCache()\n\tif err := internal.MkdirAll(l0Dir, db.dirInfo); err != nil {\n\t\treturn fmt.Errorf(\"recreate L0 directory: %w\", err)\n\t}\n\n\t// Fetch latest L0 LTX file from replica\n\tminTXID, maxTXID := replicaInfo.MinTXID, replicaInfo.MaxTXID\n\treader, err := db.Replica.Client.OpenLTXFile(ctx, 0, minTXID, maxTXID, 0, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open remote L0 file: %w\", err)\n\t}\n\tdefer func() { _ = reader.Close() }()\n\n\t// Write to temp file and atomically rename\n\tlocalPath := db.LTXPath(0, minTXID, maxTXID)\n\ttmpPath := localPath + \".tmp\"\n\n\ttmpFile, err := os.Create(tmpPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create temp L0 file: %w\", err)\n\t}\n\tdefer func() { _ = os.Remove(tmpPath) }() // Clean up temp file on error\n\n\tif _, err := io.Copy(tmpFile, reader); err != nil {\n\t\t_ = tmpFile.Close()\n\t\treturn fmt.Errorf(\"copy L0 file: %w\", err)\n\t}\n\n\tif err := tmpFile.Sync(); err != nil {\n\t\t_ = tmpFile.Close()\n\t\treturn fmt.Errorf(\"sync L0 file: %w\", err)\n\t}\n\n\tif err := tmpFile.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close L0 file: %w\", err)\n\t}\n\n\t// Atomically rename temp file to final path\n\tif err := os.Rename(tmpPath, localPath); err != nil {\n\t\treturn fmt.Errorf(\"rename L0 file: %w\", err)\n\t}\n\tdb.invalidatePosCache()\n\n\tdb.Logger.Info(\"fetched latest L0 file from replica\",\n\t\t\"min_txid\", minTXID,\n\t\t\"max_txid\", maxTXID)\n\n\treturn nil\n}\n\n// verify ensures the current LTX state matches where it left off from\n// the real WAL. Check info.ok if verification was successful.\nfunc (db *DB) verify(ctx context.Context, state *syncState) (info syncInfo, err error) {\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn info, fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\treturn db.verifyWithExecutor(ctx, \u0026syncExecutor{\n\t\tstate: *state,\n\t\tpos: pos,\n\t})\n}\n\nfunc (db *DB) verifyWithExecutor(ctx context.Context, exec *syncExecutor) (info syncInfo, err error) {\n\tframeSize := int64(db.pageSize + WALFrameHeaderSize)\n\tinfo.snapshotting = true\n\n\tif exec.pos.TXID == 0 {\n\t\tinfo.offset = WALHeaderSize\n\t\treturn info, nil // first sync\n\t}\n\n\t// Determine last WAL offset we save from.\n\tltxPath := db.LTXPath(0, exec.pos.TXID, exec.pos.TXID)\n\tltxFile, err := os.Open(ltxPath)\n\tif err != nil {\n\t\treturn info, NewLTXError(\"open\", ltxPath, 0, uint64(exec.pos.TXID), uint64(exec.pos.TXID), err)\n\t}\n\tdefer func() { _ = ltxFile.Close() }()\n\n\tdec := ltx.NewDecoder(ltxFile)\n\tif err := dec.DecodeHeader(); err != nil {\n\t\t// Decode failure indicates corruption\n\t\tltxErr := NewLTXError(\"decode\", ltxPath, 0, uint64(exec.pos.TXID), uint64(exec.pos.TXID), fmt.Errorf(\"%w: %w\", ErrLTXCorrupted, err))\n\t\treturn info, ltxErr\n\t}\n\tinfo.offset = dec.Header().WALOffset + dec.Header().WALSize\n\tinfo.salt1 = dec.Header().WALSalt1\n\tinfo.salt2 = dec.Header().WALSalt2\n\tinfo.prevCommit = dec.Header().Commit\n\n\t// If LTX WAL offset is larger than real WAL then the WAL has been truncated.\n\tif fi, err := os.Stat(db.WALPath()); err != nil {\n\t\treturn info, fmt.Errorf(\"open wal file: %w\", err)\n\t} else if info.offset \u003e fi.Size() {\n\t\texec.state.truncatePassiveFailed = false\n\n\t\t// If we previously synced to the exact end of the WAL, this truncation\n\t\t// is expected (normal checkpoint behavior). Reset position and continue\n\t\t// incrementally rather than triggering a full snapshot. See issue #927.\n\t\tif exec.state.syncedToWALEnd {\n\t\t\t// Read new WAL header to get current salt values\n\t\t\thdr, err := readWALHeader(db.WALPath())\n\t\t\tif err != nil {\n\t\t\t\treturn info, fmt.Errorf(\"read wal header after expected truncation: %w\", err)\n\t\t\t}\n\n\t\t\tinfo.offset = WALHeaderSize\n\t\t\tinfo.salt1 = binary.BigEndian.Uint32(hdr[16:])\n\t\t\tinfo.salt2 = binary.BigEndian.Uint32(hdr[20:])\n\t\t\tinfo.snapshotting = false\n\t\t\tinfo.reason = \"\"\n\t\t\tinfo.clearSyncedToWALEnd = true\n\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"wal truncated after sync to end (expected checkpoint)\",\n\t\t\t\t\"new_salt1\", info.salt1,\n\t\t\t\t\"new_salt2\", info.salt2)\n\n\t\t\treturn info, nil\n\t\t}\n\n\t\tinfo.reason = \"wal truncated by another process\"\n\t\treturn info, nil\n\t}\n\n\t// Compare WAL headers. Restart from beginning of WAL if different.\n\thdr0, err := readWALHeader(db.WALPath())\n\tif err != nil {\n\t\treturn info, fmt.Errorf(\"cannot read wal header: %w\", err)\n\t}\n\tsalt1 := binary.BigEndian.Uint32(hdr0[16:])\n\tsalt2 := binary.BigEndian.Uint32(hdr0[20:])\n\tsaltMatch := salt1 == dec.Header().WALSalt1 \u0026\u0026 salt2 == dec.Header().WALSalt2\n\tif !saltMatch {\n\t\texec.state.truncatePassiveFailed = false\n\t}\n\n\t// Handle edge case where we're at WAL header (WALOffset=32, WALSize=0).\n\t// This can happen when an LTX file represents a state at the beginning of the WAL\n\t// with no frames written yet. We must check this before computing prevWALOffset\n\t// to avoid underflow (32 - 4120 = -4088).\n\t// See: https://github.com/benbjohnson/litestream/issues/900\n\tif info.offset == WALHeaderSize {\n\t\tdb.Logger.Debug(\"verify\", \"saltMatch\", saltMatch, \"atWALHeader\", true)\n\t\tif saltMatch {\n\t\t\tinfo.snapshotting = false\n\t\t\treturn info, nil\n\t\t}\n\t\tinfo.reason = \"wal header salt reset, snapshotting\"\n\t\treturn info, nil\n\t}\n\n\t// If offset is at the beginning of the first page, we can't check for previous page.\n\tprevWALOffset := info.offset - frameSize\n\tdb.Logger.Debug(\"verify\", \"saltMatch\", saltMatch, \"prevWALOffset\", prevWALOffset)\n\n\tif prevWALOffset == WALHeaderSize {\n\t\tif saltMatch { // No writes occurred since last sync, salt still matches\n\t\t\tinfo.snapshotting = false\n\t\t\treturn info, nil\n\t\t}\n\t\t// Salt has changed but we don't know if writes occurred since last sync\n\t\tinfo.reason = \"wal header salt reset, snapshotting\"\n\t\treturn info, nil\n\t} else if prevWALOffset \u003c WALHeaderSize {\n\t\treturn info, fmt.Errorf(\"prev WAL offset is less than the header size: %d\", prevWALOffset)\n\t}\n\n\t// If we can't verify the last page is in the last LTX file, then we need to snapshot.\n\tlastPageMatch, err := db.lastPageMatch(ctx, dec, prevWALOffset, frameSize)\n\tif err != nil {\n\t\treturn info, fmt.Errorf(\"last page match: %w\", err)\n\t} else if !lastPageMatch {\n\t\t// A snapshot must hold every frame not yet in the database file,\n\t\t// including those before the stale offset.\n\t\tinfo.offset = WALHeaderSize\n\t\tinfo.reason = \"last page does not exist in last ltx file, wal overwritten by another process\"\n\t\treturn info, nil\n\t}\n\n\tdb.Logger.Debug(\"verify.2\", \"lastPageMatch\", lastPageMatch)\n\n\t// Salt has changed which could indicate a FULL checkpoint.\n\t// If we have a last page match, then we can assume that the WAL has not been overwritten.\n\tif !saltMatch {\n\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"wal restarted\",\n\t\t\t\"salt1\", salt1,\n\t\t\t\"salt2\", salt2)\n\n\t\tinfo.offset = WALHeaderSize\n\t\tinfo.salt1, info.salt2 = salt1, salt2\n\n\t\tif detected, err := db.detectFullCheckpoint(ctx, [][2]uint32{{salt1, salt2}, {dec.Header().WALSalt1, dec.Header().WALSalt2}}); err != nil {\n\t\t\treturn info, fmt.Errorf(\"detect full checkpoint: %w\", err)\n\t\t} else if detected {\n\t\t\tinfo.reason = \"full or restart checkpoint detected, snapshotting\"\n\t\t} else {\n\t\t\tinfo.snapshotting = false\n\t\t}\n\n\t\treturn info, nil\n\t}\n\n\tinfo.snapshotting = false\n\n\treturn info, nil\n}\n\n// lastPageMatch checks if the last page read in the WAL exists in the last LTX file.\nfunc (db *DB) lastPageMatch(ctx context.Context, dec *ltx.Decoder, prevWALOffset, frameSize int64) (bool, error) {\n\tif prevWALOffset \u003c= WALHeaderSize {\n\t\treturn false, nil\n\t}\n\n\tframe, err := readWALFileAt(db.WALPath(), prevWALOffset, frameSize)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"cannot read last synced wal page: %w\", err)\n\t}\n\tpgno := binary.BigEndian.Uint32(frame[0:])\n\tfsalt1 := binary.BigEndian.Uint32(frame[8:])\n\tfsalt2 := binary.BigEndian.Uint32(frame[12:])\n\tdata := frame[WALFrameHeaderSize:]\n\n\tif fsalt1 != dec.Header().WALSalt1 || fsalt2 != dec.Header().WALSalt2 {\n\t\treturn false, nil\n\t}\n\n\t// Verify that the last page in the WAL exists in the last LTX file.\n\tbuf := make([]byte, dec.Header().PageSize)\n\tfor {\n\t\tvar hdr ltx.PageHeader\n\t\tif err := dec.DecodePage(\u0026hdr, buf); errors.Is(err, io.EOF) {\n\t\t\treturn false, nil // page not found in LTX file\n\t\t} else if err != nil {\n\t\t\treturn false, fmt.Errorf(\"decode ltx page: %w\", err)\n\t\t}\n\n\t\tif pgno != hdr.Pgno {\n\t\t\tcontinue // page number doesn't match\n\t\t}\n\t\tif !bytes.Equal(data, buf) {\n\t\t\tcontinue // page data doesn't match\n\t\t}\n\t\treturn true, nil // Page matches\n\t}\n}\n\n// detectFullCheckpoint attempts to detect checks if a FULL or RESTART checkpoint\n// has occurred and we may have missed some frames.\nfunc (db *DB) detectFullCheckpoint(ctx context.Context, knownSalts [][2]uint32) (bool, error) {\n\twalFile, err := os.Open(db.WALPath())\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"open wal file: %w\", err)\n\t}\n\tdefer walFile.Close()\n\n\tvar lastKnownSalt [2]uint32\n\tif len(knownSalts) \u003e 0 {\n\t\tlastKnownSalt = knownSalts[len(knownSalts)-1]\n\t}\n\n\trd, err := NewWALReader(walFile, db.Logger.With(LogKeySubsystem, LogSubsystemWALReader))\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"new wal reader: %w\", err)\n\t}\n\tm, err := rd.FrameSaltsUntil(ctx, lastKnownSalt)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"frame salts until: %w\", err)\n\t}\n\n\t// Remove known salts from the map.\n\tfor _, salt := range knownSalts {\n\t\tdelete(m, salt)\n\t}\n\n\t// If we have more than one unknown salt, then we have a FULL or RESTART checkpoint.\n\treturn len(m) \u003e= 1, nil\n}\n\ntype syncInfo struct {\n\toffset int64 // end of the previous LTX read\n\tsalt1 uint32\n\tsalt2 uint32\n\tprevCommit uint32\n\tsnapshotting bool // if true, a full snapshot is required\n\treason string // reason for snapshot\n\tclearSyncedToWALEnd bool\n}\n\ntype syncResult struct {\n\torigWALSize int64\n\tnewWALSize int64\n\tsynced bool\n\tlimited bool\n\tsyncedToWALEnd bool\n\tpos *ltx.Pos\n\tl0FileInfo *ltx.FileInfo\n}\n\nfunc (db *DB) applySyncResult(state *syncState, result syncResult) {\n\tstate.lastSyncedWALOffset = result.newWALSize\n\tstate.syncedToWALEnd = result.syncedToWALEnd\n\tif result.pos != nil {\n\t\tdb.pos.Lock()\n\t\tdb.pos.value = result.pos\n\t\tdb.pos.Unlock()\n\t}\n\tif result.l0FileInfo != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdb.maxLTXFileInfos.m[0] = result.l0FileInfo\n\t\tdb.maxLTXFileInfos.Unlock()\n\t}\n}\n\nfunc (db *DB) newSyncExecutor(ctx context.Context) (*syncExecutor, error) {\n\tdb.mu.Lock()\n\tdefer db.mu.Unlock()\n\n\tif err := db.init(ctx); err != nil {\n\t\treturn nil, err\n\t} else if db.db == nil {\n\t\treturn nil, nil\n\t}\n\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\treturn \u0026syncExecutor{\n\t\tstate: db.syncState,\n\t\tpos: pos,\n\t}, nil\n}\n\nfunc (db *DB) applySyncExecutor(exec *syncExecutor, notify bool) {\n\tif exec == nil {\n\t\treturn\n\t}\n\n\t// Only publish the position if this executor advanced it. Republishing\n\t// the snapshot taken at executor start would clobber concurrent cache\n\t// invalidation (e.g. ResetLocalState) with a stale position.\n\tif exec.posChanged {\n\t\tdb.pos.Lock()\n\t\tpos := exec.pos\n\t\tdb.pos.value = \u0026pos\n\t\tdb.pos.Unlock()\n\t}\n\n\tif exec.l0FileInfo != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tinfo := *exec.l0FileInfo\n\t\tdb.maxLTXFileInfos.m[0] = \u0026info\n\t\tdb.maxLTXFileInfos.Unlock()\n\t}\n\n\tdb.mu.Lock()\n\tdb.syncState = exec.state\n\tif notify \u0026\u0026 exec.synced {\n\t\tclose(db.notify)\n\t\tdb.notify = make(chan struct{})\n\t}\n\tdb.mu.Unlock()\n}\n\nfunc (exec *syncExecutor) applySyncResult(result syncResult) {\n\texec.state.lastSyncedWALOffset = result.newWALSize\n\texec.state.syncedToWALEnd = result.syncedToWALEnd\n\tif result.pos != nil {\n\t\texec.pos = *result.pos\n\t\texec.posChanged = true\n\t}\n\tif result.l0FileInfo != nil {\n\t\tinfo := *result.l0FileInfo\n\t\texec.l0FileInfo = \u0026info\n\t}\n\texec.synced = exec.synced || result.synced\n}\n\n// sync copies pending bytes from the real WAL to LTX.\n// Returns synced=true if an LTX file was created (i.e., there were new pages to sync).\nfunc (db *DB) sync(ctx context.Context, checkpointing bool, exec *syncExecutor, info syncInfo, maxSyncWALBytes int64) (result syncResult, err error) {\n\tresult.newWALSize = exec.state.lastSyncedWALOffset\n\tresult.syncedToWALEnd = exec.state.syncedToWALEnd\n\tif info.clearSyncedToWALEnd {\n\t\tresult.syncedToWALEnd = false\n\t}\n\n\t// Determine the next sequential transaction ID.\n\ttxID := exec.pos.TXID + 1\n\tdb.setSyncDiagPhase(diagPhaseSyncOpenLTX,\n\t\tfunc(s *diagState) {\n\t\t\ts.txID = txID\n\t\t\ts.snapshotting = info.snapshotting\n\t\t\ts.reason = info.reason\n\t\t})\n\n\tfilename := db.LTXPath(0, txID, txID)\n\n\tlogArgs := []any{\n\t\t\"txid\", txID.String(),\n\t\t\"offset\", info.offset,\n\t}\n\tif checkpointing {\n\t\tlogArgs = append(logArgs, \"chkpt\", \"true\")\n\t}\n\tif info.snapshotting {\n\t\tlogArgs = append(logArgs, \"snap\", \"true\")\n\t}\n\tif info.reason != \"\" {\n\t\tlogArgs = append(logArgs, \"reason\", info.reason)\n\t}\n\tdb.Logger.Debug(\"sync\", logArgs...)\n\n\t// Prevent internal checkpoints during sync. Ignore if already in a checkpoint.\n\tif !checkpointing {\n\t\tdb.chkMu.RLock()\n\t\tdefer db.chkMu.RUnlock()\n\t}\n\n\tfi, err := db.f.Stat()\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tmode := fi.Mode()\n\tcommit := uint32(fi.Size() / int64(db.pageSize))\n\n\twalFile, err := os.Open(db.WALPath())\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer walFile.Close()\n\n\twalReaderLogger := db.Logger.With(LogKeySubsystem, LogSubsystemWALReader)\n\tvar rd *WALReader\n\tif info.offset == WALHeaderSize {\n\t\tif rd, err = NewWALReader(walFile, walReaderLogger); err != nil {\n\t\t\treturn result, fmt.Errorf(\"new wal reader: %w\", err)\n\t\t}\n\t} else {\n\t\t// If we cannot verify the previous frame\n\t\tvar pfmError *PrevFrameMismatchError\n\t\tif rd, err = NewWALReaderWithOffset(ctx, walFile, info.offset, info.salt1, info.salt2, walReaderLogger); errors.As(err, \u0026pfmError) {\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"prev frame mismatch, snapshotting\", \"err\", pfmError.Err)\n\t\t\tinfo.offset = WALHeaderSize\n\t\t\tif rd, err = NewWALReader(walFile, walReaderLogger); err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"new wal reader, after reset\")\n\t\t\t}\n\t\t} else if err != nil {\n\t\t\treturn result, fmt.Errorf(\"new wal reader with offset: %w\", err)\n\t\t}\n\t}\n\n\t// Build a mapping of changed page numbers and their latest content.\n\tdb.setSyncDiagPhase(diagPhaseSyncPageMap,\n\t\tfunc(s *diagState) {\n\t\t\ts.txID = txID\n\t\t\ts.snapshotting = info.snapshotting\n\t\t\ts.reason = info.reason\n\t\t})\n\tif info.snapshotting {\n\t\tmaxSyncWALBytes = 0\n\t}\n\tpageMap, maxOffset, walCommit, limited, err := rd.pageMap(ctx, maxSyncWALBytes)\n\tif err != nil {\n\t\treturn result, fmt.Errorf(\"page map: %w\", err)\n\t}\n\tresult.limited = limited\n\tif walCommit \u003e 0 {\n\t\tcommit = walCommit\n\t}\n\tvar sz int64\n\tif maxOffset \u003e 0 {\n\t\tsz = maxOffset - info.offset\n\t}\n\tassert(sz \u003e= 0, fmt.Sprintf(\"wal size must be positive: sz=%d, maxOffset=%d, info.offset=%d\", sz, maxOffset, info.offset))\n\tdb.setSyncDiagPhase(diagPhaseSyncPrepareLTX,\n\t\tfunc(s *diagState) {\n\t\t\ts.txID = txID\n\t\t\ts.walSize = sz\n\t\t\ts.snapshotting = info.snapshotting\n\t\t\ts.reason = info.reason\n\t\t})\n\n\t// Track total WAL bytes synced.\n\tif sz \u003e 0 {\n\t\tdb.totalWALBytesCounter.Add(float64(sz))\n\t}\n\n\t// Exit if we have no new WAL pages and we aren't snapshotting.\n\tif !info.snapshotting \u0026\u0026 sz == 0 {\n\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"sync: skip\", \"reason\", \"no new wal pages\")\n\t\treturn result, nil\n\t}\n\n\ttmpFilename := filename + \".tmp\"\n\tif err := internal.MkdirAll(filepath.Dir(tmpFilename), db.dirInfo); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-mkdir\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, err\n\t}\n\n\tltxFile, err := db.openLTXFile(tmpFilename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode)\n\tif err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-open\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"open temp ltx file: %w\", err)\n\t}\n\tdefer func() { _ = os.Remove(tmpFilename) }()\n\tdefer func() { _ = ltxFile.Close() }()\n\n\tuid, gid := internal.Fileinfo(db.fileInfo)\n\t_ = os.Chown(tmpFilename, uid, gid)\n\n\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode header\",\n\t\t\"txid\", txID.String(),\n\t\t\"commit\", commit,\n\t\t\"walOffset\", info.offset,\n\t\t\"walSize\", sz,\n\t\t\"salt1\", rd.salt1,\n\t\t\"salt2\", rd.salt2)\n\n\ttimestamp := time.Now()\n\tenc, err := ltx.NewEncoder(ltxFile)\n\tif err != nil {\n\t\treturn result, fmt.Errorf(\"new ltx encoder: %w\", err)\n\t}\n\tif err := enc.EncodeHeader(ltx.Header{\n\t\tVersion: ltx.Version,\n\t\tFlags: ltx.HeaderFlagNoChecksum,\n\t\tPageSize: uint32(db.pageSize),\n\t\tCommit: commit,\n\t\tMinTXID: txID,\n\t\tMaxTXID: txID,\n\t\tTimestamp: timestamp.UnixMilli(),\n\t\tWALOffset: info.offset,\n\t\tWALSize: sz,\n\t\tWALSalt1: rd.salt1,\n\t\tWALSalt2: rd.salt2,\n\t}); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-write\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"encode ltx header: %w\", err)\n\t}\n\n\t// If we need a full snapshot, then copy from the database \u0026 WAL.\n\t// Otherwise, just copy incrementally from the WAL.\n\tif info.snapshotting {\n\t\tdb.setSyncDiagPhase(diagPhaseWriteLTXFromDB,\n\t\t\tfunc(s *diagState) {\n\t\t\t\ts.txID = txID\n\t\t\t\ts.walSize = sz\n\t\t\t\ts.snapshotting = true\n\t\t\t\ts.reason = info.reason\n\t\t\t})\n\t\tif err := db.writeLTXFromDB(ctx, enc, walFile, commit, pageMap); err != nil {\n\t\t\tif isDiskFullError(err) {\n\t\t\t\treturn result, NewLTXError(\"stage-write\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t\t}\n\t\t\treturn result, fmt.Errorf(\"write ltx from db: %w\", err)\n\t\t}\n\t} else {\n\t\tdb.setSyncDiagPhase(diagPhaseWriteLTXFromWAL,\n\t\t\tfunc(s *diagState) {\n\t\t\t\ts.txID = txID\n\t\t\t\ts.walSize = sz\n\t\t\t\ts.snapshotting = false\n\t\t\t\ts.reason = info.reason\n\t\t\t})\n\t\tif err := db.writeLTXFromWAL(ctx, enc, walFile, info.prevCommit, commit, pageMap); err != nil {\n\t\t\tif isDiskFullError(err) {\n\t\t\t\treturn result, NewLTXError(\"stage-write\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t\t}\n\t\t\treturn result, fmt.Errorf(\"write ltx from wal: %w\", err)\n\t\t}\n\t}\n\n\t// Encode final trailer to the end of the LTX file.\n\tdb.setSyncDiagPhase(diagPhaseCloseLTX, func(s *diagState) {\n\t\ts.txID = txID\n\t\ts.walSize = sz\n\t})\n\tif err := enc.Close(); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-write\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"close ltx encoder: %w\", err)\n\t}\n\n\t// Sync \u0026 close LTX file.\n\tdb.setSyncDiagPhase(diagPhaseFsyncLTX, func(s *diagState) {\n\t\ts.txID = txID\n\t\ts.walSize = sz\n\t})\n\tif err := ltxFile.Sync(); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-sync\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"sync ltx file: %w\", err)\n\t}\n\tif err := ltxFile.Close(); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-close\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"close ltx file: %w\", err)\n\t}\n\n\t// Atomically rename file to final path.\n\tdb.setSyncDiagPhase(diagPhaseRenameLTX, func(s *diagState) {\n\t\ts.txID = txID\n\t\ts.walSize = sz\n\t})\n\tif err := os.Rename(tmpFilename, filename); err != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdelete(db.maxLTXFileInfos.m, 0) // clear cache if in unknown state\n\t\tdb.maxLTXFileInfos.Unlock()\n\t\tdb.invalidatePosCache()\n\t\treturn result, fmt.Errorf(\"rename ltx file: %w\", err)\n\t}\n\tif err := internal.FsyncDir(filepath.Dir(filename)); err != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdelete(db.maxLTXFileInfos.m, 0) // clear cache if in unknown state\n\t\tdb.maxLTXFileInfos.Unlock()\n\t\tdb.invalidatePosCache()\n\t\treturn result, fmt.Errorf(\"sync ltx dir: %w\", err)\n\t}\n\n\tresult.synced = true\n\tresult.l0FileInfo = \u0026ltx.FileInfo{\n\t\tLevel: 0,\n\t\tMinTXID: txID,\n\t\tMaxTXID: txID,\n\t\tCreatedAt: time.Now(),\n\t\tSize: enc.N(),\n\t}\n\n\tencPos := enc.PostApplyPos()\n\tresult.pos = \u0026encPos\n\n\t// Track the logical end of WAL content for checkpoint decisions.\n\t// This is the WALOffset + WALSize from the LTX we just created.\n\t// Using this instead of file size prevents issue #997 where stale\n\t// frames with old salt values cause perpetual checkpoint triggering.\n\tfinalOffset := info.offset + sz\n\tresult.newWALSize = finalOffset\n\n\t// Track if we synced to the exact end of the WAL file.\n\t// This is used by verify() to distinguish expected checkpoint truncation\n\t// from unexpected external WAL modifications. See issue #927.\n\tif walSize, err := db.walFileSize(); err == nil {\n\t\tresult.syncedToWALEnd = finalOffset == walSize\n\t} else {\n\t\tresult.syncedToWALEnd = false\n\t}\n\tdb.setSyncDiagPhase(diagPhaseSyncComplete,\n\t\tfunc(s *diagState) {\n\t\t\ts.txID = txID\n\t\t\ts.walSize = sz\n\t\t\ts.lastSyncedWALOffset = finalOffset\n\t\t\ts.snapshotting = info.snapshotting\n\t\t\ts.reason = info.reason\n\t\t})\n\n\tdb.Logger.Debug(\"db sync\", \"status\", \"ok\")\n\n\treturn result, nil\n}\n\nfunc (db *DB) writeLTXFromDB(ctx context.Context, enc *ltx.Encoder, walFile *os.File, commit uint32, pageMap map[uint32]int64) error {\n\tlockPgno := ltx.LockPgno(uint32(db.pageSize))\n\tdata := make([]byte, db.pageSize)\n\n\tfor pgno := uint32(1); pgno \u003c= commit; pgno++ {\n\t\tif pgno == lockPgno {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check if the caller has canceled during processing.\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn context.Cause(ctx)\n\t\tdefault:\n\t\t}\n\n\t\t// If page exists in the WAL, read from there.\n\t\tif offset, ok := pageMap[pgno]; ok {\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode page from wal\", \"txid\", enc.Header().MinTXID, \"offset\", offset, \"pgno\", pgno, \"type\", \"db+wal\")\n\n\t\t\tif n, err := walFile.ReadAt(data, offset+WALFrameHeaderSize); err != nil {\n\t\t\t\treturn fmt.Errorf(\"read page %d @ %d: %w\", pgno, offset, err)\n\t\t\t} else if n != len(data) {\n\t\t\t\treturn fmt.Errorf(\"short read page %d @ %d\", pgno, offset)\n\t\t\t}\n\n\t\t\tif err := enc.EncodePage(ltx.PageHeader{Pgno: pgno}, data); err != nil {\n\t\t\t\treturn fmt.Errorf(\"encode ltx frame (pgno=%d): %w\", pgno, err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\toffset := int64(pgno-1) * int64(db.pageSize)\n\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode page from database\", \"offset\", offset, \"pgno\", pgno)\n\n\t\t// Otherwise read directly from the database file.\n\t\tif _, err := db.f.ReadAt(data, offset); err != nil {\n\t\t\treturn fmt.Errorf(\"read database page %d: %w\", pgno, err)\n\t\t}\n\t\tif err := enc.EncodePage(ltx.PageHeader{Pgno: pgno}, data); err != nil {\n\t\t\treturn fmt.Errorf(\"encode ltx frame (pgno=%d): %w\", pgno, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (db *DB) writeLTXFromWAL(ctx context.Context, enc *ltx.Encoder, walFile *os.File, prevCommit, commit uint32, pageMap map[uint32]int64) error {\n\t// Create an ordered list of page numbers since the LTX encoder requires it.\n\tpgnos := make([]uint32, 0, len(pageMap))\n\tfor pgno := range pageMap {\n\t\tpgnos = append(pgnos, pgno)\n\t}\n\tlockPgno := ltx.LockPgno(uint32(db.pageSize))\n\tif commit \u003e prevCommit {\n\t\twalPgnoN := len(pgnos)\n\t\tfor pgno := prevCommit + 1; pgno \u003c= commit; pgno++ {\n\t\t\tif pgno == lockPgno {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, ok := pageMap[pgno]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tpgnos = append(pgnos, pgno)\n\t\t}\n\t\tif growthPgnoN := len(pgnos) - walPgnoN; growthPgnoN \u003e 0 {\n\t\t\tdb.Logger.Debug(\"filling wal growth pages from database\",\n\t\t\t\t\"txid\", enc.Header().MinTXID,\n\t\t\t\t\"n\", growthPgnoN,\n\t\t\t\t\"prev_commit\", prevCommit,\n\t\t\t\t\"commit\", commit)\n\t\t}\n\t}\n\tslices.Sort(pgnos)\n\n\tdata := make([]byte, db.pageSize)\n\tfor _, pgno := range pgnos {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn context.Cause(ctx)\n\t\tdefault:\n\t\t}\n\t\tif offset, ok := pageMap[pgno]; ok {\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode page from wal\", \"txid\", enc.Header().MinTXID, \"offset\", offset, \"pgno\", pgno, \"type\", \"walonly\")\n\n\t\t\tif n, err := walFile.ReadAt(data, offset+WALFrameHeaderSize); err != nil {\n\t\t\t\treturn fmt.Errorf(\"read page %d @ %d: %w\", pgno, offset, err)\n\t\t\t} else if n != len(data) {\n\t\t\t\treturn fmt.Errorf(\"short read page %d @ %d\", pgno, offset)\n\t\t\t}\n\t\t} else {\n\t\t\toffset := int64(pgno-1) * int64(db.pageSize)\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode page from database\", \"txid\", enc.Header().MinTXID, \"offset\", offset, \"pgno\", pgno, \"type\", \"walgrowth\")\n\n\t\t\tif _, err := db.f.ReadAt(data, offset); err != nil {\n\t\t\t\treturn fmt.Errorf(\"read database page %d: %w\", pgno, err)\n\t\t\t}\n\t\t}\n\n\t\tif err := enc.EncodePage(ltx.PageHeader{Pgno: pgno}, data); err != nil {\n\t\t\treturn fmt.Errorf(\"encode ltx frame (pgno=%d): %w\", pgno, err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// Checkpoint performs a checkpoint on the WAL file.\nfunc (db *DB) Checkpoint(ctx context.Context, mode string) (err error) {\n\tif err := db.lockExec(ctx); err != nil {\n\t\treturn err\n\t}\n\tdefer db.execSem.Release(1)\n\tdb.beginSyncDiag(diagOpCheckpoint)\n\tdefer func() { db.finishSyncDiag(err) }()\n\n\texec, err := db.newSyncExecutor(ctx)\n\tif err != nil {\n\t\treturn err\n\t} else if exec == nil {\n\t\treturn nil\n\t}\n\tdefer db.applySyncExecutor(exec, true)\n\n\t_, err = db.checkpointWithExecutor(ctx, mode, exec)\n\treturn err\n}\n\n// checkpoint performs a checkpoint on the WAL file and initializes a\n// new shadow WAL file.\nfunc (db *DB) checkpoint(ctx context.Context, mode string, state *syncState) error {\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\texec := \u0026syncExecutor{\n\t\tstate: *state,\n\t\tpos: pos,\n\t}\n\tif _, err := db.checkpointWithExecutor(ctx, mode, exec); err != nil {\n\t\treturn err\n\t}\n\n\t*state = exec.state\n\tdb.pos.Lock()\n\tpos = exec.pos\n\tdb.pos.value = \u0026pos\n\tdb.pos.Unlock()\n\tif exec.l0FileInfo != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tinfo := *exec.l0FileInfo\n\t\tdb.maxLTXFileInfos.m[0] = \u0026info\n\t\tdb.maxLTXFileInfos.Unlock()\n\t}\n\treturn nil\n}\n\n// checkpointWithExecutor performs a checkpoint in the given mode and reports\n// whether the checkpoint restarted the WAL. It returns false without\n// checkpointing when the checkpoint lock is held by an in-progress snapshot.\nfunc (db *DB) checkpointWithExecutor(ctx context.Context, mode string, exec *syncExecutor) (walRestarted bool, err error) {\n\texec.checkpointAttempted = false\n\tdb.setSyncDiagPhase(diagPhaseCheckpointLock,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\t// Try getting a checkpoint lock, will fail during snapshots. Skipping is\n\t// safe since the next sync retries.\n\tif !db.chkMu.TryLock() {\n\t\tif mode == CheckpointModeTruncate {\n\t\t\tdb.Logger.Info(\"checkpoint skipped, snapshot in progress\", \"mode\", mode)\n\t\t} else {\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"checkpoint skipped, snapshot in progress\", \"mode\", mode)\n\t\t}\n\t\treturn false, nil\n\t}\n\tdefer db.chkMu.Unlock()\n\texec.checkpointAttempted = true\n\n\t// Read WAL header before checkpoint to check if it has been restarted.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointReadWALHeader,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\thdr, err := readWALHeader(db.WALPath())\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Copy end of WAL before checkpoint to copy as much as possible.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointCopyBefore,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\tresult, err := db.verifyAndSyncWithExecutor(ctx, true, exec, 0)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"cannot copy wal before checkpoint: %w\", err)\n\t}\n\texec.applySyncResult(result)\n\n\tvar barrierTx *sql.Tx\n\tif mode == CheckpointModePassive {\n\t\tbarrierTx, err = db.db.BeginTx(ctx, nil)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"begin passive checkpoint barrier: %w\", err)\n\t\t}\n\t\tdefer func() {\n\t\t\tif barrierTx != nil {\n\t\t\t\t_ = rollback(barrierTx)\n\t\t\t}\n\t\t}()\n\n\t\tif _, err := barrierTx.ExecContext(ctx, `INSERT INTO _litestream_lock (id) VALUES (1);`); err != nil {\n\t\t\treturn false, fmt.Errorf(\"_litestream_lock: %w\", err)\n\t\t}\n\n\t\tresult, err = db.verifyAndSyncWithExecutor(ctx, true, exec, 0)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"cannot seal wal before passive checkpoint: %w\", err)\n\t\t}\n\t\texec.applySyncResult(result)\n\t}\n\n\tframeSize := int64(db.pageSize + WALFrameHeaderSize)\n\tpreCheckpointFrameN := 0\n\tif exec.state.lastSyncedWALOffset \u003e WALHeaderSize {\n\t\tpreCheckpointFrameN = int((exec.state.lastSyncedWALOffset - WALHeaderSize) / frameSize)\n\t}\n\n\t// Execute checkpoint and immediately issue a write to the WAL to ensure\n\t// a new page is written.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointExec,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\twalFrameN, err := db.execCheckpoint(ctx, mode)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tif barrierTx != nil {\n\t\tif err = rollback(barrierTx); err != nil {\n\t\t\treturn false, fmt.Errorf(\"rollback passive checkpoint barrier: %w\", err)\n\t\t}\n\t\tbarrierTx = nil\n\t}\n\n\tif err = db.bumpLitestreamSeq(ctx); err != nil {\n\t\treturn false, fmt.Errorf(\"bump litestream seq: %w\", err)\n\t}\n\n\t// If WAL hasn't been restarted, exit.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointVerifyRestart,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\tother, err := readWALHeader(db.WALPath())\n\tif err != nil {\n\t\treturn false, err\n\t} else if bytes.Equal(hdr, other) {\n\t\texec.state.syncedSinceCheckpoint = false\n\t\treturn false, nil\n\t}\n\texec.state.truncatePassiveFailed = false\n\n\tif mode == CheckpointModePassive {\n\t\tresult, err = db.verifyAndSyncWithExecutor(ctx, true, exec, 0)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"cannot copy wal after passive checkpoint: %w\", err)\n\t\t}\n\t\texec.applySyncResult(result)\n\t\texec.state.syncedSinceCheckpoint = false\n\t\treturn true, nil\n\t}\n\n\t// A successful TRUNCATE checkpoint always reports zero frames because\n\t// the WAL is reset before the counters are read, so the comparison\n\t// below can never prove that no commits landed between the sealed\n\t// sync and the checkpoint taking the writer lock. Those commits are\n\t// backfilled and truncated unseen, so TRUNCATE must take the boundary\n\t// snapshot unconditionally.\n\tif mode != CheckpointModeTruncate \u0026\u0026 walFrameN \u003c= preCheckpointFrameN {\n\t\tresult, err = db.verifyAndSyncWithExecutor(ctx, true, exec, 0)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"cannot copy wal after checkpoint: %w\", err)\n\t\t}\n\t\texec.applySyncResult(result)\n\t\texec.state.syncedSinceCheckpoint = false\n\t\treturn true, nil\n\t}\n\n\t// Start a transaction. This will be promoted immediately after.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointSnapshotBoundaryLock,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\ttx, err := db.db.BeginTx(ctx, nil)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"begin: %w\", err)\n\t}\n\tdefer func() { _ = rollback(tx) }()\n\n\t// Insert into the lock table to promote to a write tx. The lock table\n\t// insert will never actually occur because our tx will be rolled back,\n\t// however, it will ensure our tx grabs the write lock. Unfortunately,\n\t// we can't call \"BEGIN IMMEDIATE\" as we are already in a transaction.\n\tif _, err := tx.ExecContext(ctx, `INSERT INTO _litestream_lock (id) VALUES (1);`); err != nil {\n\t\treturn false, fmt.Errorf(\"_litestream_lock: %w\", err)\n\t}\n\n\t// Copy anything that may have occurred after the checkpoint.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointSnapshotBoundary,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\tsnapshotInfo := syncInfo{\n\t\toffset: WALHeaderSize,\n\t\tsalt1: binary.BigEndian.Uint32(other[16:]),\n\t\tsalt2: binary.BigEndian.Uint32(other[20:]),\n\t\tsnapshotting: true,\n\t\treason: \"checkpoint boundary snapshot\",\n\t}\n\tresult, err = db.sync(ctx, true, exec, snapshotInfo, 0)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"cannot snapshot after checkpoint: %w\", err)\n\t}\n\texec.applySyncResult(result)\n\n\t// Release write lock before exiting.\n\t// Use rollback() helper for consistency with releaseReadLock() and the\n\t// defer above. See issue #934.\n\tif err := rollback(tx); err != nil {\n\t\treturn false, fmt.Errorf(\"rollback post-checkpoint tx: %w\", err)\n\t}\n\n\texec.state.syncedSinceCheckpoint = false\n\treturn true, nil\n}\n\n// execCheckpoint issues a wal_checkpoint PRAGMA in the given mode and returns\n// the number of frames in the WAL as reported by the checkpoint.\nfunc (db *DB) execCheckpoint(ctx context.Context, mode string) (walFrameN int, err error) {\n\t// Ignore if there is no underlying database.\n\tif db.db == nil {\n\t\treturn 0, nil\n\t}\n\n\t// Track checkpoint metrics.\n\tt := time.Now()\n\tdefer func() {\n\t\tlabels := prometheus.Labels{\"mode\": mode}\n\t\tdb.checkpointNCounterVec.With(labels).Inc()\n\t\tif err != nil {\n\t\t\tdb.checkpointErrorNCounterVec.With(labels).Inc()\n\t\t}\n\t\taddDurationToCounter(db.checkpointSecondsCounterVec.With(labels), time.Since(t))\n\t}()\n\n\t// Ensure the read lock has been removed before issuing a checkpoint.\n\t// We defer the re-acquire to ensure it occurs even on an early return.\n\tif err := db.releaseReadLock(); err != nil {\n\t\treturn 0, fmt.Errorf(\"release read lock: %w\", err)\n\t}\n\tdefer func() { _ = db.acquireReadLock(ctx) }()\n\n\t// A non-forced checkpoint is issued as \"PASSIVE\". This will only checkpoint\n\t// if there are not pending transactions. A forced checkpoint (\"RESTART\")\n\t// will wait for pending transactions to end \u0026 block new transactions before\n\t// forcing the checkpoint and restarting the WAL.\n\t//\n\t// See: https://www.sqlite.org/pragma.html#pragma_wal_checkpoint\n\trawsql := `PRAGMA wal_checkpoint(` + mode + `);`\n\n\tvar row [3]int\n\tif err := db.db.QueryRowContext(ctx, rawsql).Scan(\u0026row[0], \u0026row[1], \u0026row[2]); err != nil {\n\t\treturn 0, err\n\t}\n\tdb.Logger.Debug(\"checkpoint\", \"mode\", mode, \"result\", fmt.Sprintf(\"%d,%d,%d\", row[0], row[1], row[2]))\n\n\t// Reacquire the read lock immediately after the checkpoint.\n\tif err := db.acquireReadLock(ctx); err != nil {\n\t\treturn 0, fmt.Errorf(\"reacquire read lock: %w\", err)\n\t}\n\n\treturn row[1], nil\n}\n\ntype snapshotReadPosition struct {\n\tpos ltx.Pos\n\tpageSize int\n\twalEndOffset int64\n\tdb *DB\n\tcloseOnce sync.Once\n}\n\nfunc (p *snapshotReadPosition) close() {\n\tp.closeOnce.Do(func() { p.db.chkMu.RUnlock() })\n}\n\ntype snapshotReadCloser struct {\n\t*io.PipeReader\n\tpos *snapshotReadPosition\n}\n\nfunc (r *snapshotReadCloser) Close() error {\n\tdefer r.pos.close()\n\treturn r.PipeReader.Close()\n}\n\n// SnapshotReader returns the current position of the database \u0026 a reader that contains a full database snapshot.\n// Internal checkpoints remain disabled until the reader reaches EOF or is\n// closed. Callers must close readers they do not fully consume; abandoning a\n// reader blocks checkpoints indefinitely.\nfunc (db *DB) SnapshotReader(ctx context.Context) (ltx.Pos, io.ReadCloser, error) {\n\tpos, err := db.snapshotPosition(ctx)\n\tif err != nil {\n\t\treturn ltx.Pos{}, nil, err\n\t}\n\n\tr, err := db.snapshotReader(ctx, pos)\n\tif err != nil {\n\t\tpos.close()\n\t\treturn pos.pos, nil, err\n\t}\n\treturn pos.pos, r, nil\n}\n\nfunc (db *DB) snapshotPosition(ctx context.Context) (*snapshotReadPosition, error) {\n\tif err := db.lockExec(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\tdefer db.execSem.Release(1)\n\n\tpageSize := db.PageSize()\n\tpos, err := db.Pos()\n\n\tif pageSize == 0 {\n\t\tdb.Logger.Debug(\"page size not initialized yet\", \"pageSize\", 0)\n\t\treturn nil, \u0026DBNotReadyError{Reason: \"page size not initialized\"}\n\t}\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\twalEndOffset, err := db.snapshotWALEndOffset(pos)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif walEndOffset \u003c WALHeaderSize {\n\t\twalEndOffset = WALHeaderSize\n\t}\n\n\t// Acquire the checkpoint read lock while the executor semaphore is still\n\t// held (the deferred release runs after this function returns). Every\n\t// checkpoint takes chkMu under execSem, so this handoff guarantees no\n\t// checkpoint can run between capturing pos and locking chkMu — the\n\t// snapshot always matches the advertised position.\n\tdb.chkMu.RLock()\n\treturn \u0026snapshotReadPosition{\n\t\tpos: pos,\n\t\tpageSize: pageSize,\n\t\twalEndOffset: walEndOffset,\n\t\tdb: db,\n\t}, nil\n}\n\n// snapshotWALEndOffset returns the WAL offset a snapshot may read up to for\n// the given position. db.syncState is read without db.mu because every writer\n// mutates it while holding execSem, which the caller also holds.\nfunc (db *DB) snapshotWALEndOffset(pos ltx.Pos) (int64, error) {\n\tif db.syncState.lastSyncedWALOffset \u003e 0 {\n\t\treturn db.syncState.lastSyncedWALOffset, nil\n\t}\n\tif pos.TXID == 0 {\n\t\treturn WALHeaderSize, nil\n\t}\n\n\tltxPath := db.LTXPath(0, pos.TXID, pos.TXID)\n\tf, err := os.Open(ltxPath)\n\tif err != nil {\n\t\treturn 0, NewLTXError(\"open\", ltxPath, 0, uint64(pos.TXID), uint64(pos.TXID), err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tdec := ltx.NewDecoder(f)\n\tif err := dec.DecodeHeader(); err != nil {\n\t\treturn 0, NewLTXError(\"decode\", ltxPath, 0, uint64(pos.TXID), uint64(pos.TXID), fmt.Errorf(\"%w: %w\", ErrLTXCorrupted, err))\n\t}\n\n\t// Compare WAL headers. If the WAL was restarted since this LTX file was\n\t// written, its salts no longer match and its recorded extent does not\n\t// apply to the current WAL.\n\thdr, err := readWALHeader(db.WALPath())\n\tif os.IsNotExist(err) || errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) {\n\t\treturn WALHeaderSize, nil\n\t} else if err != nil {\n\t\treturn 0, fmt.Errorf(\"cannot read wal header: %w\", err)\n\t}\n\tsalt1 := binary.BigEndian.Uint32(hdr[16:])\n\tsalt2 := binary.BigEndian.Uint32(hdr[20:])\n\tif salt1 != dec.Header().WALSalt1 || salt2 != dec.Header().WALSalt2 {\n\t\treturn WALHeaderSize, nil\n\t}\n\n\treturn dec.Header().WALOffset + dec.Header().WALSize, nil\n}\n\nfunc (db *DB) snapshotReader(ctx context.Context, pos *snapshotReadPosition) (io.ReadCloser, error) {\n\tdb.Logger.Debug(\"snapshot\", \"txid\", pos.pos.TXID.String(), \"walEndOffset\", pos.walEndOffset)\n\n\t// TODO(ltx): Read database size from database header.\n\n\tfi, err := db.f.Stat()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcommit := uint32(fi.Size() / int64(pos.pageSize))\n\n\t// Execute encoding in a separate goroutine so the caller can initialize before reading.\n\tpr, pw := io.Pipe()\n\tgo func() {\n\t\tdefer pos.close()\n\n\t\twalFile, err := os.Open(db.WALPath())\n\t\tif err != nil {\n\t\t\tpw.CloseWithError(err)\n\t\t\treturn\n\t\t}\n\t\tdefer walFile.Close()\n\n\t\trd, err := NewWALReader(walFile, db.Logger.With(LogKeySubsystem, LogSubsystemWALReader))\n\t\tif err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"new wal reader: %w\", err))\n\t\t\treturn\n\t\t}\n\n\t\t// Build a mapping of changed page numbers and their latest content.\n\t\tmaxBytes := pos.walEndOffset - WALHeaderSize\n\t\tpageMap := make(map[uint32]int64)\n\t\tvar maxOffset int64\n\t\tvar walCommit uint32\n\t\tif maxBytes \u003e 0 {\n\t\t\tpageMap, maxOffset, walCommit, _, err = rd.pageMap(ctx, maxBytes)\n\t\t\tif err != nil {\n\t\t\t\tpw.CloseWithError(fmt.Errorf(\"page map: %w\", err))\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif walCommit \u003e 0 {\n\t\t\tcommit = walCommit\n\t\t}\n\n\t\tif maxOffset \u003e pos.walEndOffset {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"snapshot wal read exceeded bound: max offset %d \u003e end offset %d\", maxOffset, pos.walEndOffset))\n\t\t\treturn\n\t\t}\n\t\twalOffset, walSize := snapshotHeaderWALRange(maxOffset, int64(WALFrameHeaderSize+pos.pageSize))\n\n\t\tdb.Logger.Debug(\"encode snapshot header\",\n\t\t\t\"txid\", pos.pos.TXID.String(),\n\t\t\t\"commit\", commit,\n\t\t\t\"walOffset\", walOffset,\n\t\t\t\"walSize\", walSize,\n\t\t\t\"walEndOffset\", pos.walEndOffset,\n\t\t\t\"salt1\", rd.salt1,\n\t\t\t\"salt2\", rd.salt2)\n\n\t\tenc, err := ltx.NewEncoder(pw)\n\t\tif err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"new ltx encoder: %w\", err))\n\t\t\treturn\n\t\t}\n\t\tif err := enc.EncodeHeader(ltx.Header{\n\t\t\tVersion: ltx.Version,\n\t\t\tFlags: ltx.HeaderFlagNoChecksum,\n\t\t\tPageSize: uint32(pos.pageSize),\n\t\t\tCommit: commit,\n\t\t\tMinTXID: 1,\n\t\t\tMaxTXID: pos.pos.TXID,\n\t\t\tTimestamp: time.Now().UnixMilli(),\n\t\t\tWALOffset: walOffset,\n\t\t\tWALSize: walSize,\n\t\t\tWALSalt1: rd.salt1,\n\t\t\tWALSalt2: rd.salt2,\n\t\t}); err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"encode ltx snapshot header: %w\", err))\n\t\t\treturn\n\t\t}\n\n\t\tif err := db.writeLTXFromDB(ctx, enc, walFile, commit, pageMap); err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"write snapshot ltx: %w\", err))\n\t\t\treturn\n\t\t}\n\n\t\tif err := enc.Close(); err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"close ltx snapshot encoder: %w\", err))\n\t\t\treturn\n\t\t}\n\t\t_ = pw.Close()\n\t}()\n\n\treturn \u0026snapshotReadCloser{PipeReader: pr, pos: pos}, nil\n}\n\nfunc snapshotHeaderWALRange(maxOffset, frameSize int64) (offset, size int64) {\n\tif maxOffset \u003c= WALHeaderSize || frameSize \u003c= 0 {\n\t\treturn WALHeaderSize, 0\n\t}\n\toffset = max(maxOffset-frameSize, WALHeaderSize)\n\treturn offset, maxOffset - offset\n}\n\n// Compact performs a compaction of the LTX file at the previous level into dstLevel.\n// Returns metadata for the newly written compaction file. Returns ErrNoCompaction\n// if no new files are available to be compacted.\nfunc (db *DB) Compact(ctx context.Context, dstLevel int) (*ltx.FileInfo, error) {\n\tinfo, err := db.compactor.Compact(ctx, dstLevel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// If this is L1, clean up L0 files using the time-based retention policy.\n\tif dstLevel == 1 {\n\t\tif err := db.EnforceL0RetentionByTime(ctx); err != nil {\n\t\t\t// Don't log context cancellation errors during shutdown\n\t\t\tif !isShutdownError(ctx, err) {\n\t\t\t\tdb.Logger.Error(\"enforce L0 time retention\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn info, nil\n}\n\n// Snapshot writes a snapshot to the replica for the current database position.\n// It always writes, even when a snapshot already exists at the current\n// position, so operators can force a re-upload (replicate -force-snapshot).\n// Callers that want to skip duplicates check first, as Store.CompactDB does.\nfunc (db *DB) Snapshot(ctx context.Context) (*ltx.FileInfo, error) {\n\tpos, r, err := db.SnapshotReader(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer func() { _ = r.Close() }()\n\n\tinfo, err := db.Replica.Client.WriteLTXFile(ctx, SnapshotLevel, 1, pos.TXID, r)\n\tif err != nil {\n\t\treturn info, err\n\t}\n\n\tdb.maxLTXFileInfos.Lock()\n\tdb.maxLTXFileInfos.m[SnapshotLevel] = info\n\tdb.maxLTXFileInfos.Unlock()\n\n\treturn info, nil\n}\n\n// EnforceSnapshotRetention enforces retention of the snapshot level in the database by timestamp.\nfunc (db *DB) EnforceSnapshotRetention(ctx context.Context, timestamp time.Time) (minSnapshotTXID ltx.TXID, err error) {\n\tdb.Logger.Debug(\"enforcing snapshot retention\", \"timestamp\", timestamp)\n\n\t// Normal operation - use fast timestamps\n\titr, err := db.Replica.Client.LTXFiles(ctx, SnapshotLevel, 0, false)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar deleted []*ltx.FileInfo\n\tvar snapshots []*ltx.FileInfo\n\tvar lastInfo *ltx.FileInfo\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tsnapshots = append(snapshots, info)\n\t\tlastInfo = info\n\n\t\t// If this snapshot is before the retention timestamp, mark it for deletion.\n\t\tif info.CreatedAt.Before(timestamp) {\n\t\t\tdeleted = append(deleted, info)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// If this is the snapshot level, we need to ensure that at least one snapshot exists.\n\tif len(deleted) \u003e 0 \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\t// Use the last deleted snapshot's MaxTXID, rather than the first retained\n\t// snapshot's MaxTXID, to preserve lower-level files in an in-flight restore\n\t// plan. TestStore_EnforceSnapshotRetention_RetainsInFlightRestorePlanFiles\n\t// guards this conservative floor.\n\tfor i, info := range snapshots {\n\t\tif slices.Contains(deleted, info) {\n\t\t\tcontinue\n\t\t}\n\t\tif i \u003e 0 {\n\t\t\tminSnapshotTXID = snapshots[i-1].MaxTXID\n\t\t}\n\t\tbreak\n\t}\n\n\t// Remove files marked for deletion from remote storage (unless retention disabled).\n\tif !db.RetentionEnabled {\n\t\tdb.Logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", SnapshotLevel, \"count\", len(deleted))\n\t} else if err := db.Replica.Client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn 0, fmt.Errorf(\"remove ltx files: %w\", err)\n\t}\n\n\t// Always clean up local files.\n\tfor _, info := range deleted {\n\t\tlocalPath := db.LTXPath(SnapshotLevel, info.MinTXID, info.MaxTXID)\n\t\tdb.Logger.Debug(\"deleting local ltx file\", \"level\", SnapshotLevel, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", localPath)\n\n\t\tif err := os.Remove(localPath); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\tdb.Logger.Error(\"failed to remove local ltx file\", \"path\", localPath, \"error\", err)\n\t\t}\n\t}\n\n\treturn minSnapshotTXID, nil\n}\n\n// EnforceL0RetentionByTime retains L0 files until they have been compacted into\n// L1 and have existed for at least L0Retention.\nfunc (db *DB) EnforceL0RetentionByTime(ctx context.Context) error {\n\tif db.L0Retention \u003c= 0 {\n\t\treturn nil\n\t}\n\n\tdb.Logger.Debug(\"starting l0 retention enforcement\", \"retention\", db.L0Retention)\n\n\tdbName := filepath.Base(db.Path())\n\n\t// Determine the highest TXID that has been compacted into L1.\n\titr, err := db.Replica.Client.LTXFiles(ctx, 1, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch l1 files: %w\", err)\n\t}\n\tvar maxL1TXID ltx.TXID\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tif info.MaxTXID \u003e maxL1TXID {\n\t\t\tmaxL1TXID = info.MaxTXID\n\t\t}\n\t}\n\tif err := itr.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close l1 iterator: %w\", err)\n\t}\n\tif maxL1TXID == 0 {\n\t\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"eligible\").Set(0)\n\t\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"not_compacted\").Set(0)\n\t\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"too_recent\").Set(0)\n\t\treturn nil\n\t}\n\n\tthreshold := time.Now().Add(-db.L0Retention)\n\titr, err = db.Replica.Client.LTXFiles(ctx, 0, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch l0 files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar (\n\t\tdeleted []*ltx.FileInfo\n\t\tlastInfo *ltx.FileInfo\n\t\tprocessedAll = true\n\t\ttotalFiles int\n\t\tnotCompactedCount int\n\t\ttooRecentCount int\n\t)\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tlastInfo = info\n\t\ttotalFiles++\n\n\t\tcreatedAt := info.CreatedAt\n\t\tif createdAt.IsZero() {\n\t\t\tif fi, err := os.Stat(db.LTXPath(0, info.MinTXID, info.MaxTXID)); err == nil {\n\t\t\t\tcreatedAt = fi.ModTime().UTC()\n\t\t\t} else {\n\t\t\t\tcreatedAt = threshold\n\t\t\t}\n\t\t}\n\n\t\tif createdAt.After(threshold) {\n\t\t\t// L0 entries are ordered; once we reach a newer file we stop so we don't\n\t\t\t// create gaps between retained files. VFS expects contiguous coverage.\n\t\t\tprocessedAll = false\n\t\t\ttooRecentCount++\n\t\t\tbreak\n\t\t}\n\n\t\tif info.MaxTXID \u003c= maxL1TXID {\n\t\t\tdeleted = append(deleted, info)\n\t\t} else {\n\t\t\tnotCompactedCount++\n\t\t}\n\t}\n\n\t// Count remaining files as too_recent if we stopped early\n\tif !processedAll {\n\t\tfor itr.Next() {\n\t\t\ttooRecentCount++\n\t\t}\n\t}\n\n\t// Ensure we do not delete the newest L0 file only if we processed the entire level.\n\tif processedAll \u0026\u0026 len(deleted) \u003e 0 \u0026\u0026 lastInfo != nil \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"eligible\").Set(float64(len(deleted)))\n\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"not_compacted\").Set(float64(notCompactedCount))\n\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"too_recent\").Set(float64(tooRecentCount))\n\n\tdb.Logger.Debug(\"l0 retention scan complete\",\n\t\t\"total_l0_files\", totalFiles,\n\t\t\"eligible_for_deletion\", len(deleted),\n\t\t\"not_compacted_yet\", notCompactedCount,\n\t\t\"too_recent\", tooRecentCount,\n\t\t\"max_l1_txid\", maxL1TXID)\n\n\tif len(deleted) == 0 {\n\t\treturn nil\n\t}\n\n\tif !db.RetentionEnabled {\n\t\tdb.Logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", 0, \"count\", len(deleted))\n\t} else if err := db.Replica.Client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn fmt.Errorf(\"remove expired l0 files: %w\", err)\n\t}\n\n\tfor _, info := range deleted {\n\t\tlocalPath := db.LTXPath(0, info.MinTXID, info.MaxTXID)\n\t\tdb.Logger.Debug(\"deleting expired local l0 file\", \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", localPath)\n\t\tif err := os.Remove(localPath); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\tdb.Logger.Error(\"failed to remove local l0 file\", \"path\", localPath, \"error\", err)\n\t\t}\n\t}\n\tif len(deleted) \u003e 0 {\n\t\tdb.invalidatePosCache()\n\t}\n\n\tdb.Logger.Info(\"l0 retention enforced\", \"deleted_count\", len(deleted), \"max_l1_txid\", maxL1TXID)\n\n\treturn nil\n}\n\n// EnforceRetentionByTXID enforces retention so that any LTX files below\n// the target TXID are deleted. Always keep at least one file.\nfunc (db *DB) EnforceRetentionByTXID(ctx context.Context, level int, txID ltx.TXID) (err error) {\n\treturn db.compactor.EnforceRetentionByTXID(ctx, level, txID)\n}\n\n// monitor runs in a separate goroutine and monitors the database \u0026 WAL.\n//\n// Implements exponential backoff on repeated sync errors to prevent disk churn\n// when persistent errors (like disk full) occur. See issue #927.\nfunc (db *DB) monitor() {\n\tticker := time.NewTicker(db.MonitorInterval)\n\tdefer ticker.Stop()\n\n\t// Backoff state for error handling.\n\tvar backoff time.Duration\n\tvar lastLogTime time.Time\n\tvar consecutiveErrs int\n\n\tfor {\n\t\t// Wait for ticker or context close.\n\t\tselect {\n\t\tcase \u003c-db.ctx.Done():\n\t\t\treturn\n\t\tcase \u003c-ticker.C:\n\t\t}\n\n\t\t// If in backoff mode, wait additional time before retrying.\n\t\tif backoff \u003e 0 {\n\t\t\tselect {\n\t\t\tcase \u003c-db.ctx.Done():\n\t\t\t\treturn\n\t\t\tcase \u003c-time.After(backoff):\n\t\t\t}\n\t\t}\n\n\t\t// Sync the database to the shadow WAL. Sync() loops over bounded\n\t\t// chunks, releasing the executor lock between each so checkpoints\n\t\t// and snapshots can interleave, but always catches up to the WAL\n\t\t// end so checkpointIfNeeded() runs. A single bounded chunk per\n\t\t// tick would cap drain throughput and starve the TruncatePageN\n\t\t// emergency checkpoint while behind, growing the WAL unbounded.\n\t\tif err := db.Sync(db.ctx); err != nil \u0026\u0026 !isShutdownError(db.ctx, err) {\n\t\t\tconsecutiveErrs++\n\n\t\t\t// Exponential backoff: MonitorInterval -\u003e 2x -\u003e 4x -\u003e ... -\u003e max\n\t\t\tif backoff == 0 {\n\t\t\t\tbackoff = db.MonitorInterval\n\t\t\t} else {\n\t\t\t\tbackoff *= 2\n\t\t\t\tif backoff \u003e DefaultSyncBackoffMax {\n\t\t\t\t\tbackoff = DefaultSyncBackoffMax\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log with rate limiting to avoid log spam during persistent errors.\n\t\t\tif time.Since(lastLogTime) \u003e= SyncErrorLogInterval {\n\t\t\t\tvar ltxErr *LTXError\n\t\t\t\tif errors.Is(err, ErrDiskFull) \u0026\u0026 errors.As(err, \u0026ltxErr) {\n\t\t\t\t\t// Recovery is automatic but can lag up to max_backoff\n\t\t\t\t\t// behind space being freed.\n\t\t\t\t\tdb.Logger.Error(\"disk full while staging ltx file, replication paused until space is freed\",\n\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\"path\", ltxErr.Path,\n\t\t\t\t\t\t\"txid\", ltx.TXID(ltxErr.MaxTXID).String(),\n\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\"backoff\", backoff,\n\t\t\t\t\t\t\"max_backoff\", DefaultSyncBackoffMax)\n\t\t\t\t} else {\n\t\t\t\t\tdb.Logger.Error(\"sync error\",\n\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\"backoff\", backoff)\n\t\t\t\t}\n\t\t\t\tlastLogTime = time.Now()\n\t\t\t}\n\n\t\t\t// Try to clean up stale temp files after persistent disk errors.\n\t\t\tif isDiskFullError(err) \u0026\u0026 consecutiveErrs \u003e= 3 {\n\t\t\t\tdb.Logger.Warn(\"attempting temp file cleanup due to persistent disk errors\")\n\t\t\t\tif cleanupErr := removeTmpFiles(db.metaPath); cleanupErr != nil {\n\t\t\t\t\tdb.Logger.Error(\"temp file cleanup failed\", \"error\", cleanupErr)\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Success - reset backoff and error counter.\n\t\tif consecutiveErrs \u003e 0 {\n\t\t\tdb.Logger.Info(\"sync recovered\", \"previous_errors\", consecutiveErrs)\n\t\t}\n\t\tbackoff = 0\n\t\tconsecutiveErrs = 0\n\t}\n}\n\n// CRC64 returns a CRC-64 ISO checksum of the database and its current position.\n//\n// This function obtains a read lock so it prevents syncs from occurring until\n// the operation is complete. The database will still be usable but it will be\n// unable to checkpoint during this time.\n//\n// If dst is set, the database file is copied to that location before checksum.\nfunc (db *DB) CRC64(ctx context.Context) (uint64, ltx.Pos, error) {\n\tif err := db.lockExec(ctx); err != nil {\n\t\treturn 0, ltx.Pos{}, err\n\t}\n\tdefer db.execSem.Release(1)\n\n\texec, err := db.newSyncExecutor(ctx)\n\tif err != nil {\n\t\treturn 0, ltx.Pos{}, err\n\t} else if exec == nil {\n\t\treturn 0, ltx.Pos{}, os.ErrNotExist\n\t}\n\tdefer db.applySyncExecutor(exec, true)\n\n\t// Force a RESTART checkpoint to ensure the database is at the start of the WAL.\n\tif _, err := db.checkpointWithExecutor(ctx, CheckpointModeRestart, exec); err != nil {\n\t\treturn 0, ltx.Pos{}, err\n\t}\n\n\t// Seek to the beginning of the db file descriptor and checksum whole file.\n\th := crc64.New(crc64.MakeTable(crc64.ISO))\n\tif _, err := db.f.Seek(0, io.SeekStart); err != nil {\n\t\treturn 0, exec.pos, err\n\t} else if _, err := io.Copy(h, db.f); err != nil {\n\t\treturn 0, exec.pos, err\n\t}\n\treturn h.Sum64(), exec.pos, nil\n}\n\n// MaxLTXFileInfo returns the metadata for the last LTX file in a level.\n// If cached, it will returned the local copy. Otherwise, it fetches from the replica.\nfunc (db *DB) MaxLTXFileInfo(ctx context.Context, level int) (ltx.FileInfo, error) {\n\tdb.maxLTXFileInfos.Lock()\n\tdefer db.maxLTXFileInfos.Unlock()\n\n\tinfo, ok := db.maxLTXFileInfos.m[level]\n\tif ok {\n\t\treturn *info, nil\n\t}\n\n\tremoteInfo, err := db.Replica.MaxLTXFileInfo(ctx, level)\n\tif err != nil {\n\t\treturn ltx.FileInfo{}, fmt.Errorf(\"cannot determine L%d max ltx file for %q: %w\", level, db.Path(), err)\n\t}\n\n\tdb.maxLTXFileInfos.m[level] = \u0026remoteInfo\n\treturn remoteInfo, nil\n}\n\n// DefaultRestoreParallelism is the default parallelism when downloading WAL files.\nconst DefaultRestoreParallelism = 8\n\n// DefaultFollowInterval is the default polling interval for follow mode.\nconst DefaultFollowInterval = 1 * time.Second\n\n// IntegrityCheckMode specifies the level of integrity checking after restore.\ntype IntegrityCheckMode int\n\nconst (\n\tIntegrityCheckNone IntegrityCheckMode = iota\n\tIntegrityCheckQuick\n\tIntegrityCheckFull\n)\n\n// RestoreOptions represents options for DB.Restore().\ntype RestoreOptions struct {\n\t// Target path to restore into.\n\t// If blank, the original DB path is used.\n\tOutputPath string\n\n\t// Specific transaction to restore to.\n\t// If zero, TXID is ignored.\n\tTXID ltx.TXID\n\n\t// Point-in-time to restore database.\n\t// If zero, database restore to most recent state available.\n\tTimestamp time.Time\n\n\t// Specifies how many WAL files are downloaded in parallel during restore.\n\tParallelism int\n\n\t// Follow enables continuous restore mode, polling for new LTX files\n\t// and applying them to the restored database. Similar to tail -f.\n\tFollow bool\n\n\t// FollowInterval specifies how often to poll for new LTX files in follow mode.\n\tFollowInterval time.Duration\n\n\t// IntegrityCheck specifies the level of integrity checking after restore.\n\t// Zero value (IntegrityCheckNone) skips the check for backward compatibility.\n\tIntegrityCheck IntegrityCheckMode\n}\n\n// NewRestoreOptions returns a new instance of RestoreOptions with defaults.\nfunc NewRestoreOptions() RestoreOptions {\n\treturn RestoreOptions{\n\t\tParallelism: DefaultRestoreParallelism,\n\t\tFollowInterval: DefaultFollowInterval,\n\t}\n}\n\n// Database metrics.\nvar (\n\tdbMetricOwners = struct {\n\t\tsync.Mutex\n\t\tpaths map[string]int\n\t\tbasenames map[string]int\n\t}{\n\t\tpaths: make(map[string]int),\n\t\tbasenames: make(map[string]int),\n\t}\n\n\tdbSizeGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_db_size\",\n\t\tHelp: \"The current size of the real DB\",\n\t}, []string{\"db\"})\n\n\twalSizeGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_wal_size\",\n\t\tHelp: \"The current size of the real WAL\",\n\t}, []string{\"db\"})\n\n\ttotalWALBytesCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_total_wal_bytes\",\n\t\tHelp: \"Total number of bytes written to shadow WAL\",\n\t}, []string{\"db\"})\n\n\ttxIDIndexGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_txid\",\n\t\tHelp: \"The current transaction ID\",\n\t}, []string{\"db\"})\n\n\tsyncNCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_sync_count\",\n\t\tHelp: \"Number of sync operations performed\",\n\t}, []string{\"db\"})\n\n\tsyncErrorNCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_sync_error_count\",\n\t\tHelp: \"Number of sync errors that have occurred\",\n\t}, []string{\"db\"})\n\n\tsyncSecondsCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_sync_seconds\",\n\t\tHelp: \"Time spent syncing shadow WAL, in seconds\",\n\t}, []string{\"db\"})\n\n\tdiskFullGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_disk_full\",\n\t\tHelp: \"Whether replication is paused because the local disk is full\",\n\t}, []string{\"db\"})\n\n\tcheckpointNCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_checkpoint_count\",\n\t\tHelp: \"Number of checkpoint operations performed\",\n\t}, []string{\"db\", \"mode\"})\n\n\tcheckpointErrorNCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_checkpoint_error_count\",\n\t\tHelp: \"Number of checkpoint errors that have occurred\",\n\t}, []string{\"db\", \"mode\"})\n\n\tcheckpointSecondsCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_checkpoint_seconds\",\n\t\tHelp: \"Time spent checkpointing WAL, in seconds\",\n\t}, []string{\"db\", \"mode\"})\n\n\tcompactionVerifyErrorCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_compaction_verify_error_count\",\n\t\tHelp: \"Number of post-compaction verification failures\",\n\t}, []string{\"db\"})\n)\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[29,37]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[38,48]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[49,64]}},{"name":"binary","path":"encoding/binary","span":{"start":[7,1],"end":[7,19],"bytes":[65,83]}},{"name":"errors","path":"errors","span":{"start":[8,1],"end":[8,10],"bytes":[84,93]}},{"name":"fmt","path":"fmt","span":{"start":[9,1],"end":[9,7],"bytes":[94,100]}},{"name":"crc64","path":"hash/crc64","span":{"start":[10,1],"end":[10,14],"bytes":[101,114]}},{"name":"io","path":"io","span":{"start":[11,1],"end":[11,6],"bytes":[115,120]}},{"name":"slog","path":"log/slog","span":{"start":[12,1],"end":[12,12],"bytes":[121,132]}},{"name":"os","path":"os","span":{"start":[13,1],"end":[13,6],"bytes":[133,138]}},{"name":"filepath","path":"path/filepath","span":{"start":[14,1],"end":[14,17],"bytes":[139,155]}},{"name":"slices","path":"slices","span":{"start":[15,1],"end":[15,10],"bytes":[156,165]}},{"name":"strconv","path":"strconv","span":{"start":[16,1],"end":[16,11],"bytes":[166,176]}},{"name":"strings","path":"strings","span":{"start":[17,1],"end":[17,11],"bytes":[177,187]}},{"name":"sync","path":"sync","span":{"start":[18,1],"end":[18,8],"bytes":[188,195]}},{"name":"syscall","path":"syscall","span":{"start":[19,1],"end":[19,11],"bytes":[196,206]}},{"name":"time","path":"time","span":{"start":[20,1],"end":[20,8],"bytes":[207,214]}},{"name":"prometheus","path":"github.com/prometheus/client_golang/prometheus","span":{"start":[22,1],"end":[22,50],"bytes":[216,265]}},{"name":"promauto","path":"github.com/prometheus/client_golang/prometheus/promauto","span":{"start":[23,1],"end":[23,59],"bytes":[266,324]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[24,1],"end":[24,27],"bytes":[325,351]}},{"name":"semaphore","path":"golang.org/x/sync/semaphore","span":{"start":[25,1],"end":[25,31],"bytes":[352,382]}},{"name":"sqlite","path":"modernc.org/sqlite","span":{"start":[26,1],"end":[26,22],"bytes":[383,404]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[28,1],"end":[28,46],"bytes":[406,451]}}],"types":{"DB":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB","kind":"struct","span":{"start":[67,1],"end":[193,2],"bytes":[2132,6925]},"callables":{"github.com/benbjohnson/litestream.DB.CRC64":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","kind":"method","span":{"start":[3320,1],"end":[3347,2],"bytes":[106358,107235]},"signature":"github.com/benbjohnson/litestream.DB.CRC64","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3320,1],"end":[3320,68],"bytes":[106358,106425]}}],"return_type":"(uint64, github.com/superfly/ltx.Pos, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"3321:12":{"kind":"call","span":{"start":[3321,12],"end":[3321,28],"bytes":[106437,106453]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec"},"3324:8":{"kind":"call","span":{"start":[3324,8],"end":[3324,29],"bytes":[106505,106526]},"callee":null},"3326:15":{"kind":"call","span":{"start":[3326,15],"end":[3326,38],"bytes":[106542,106565]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor"},"3332:8":{"kind":"call","span":{"start":[3332,8],"end":[3332,40],"bytes":[106683,106715]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor"},"3335:15":{"kind":"call","span":{"start":[3335,15],"end":[3335,74],"bytes":[106813,106872]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"3340:17":{"kind":"call","span":{"start":[3340,17],"end":[3340,43],"bytes":[107011,107037]},"callee":null},"3340:7":{"kind":"call","span":{"start":[3340,7],"end":[3340,44],"bytes":[107001,107038]},"callee":null},"3341:15":{"kind":"call","span":{"start":[3341,15],"end":[3341,41],"bytes":[107053,107079]},"callee":null},"3343:22":{"kind":"call","span":{"start":[3343,22],"end":[3343,38],"bytes":[107141,107157]},"callee":null},"3346:9":{"kind":"call","span":{"start":[3346,9],"end":[3346,18],"bytes":[107209,107218]},"callee":null}}},"github.com/benbjohnson/litestream.DB.Checkpoint":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","kind":"method","span":{"start":[2469,1],"end":[2487,2],"bytes":[79355,79811]},"signature":"github.com/benbjohnson/litestream.DB.Checkpoint","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2469,1],"end":[2469,73],"bytes":[79355,79427]}},{"name":"mode","type":"string","span":{"start":[2469,1],"end":[2469,73],"bytes":[79355,79427]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"2470:12":{"kind":"call","span":{"start":[2470,12],"end":[2470,28],"bytes":[79439,79455]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec"},"2473:8":{"kind":"call","span":{"start":[2473,8],"end":[2473,29],"bytes":[79493,79514]},"callee":null},"2474:2":{"kind":"call","span":{"start":[2474,2],"end":[2474,36],"bytes":[79516,79550]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag"},"2475:8":{"kind":"call","span":{"start":[2475,8],"end":[2475,43],"bytes":[79558,79593]},"callee":null},"2477:15":{"kind":"call","span":{"start":[2477,15],"end":[2477,38],"bytes":[79609,79632]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor"},"2483:8":{"kind":"call","span":{"start":[2483,8],"end":[2483,40],"bytes":[79711,79743]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor"},"2485:11":{"kind":"call","span":{"start":[2485,11],"end":[2485,53],"bytes":[79755,79797]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint/github.com/benbjohnson/litestream.DB.Checkpoint.closure_1","kind":"function","span":{"start":[2475,1],"end":[2475,43],"bytes":[79551,79593]},"signature":"github.com/benbjohnson/litestream.DB.Checkpoint.closure_1","parameters":[],"body":{"2475:17":{"kind":"call","span":{"start":[2475,17],"end":[2475,39],"bytes":[79567,79589]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.Close":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","kind":"method","span":{"start":[874,1],"end":[938,2],"bytes":[29441,30885]},"signature":"github.com/benbjohnson/litestream.DB.Close","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[874,1],"end":[874,55],"bytes":[29441,29495]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"875:2":{"kind":"call","span":{"start":[875,2],"end":[875,13],"bytes":[29497,29508]},"callee":null},"876:2":{"kind":"call","span":{"start":[876,2],"end":[876,14],"bytes":[29510,29522]},"callee":null},"883:12":{"kind":"call","span":{"start":[883,12],"end":[883,61],"bytes":[29838,29887]},"callee":null},"883:31":{"kind":"call","span":{"start":[883,31],"end":[883,57],"bytes":[29857,29883]},"callee":null},"886:8":{"kind":"call","span":{"start":[886,8],"end":[886,29],"bytes":[29925,29946]},"callee":null},"890:14":{"kind":"call","span":{"start":[890,14],"end":[890,35],"bytes":[30025,30046]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked"},"898:12":{"kind":"call","span":{"start":[898,12],"end":[898,40],"bytes":[30196,30224]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry"},"902:3":{"kind":"call","span":{"start":[902,3],"end":[902,24],"bytes":[30274,30295]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop"},"907:11":{"kind":"call","span":{"start":[907,11],"end":[907,31],"bytes":[30409,30429]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock"},"912:2":{"kind":"call","span":{"start":[912,2],"end":[912,14],"bytes":[30476,30488]},"callee":null},"919:2":{"kind":"call","span":{"start":[919,2],"end":[919,16],"bytes":[30575,30589]},"callee":null},"922:11":{"kind":"call","span":{"start":[922,11],"end":[922,24],"bytes":[30620,30633]},"callee":null},"928:11":{"kind":"call","span":{"start":[928,11],"end":[928,20],"bytes":[30704,30713]},"callee":null},"935:2":{"kind":"call","span":{"start":[935,2],"end":[935,20],"bytes":[30852,30870]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics"}}},"github.com/benbjohnson/litestream.DB.Compact":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","kind":"method","span":{"start":[2984,1],"end":[3001,2],"bytes":[95536,96052]},"signature":"github.com/benbjohnson/litestream.DB.Compact","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2984,1],"end":[2984,82],"bytes":[95536,95617]}},{"name":"dstLevel","type":"int","span":{"start":[2984,1],"end":[2984,82],"bytes":[95536,95617]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"2985:15":{"kind":"call","span":{"start":[2985,15],"end":[2985,50],"bytes":[95632,95667]},"callee":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact"},"2992:13":{"kind":"call","span":{"start":[2992,13],"end":[2992,45],"bytes":[95815,95847]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime"},"2994:8":{"kind":"call","span":{"start":[2994,8],"end":[2994,33],"bytes":[95929,95954]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"2995:5":{"kind":"call","span":{"start":[2995,5],"end":[2995,63],"bytes":[95961,96019]},"callee":null}}},"github.com/benbjohnson/litestream.DB.DirInfo":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo","kind":"method","span":{"start":[657,1],"end":[659,2],"bytes":[23069,23127]},"signature":"github.com/benbjohnson/litestream.DB.DirInfo","parameters":[],"return_type":"os.FileInfo","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","kind":"method","span":{"start":[3093,1],"end":[3215,2],"bytes":[99222,102862]},"signature":"github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3093,1],"end":[3093,68],"bytes":[99222,99289]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":22},"body":{"3098:2":{"kind":"call","span":{"start":[3098,2],"end":[3098,83],"bytes":[99334,99415]},"callee":null},"3100:12":{"kind":"call","span":{"start":[3100,12],"end":[3100,36],"bytes":[99428,99452]},"callee":null},"3100:26":{"kind":"call","span":{"start":[3100,26],"end":[3100,35],"bytes":[99442,99451]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"3103:14":{"kind":"call","span":{"start":[3103,14],"end":[3103,58],"bytes":[99531,99575]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"3105:10":{"kind":"call","span":{"start":[3105,10],"end":[3105,47],"bytes":[99602,99639]},"callee":null},"3108:6":{"kind":"call","span":{"start":[3108,6],"end":[3108,16],"bytes":[99672,99682]},"callee":null},"3109:11":{"kind":"call","span":{"start":[3109,11],"end":[3109,21],"bytes":[99695,99705]},"callee":null},"3114:12":{"kind":"call","span":{"start":[3114,12],"end":[3114,23],"bytes":[99784,99795]},"callee":null},"3115:10":{"kind":"call","span":{"start":[3115,10],"end":[3115,50],"bytes":[99819,99859]},"callee":null},"3118:3":{"kind":"call","span":{"start":[3118,3],"end":[3118,67],"bytes":[99886,99950]},"callee":null},"3119:3":{"kind":"call","span":{"start":[3119,3],"end":[3119,72],"bytes":[99960,100029]},"callee":null},"3120:3":{"kind":"call","span":{"start":[3120,3],"end":[3120,69],"bytes":[100039,100105]},"callee":null},"3124:15":{"kind":"call","span":{"start":[3124,15],"end":[3124,25],"bytes":[100144,100154]},"callee":null},"3125:13":{"kind":"call","span":{"start":[3125,13],"end":[3125,57],"bytes":[100188,100232]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"3127:10":{"kind":"call","span":{"start":[3127,10],"end":[3127,47],"bytes":[100259,100296]},"callee":null},"3129:8":{"kind":"call","span":{"start":[3129,8],"end":[3129,19],"bytes":[100307,100318]},"callee":null},"3139:6":{"kind":"call","span":{"start":[3139,6],"end":[3139,16],"bytes":[100504,100514]},"callee":null},"3140:11":{"kind":"call","span":{"start":[3140,11],"end":[3140,21],"bytes":[100527,100537]},"callee":null},"3145:6":{"kind":"call","span":{"start":[3145,6],"end":[3145,24],"bytes":[100607,100625]},"callee":null},"3146:18":{"kind":"call","span":{"start":[3146,18],"end":[3146,68],"bytes":[100645,100695]},"callee":null},"3146:26":{"kind":"call","span":{"start":[3146,26],"end":[3146,67],"bytes":[100653,100694]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"3147:17":{"kind":"call","span":{"start":[3147,17],"end":[3147,29],"bytes":[100726,100738]},"callee":null},"3153:6":{"kind":"call","span":{"start":[3153,6],"end":[3153,32],"bytes":[100798,100824]},"callee":null},"3162:14":{"kind":"call","span":{"start":[3162,14],"end":[3162,35],"bytes":[101083,101104]},"callee":null},"3170:7":{"kind":"call","span":{"start":[3170,7],"end":[3170,17],"bytes":[101233,101243]},"callee":null},"3176:21":{"kind":"call","span":{"start":[3176,21],"end":[3176,33],"bytes":[101380,101392]},"callee":null},"3176:68":{"kind":"call","span":{"start":[3176,68],"end":[3176,80],"bytes":[101427,101439]},"callee":null},"3177:22":{"kind":"call","span":{"start":[3177,22],"end":[3177,34],"bytes":[101478,101490]},"callee":null},"3180:2":{"kind":"call","span":{"start":[3180,2],"end":[3180,66],"bytes":[101499,101563]},"callee":null},"3180:71":{"kind":"call","span":{"start":[3180,71],"end":[3180,92],"bytes":[101568,101589]},"callee":null},"3180:79":{"kind":"call","span":{"start":[3180,79],"end":[3180,91],"bytes":[101576,101588]},"callee":null},"3181:2":{"kind":"call","span":{"start":[3181,2],"end":[3181,71],"bytes":[101592,101661]},"callee":null},"3181:76":{"kind":"call","span":{"start":[3181,76],"end":[3181,102],"bytes":[101666,101692]},"callee":null},"3182:2":{"kind":"call","span":{"start":[3182,2],"end":[3182,68],"bytes":[101695,101761]},"callee":null},"3182:73":{"kind":"call","span":{"start":[3182,73],"end":[3182,96],"bytes":[101766,101789]},"callee":null},"3184:2":{"kind":"call","span":{"start":[3184,2],"end":[3189,28],"bytes":[101793,102013]},"callee":null},"3186:28":{"kind":"call","span":{"start":[3186,28],"end":[3186,40],"bytes":[101898,101910]},"callee":null},"3191:5":{"kind":"call","span":{"start":[3191,5],"end":[3191,17],"bytes":[102019,102031]},"callee":null},"3196:3":{"kind":"call","span":{"start":[3196,3],"end":[3196,102],"bytes":[102085,102184]},"callee":null},"3196:89":{"kind":"call","span":{"start":[3196,89],"end":[3196,101],"bytes":[102171,102183]},"callee":null},"3197:19":{"kind":"call","span":{"start":[3197,19],"end":[3197,65],"bytes":[102203,102249]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"3198:10":{"kind":"call","span":{"start":[3198,10],"end":[3198,56],"bytes":[102273,102319]},"callee":null},"3202:16":{"kind":"call","span":{"start":[3202,16],"end":[3202,57],"bytes":[102371,102412]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"3203:3":{"kind":"call","span":{"start":[3203,3],"end":[3203,121],"bytes":[102415,102533]},"callee":null},"3204:13":{"kind":"call","span":{"start":[3204,13],"end":[3204,33],"bytes":[102546,102566]},"callee":null},"3204:50":{"kind":"call","span":{"start":[3204,50],"end":[3204,68],"bytes":[102583,102601]},"callee":null},"3205:4":{"kind":"call","span":{"start":[3205,4],"end":[3205,86],"bytes":[102607,102689]},"callee":null},"3208:5":{"kind":"call","span":{"start":[3208,5],"end":[3208,17],"bytes":[102701,102713]},"callee":null},"3209:3":{"kind":"call","span":{"start":[3209,3],"end":[3209,26],"bytes":[102722,102745]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"3212:2":{"kind":"call","span":{"start":[3212,2],"end":[3212,98],"bytes":[102751,102847]},"callee":null},"3212:59":{"kind":"call","span":{"start":[3212,59],"end":[3212,71],"bytes":[102808,102820]},"callee":null}}},"github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID","kind":"method","span":{"start":[3219,1],"end":[3221,2],"bytes":[103000,103161]},"signature":"github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3219,1],"end":[3219,98],"bytes":[103000,103097]}},{"name":"level","type":"int","span":{"start":[3219,1],"end":[3219,98],"bytes":[103000,103097]}},{"name":"txID","type":"github.com/superfly/ltx.TXID","span":{"start":[3219,1],"end":[3219,98],"bytes":[103000,103097]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"3220:9":{"kind":"call","span":{"start":[3220,9],"end":[3220,62],"bytes":[103106,103159]},"callee":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID"}}},"github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","kind":"method","span":{"start":[3027,1],"end":[3089,2],"bytes":[96884,99090]},"signature":"github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3027,1],"end":[3027,121],"bytes":[96884,97004]}},{"name":"timestamp","type":"time.Time","span":{"start":[3027,1],"end":[3027,121],"bytes":[96884,97004]}}],"return_type":"(github.com/superfly/ltx.TXID, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"3028:2":{"kind":"call","span":{"start":[3028,2],"end":[3028,73],"bytes":[97006,97077]},"callee":null},"3031:14":{"kind":"call","span":{"start":[3031,14],"end":[3031,70],"bytes":[97135,97191]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"3033:13":{"kind":"call","span":{"start":[3033,13],"end":[3033,51],"bytes":[97221,97259]},"callee":null},"3035:8":{"kind":"call","span":{"start":[3035,8],"end":[3035,19],"bytes":[97270,97281]},"callee":null},"3040:6":{"kind":"call","span":{"start":[3040,6],"end":[3040,16],"bytes":[97376,97386]},"callee":null},"3041:11":{"kind":"call","span":{"start":[3041,11],"end":[3041,21],"bytes":[97399,97409]},"callee":null},"3042:15":{"kind":"call","span":{"start":[3042,15],"end":[3042,38],"bytes":[97424,97447]},"callee":null},"3046:6":{"kind":"call","span":{"start":[3046,6],"end":[3046,38],"bytes":[97551,97583]},"callee":null},"3047:14":{"kind":"call","span":{"start":[3047,14],"end":[3047,35],"bytes":[97599,97620]},"callee":null},"3053:33":{"kind":"call","span":{"start":[3053,33],"end":[3053,45],"bytes":[97761,97773]},"callee":null},"3053:5":{"kind":"call","span":{"start":[3053,5],"end":[3053,17],"bytes":[97733,97745]},"callee":null},"3054:22":{"kind":"call","span":{"start":[3054,22],"end":[3054,34],"bytes":[97812,97824]},"callee":null},"3062:6":{"kind":"call","span":{"start":[3062,6],"end":[3062,36],"bytes":[98138,98168]},"callee":null},"3073:101":{"kind":"call","span":{"start":[3073,101],"end":[3073,113],"bytes":[98473,98485]},"callee":null},"3073:3":{"kind":"call","span":{"start":[3073,3],"end":[3073,114],"bytes":[98375,98486]},"callee":null},"3074:19":{"kind":"call","span":{"start":[3074,19],"end":[3074,65],"bytes":[98505,98551]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"3075:13":{"kind":"call","span":{"start":[3075,13],"end":[3075,52],"bytes":[98578,98617]},"callee":null},"3080:16":{"kind":"call","span":{"start":[3080,16],"end":[3080,69],"bytes":[98702,98755]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"3081:3":{"kind":"call","span":{"start":[3081,3],"end":[3081,138],"bytes":[98758,98893]},"callee":null},"3083:13":{"kind":"call","span":{"start":[3083,13],"end":[3083,33],"bytes":[98907,98927]},"callee":null},"3083:50":{"kind":"call","span":{"start":[3083,50],"end":[3083,68],"bytes":[98944,98962]},"callee":null},"3084:4":{"kind":"call","span":{"start":[3084,4],"end":[3084,87],"bytes":[98968,99051]},"callee":null}}},"github.com/benbjohnson/litestream.DB.EnsureExists":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","kind":"method","span":{"start":[786,1],"end":[820,2],"bytes":[26853,27824]},"signature":"github.com/benbjohnson/litestream.DB.EnsureExists","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[786,1],"end":[786,56],"bytes":[26853,26908]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"788:10":{"kind":"call","span":{"start":[788,10],"end":[788,45],"bytes":[26942,26977]},"callee":null},"791:10":{"kind":"call","span":{"start":[791,10],"end":[791,52],"bytes":[27021,27063]},"callee":null},"794:15":{"kind":"call","span":{"start":[794,15],"end":[794,33],"bytes":[27082,27100]},"callee":null},"794:23":{"kind":"call","span":{"start":[794,23],"end":[794,32],"bytes":[27090,27099]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"796:13":{"kind":"call","span":{"start":[796,13],"end":[796,31],"bytes":[27140,27158]},"callee":null},"797:10":{"kind":"call","span":{"start":[797,10],"end":[797,46],"bytes":[27170,27206]},"callee":null},"800:12":{"kind":"call","span":{"start":[800,12],"end":[800,35],"bytes":[27222,27245]},"callee":null},"800:25":{"kind":"call","span":{"start":[800,25],"end":[800,34],"bytes":[27235,27244]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"801:13":{"kind":"call","span":{"start":[801,13],"end":[801,36],"bytes":[27272,27295]},"callee":null},"802:11":{"kind":"call","span":{"start":[802,11],"end":[802,57],"bytes":[27320,27366]},"callee":null},"806:9":{"kind":"call","span":{"start":[806,9],"end":[806,28],"bytes":[27383,27402]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewRestoreOptions"},"807:19":{"kind":"call","span":{"start":[807,19],"end":[807,28],"bytes":[27421,27430]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"810:12":{"kind":"call","span":{"start":[810,12],"end":[810,40],"bytes":[27485,27513]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore"},"811:43":{"kind":"call","span":{"start":[811,43],"end":[811,73],"bytes":[27570,27600]},"callee":null},"811:6":{"kind":"call","span":{"start":[811,6],"end":[811,39],"bytes":[27533,27566]},"callee":null},"812:4":{"kind":"call","span":{"start":[812,4],"end":[812,66],"bytes":[27606,27668]},"callee":null},"815:10":{"kind":"call","span":{"start":[815,10],"end":[815,52],"bytes":[27696,27738]},"callee":null},"818:2":{"kind":"call","span":{"start":[818,2],"end":[818,68],"bytes":[27744,27810]},"callee":null},"818:58":{"kind":"call","span":{"start":[818,58],"end":[818,67],"bytes":[27800,27809]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream.DB.FileInfo":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.FileInfo","kind":"method","span":{"start":[652,1],"end":[654,2],"bytes":[22895,22955]},"signature":"github.com/benbjohnson/litestream.DB.FileInfo","parameters":[],"return_type":"os.FileInfo","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.IsOpen":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","kind":"method","span":{"start":[549,1],"end":[553,2],"bytes":[19789,19876]},"signature":"github.com/benbjohnson/litestream.DB.IsOpen","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"550:2":{"kind":"call","span":{"start":[550,2],"end":[550,15],"bytes":[19820,19833]},"callee":null},"551:8":{"kind":"call","span":{"start":[551,8],"end":[551,23],"bytes":[19841,19856]},"callee":null}}},"github.com/benbjohnson/litestream.DB.LTXDir":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","kind":"method","span":{"start":[571,1],"end":[573,2],"bytes":[20272,20347]},"signature":"github.com/benbjohnson/litestream.DB.LTXDir","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{"572:9":{"kind":"call","span":{"start":[572,9],"end":[572,42],"bytes":[20312,20345]},"callee":null}}},"github.com/benbjohnson/litestream.DB.LTXLevelDir":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","kind":"method","span":{"start":[601,1],"end":[603,2],"bytes":[21229,21332]},"signature":"github.com/benbjohnson/litestream.DB.LTXLevelDir","parameters":[{"name":"level","type":"int","span":{"start":[601,1],"end":[601,46],"bytes":[21229,21274]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"602:23":{"kind":"call","span":{"start":[602,23],"end":[602,34],"bytes":[21297,21308]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"602:36":{"kind":"call","span":{"start":[602,36],"end":[602,55],"bytes":[21310,21329]},"callee":null},"602:9":{"kind":"call","span":{"start":[602,9],"end":[602,56],"bytes":[21283,21330]},"callee":null}}},"github.com/benbjohnson/litestream.DB.LTXPath":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","kind":"method","span":{"start":[607,1],"end":[610,2],"bytes":[21439,21640]},"signature":"github.com/benbjohnson/litestream.DB.LTXPath","parameters":[{"name":"level","type":"int","span":{"start":[607,1],"end":[607,69],"bytes":[21439,21507]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[607,1],"end":[607,69],"bytes":[21439,21507]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[607,1],"end":[607,69],"bytes":[21439,21507]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"608:2":{"kind":"call","span":{"start":[608,2],"end":[608,48],"bytes":[21509,21555]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert"},"609:23":{"kind":"call","span":{"start":[609,23],"end":[609,44],"bytes":[21578,21599]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir"},"609:46":{"kind":"call","span":{"start":[609,46],"end":[609,82],"bytes":[21601,21637]},"callee":null},"609:9":{"kind":"call","span":{"start":[609,9],"end":[609,83],"bytes":[21564,21638]},"callee":null}}},"github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","kind":"method","span":{"start":[729,1],"end":[733,2],"bytes":[25065,25221]},"signature":"github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","parameters":[],"return_type":"time.Time","metrics":{"cyclomatic":1},"body":{"730:2":{"kind":"call","span":{"start":[730,2],"end":[730,33],"bytes":[25115,25146]},"callee":null},"731:8":{"kind":"call","span":{"start":[731,8],"end":[731,41],"bytes":[25154,25187]},"callee":null}}},"github.com/benbjohnson/litestream.DB.MaxLTX":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","kind":"method","span":{"start":[632,1],"end":[649,2],"bytes":[22329,22804]},"signature":"github.com/benbjohnson/litestream.DB.MaxLTX","parameters":[],"return_type":"(github.com/superfly/ltx.TXID, github.com/superfly/ltx.TXID, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"633:15":{"kind":"call","span":{"start":[633,15],"end":[633,44],"bytes":[22407,22436]},"callee":null},"633:26":{"kind":"call","span":{"start":[633,26],"end":[633,43],"bytes":[22418,22435]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir"},"634:5":{"kind":"call","span":{"start":[634,5],"end":[634,23],"bytes":[22441,22459]},"callee":null},"642:23":{"kind":"call","span":{"start":[642,23],"end":[642,52],"bytes":[22627,22656]},"callee":null},"642:41":{"kind":"call","span":{"start":[642,41],"end":[642,51],"bytes":[22645,22655]},"callee":null}}},"github.com/benbjohnson/litestream.DB.MaxLTXFileInfo":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","kind":"method","span":{"start":[3351,1],"end":[3367,2],"bytes":[107397,107873]},"signature":"github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3351,1],"end":[3351,85],"bytes":[107397,107481]}},{"name":"level","type":"int","span":{"start":[3351,1],"end":[3351,85],"bytes":[107397,107481]}}],"return_type":"(github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"3352:2":{"kind":"call","span":{"start":[3352,2],"end":[3352,27],"bytes":[107483,107508]},"callee":null},"3353:8":{"kind":"call","span":{"start":[3353,8],"end":[3353,35],"bytes":[107516,107543]},"callee":null},"3360:21":{"kind":"call","span":{"start":[3360,21],"end":[3360,58],"bytes":[107639,107676]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo"},"3362:26":{"kind":"call","span":{"start":[3362,26],"end":[3362,107],"bytes":[107719,107800]},"callee":null},"3362:92":{"kind":"call","span":{"start":[3362,92],"end":[3362,101],"bytes":[107785,107794]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream.DB.MetaPath":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath","kind":"method","span":{"start":[561,1],"end":[563,2],"bytes":[20050,20105]},"signature":"github.com/benbjohnson/litestream.DB.MetaPath","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.Notify":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify","kind":"method","span":{"start":[706,1],"end":[710,2],"bytes":[24382,24480]},"signature":"github.com/benbjohnson/litestream.DB.Notify","parameters":[],"return_type":"\u003c-chan struct{}","metrics":{"cyclomatic":1},"body":{"707:2":{"kind":"call","span":{"start":[707,2],"end":[707,15],"bytes":[24424,24437]},"callee":null},"708:8":{"kind":"call","span":{"start":[708,8],"end":[708,23],"bytes":[24445,24460]},"callee":null}}},"github.com/benbjohnson/litestream.DB.Open":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","kind":"method","span":{"start":[823,1],"end":[869,2],"bytes":[27883,29224]},"signature":"github.com/benbjohnson/litestream.DB.Open","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"824:2":{"kind":"call","span":{"start":[824,2],"end":[824,14],"bytes":[27919,27931]},"callee":null},"826:3":{"kind":"call","span":{"start":[826,3],"end":[826,17],"bytes":[27950,27964]},"callee":null},"830:22":{"kind":"call","span":{"start":[830,22],"end":[830,62],"bytes":[28084,28124]},"callee":null},"830:41":{"kind":"call","span":{"start":[830,41],"end":[830,61],"bytes":[28103,28123]},"callee":null},"831:2":{"kind":"call","span":{"start":[831,2],"end":[831,16],"bytes":[28126,28140]},"callee":null},"834:2":{"kind":"call","span":{"start":[834,2],"end":[834,18],"bytes":[28204,28220]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics"},"838:10":{"kind":"call","span":{"start":[838,10],"end":[838,64],"bytes":[28288,28342]},"callee":null},"841:10":{"kind":"call","span":{"start":[841,10],"end":[841,71],"bytes":[28386,28447]},"callee":null},"844:10":{"kind":"call","span":{"start":[844,10],"end":[844,62],"bytes":[28493,28545]},"callee":null},"848:12":{"kind":"call","span":{"start":[848,12],"end":[848,39],"bytes":[28628,28655]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles"},"849:10":{"kind":"call","span":{"start":[849,10],"end":[849,56],"bytes":[28679,28725]},"callee":null},"859:3":{"kind":"call","span":{"start":[859,3],"end":[859,15],"bytes":[29037,29049]},"callee":null},"860:6":{"kind":"call","span":{"start":[860,6],"end":[860,51],"bytes":[29055,29100]},"callee":null,"is_goroutine":true},"864:2":{"kind":"call","span":{"start":[864,2],"end":[864,14],"bytes":[29163,29175]},"callee":null},"866:2":{"kind":"call","span":{"start":[866,2],"end":[866,16],"bytes":[29195,29209]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open/github.com/benbjohnson/litestream.DB.Open.closure_1","kind":"function","span":{"start":[860,1],"end":[860,51],"bytes":[29050,29100]},"signature":"github.com/benbjohnson/litestream.DB.Open.closure_1","parameters":[],"body":{"860:21":{"kind":"call","span":{"start":[860,21],"end":[860,33],"bytes":[29070,29082]},"callee":null},"860:35":{"kind":"call","span":{"start":[860,35],"end":[860,47],"bytes":[29084,29096]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.PageSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize","kind":"method","span":{"start":[714,1],"end":[718,2],"bytes":[24611,24701]},"signature":"github.com/benbjohnson/litestream.DB.PageSize","parameters":[],"return_type":"int","metrics":{"cyclomatic":1},"body":{"715:2":{"kind":"call","span":{"start":[715,2],"end":[715,15],"bytes":[24643,24656]},"callee":null},"716:8":{"kind":"call","span":{"start":[716,8],"end":[716,23],"bytes":[24664,24679]},"callee":null}}},"github.com/benbjohnson/litestream.DB.Path":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","kind":"method","span":{"start":[438,1],"end":[440,2],"bytes":[16743,16790]},"signature":"github.com/benbjohnson/litestream.DB.Path","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.Pos":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","kind":"method","span":{"start":[663,1],"end":[694,2],"bytes":[23260,24036]},"signature":"github.com/benbjohnson/litestream.DB.Pos","parameters":[],"return_type":"(github.com/superfly/ltx.Pos, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"664:2":{"kind":"call","span":{"start":[664,2],"end":[664,15],"bytes":[23300,23313]},"callee":null},"665:8":{"kind":"call","span":{"start":[665,8],"end":[665,23],"bytes":[23321,23336]},"callee":null},"671:27":{"kind":"call","span":{"start":[671,27],"end":[671,38],"bytes":[23422,23433]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"678:13":{"kind":"call","span":{"start":[678,13],"end":[678,44],"bytes":[23563,23594]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"679:12":{"kind":"call","span":{"start":[679,12],"end":[679,28],"bytes":[23606,23622]},"callee":null},"681:21":{"kind":"call","span":{"start":[681,21],"end":[681,91],"bytes":[23660,23730]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"681:53":{"kind":"call","span":{"start":[681,53],"end":[681,68],"bytes":[23692,23707]},"callee":null},"681:70":{"kind":"call","span":{"start":[681,70],"end":[681,85],"bytes":[23709,23724]},"callee":null},"683:8":{"kind":"call","span":{"start":[683,8],"end":[683,34],"bytes":[23741,23767]},"callee":null},"685:9":{"kind":"call","span":{"start":[685,9],"end":[685,26],"bytes":[23777,23794]},"callee":null},"686:12":{"kind":"call","span":{"start":[686,12],"end":[686,24],"bytes":[23806,23818]},"callee":null},"687:21":{"kind":"call","span":{"start":[687,21],"end":[687,132],"bytes":[23853,23964]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"687:55":{"kind":"call","span":{"start":[687,55],"end":[687,70],"bytes":[23887,23902]},"callee":null},"687:72":{"kind":"call","span":{"start":[687,72],"end":[687,87],"bytes":[23904,23919]},"callee":null},"687:89":{"kind":"call","span":{"start":[687,89],"end":[687,131],"bytes":[23921,23963]},"callee":null},"690:9":{"kind":"call","span":{"start":[690,9],"end":[690,27],"bytes":[23977,23995]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos/github.com/benbjohnson/litestream.DB.Pos.closure_1","kind":"function","span":{"start":[683,1],"end":[683,34],"bytes":[23734,23767]},"signature":"github.com/benbjohnson/litestream.DB.Pos.closure_1","parameters":[],"body":{"683:21":{"kind":"call","span":{"start":[683,21],"end":[683,30],"bytes":[23754,23763]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.RecordSuccessfulSync":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","kind":"method","span":{"start":[722,1],"end":[726,2],"bytes":[24843,24993]},"signature":"github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","parameters":[],"metrics":{"cyclomatic":1},"body":{"723:2":{"kind":"call","span":{"start":[723,2],"end":[723,32],"bytes":[24883,24913]},"callee":null},"724:8":{"kind":"call","span":{"start":[724,8],"end":[724,40],"bytes":[24921,24953]},"callee":null},"725:28":{"kind":"call","span":{"start":[725,28],"end":[725,38],"bytes":[24981,24991]},"callee":null}}},"github.com/benbjohnson/litestream.DB.ResetLocalState":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","kind":"method","span":{"start":[578,1],"end":[597,2],"bytes":[20547,21132]},"signature":"github.com/benbjohnson/litestream.DB.ResetLocalState","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[578,1],"end":[578,59],"bytes":[20547,20605]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"579:2":{"kind":"call","span":{"start":[579,2],"end":[581,26],"bytes":[20607,20711]},"callee":null},"581:14":{"kind":"call","span":{"start":[581,14],"end":[581,25],"bytes":[20699,20710]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"584:12":{"kind":"call","span":{"start":[584,12],"end":[584,37],"bytes":[20749,20774]},"callee":null},"584:25":{"kind":"call","span":{"start":[584,25],"end":[584,36],"bytes":[20762,20773]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"584:54":{"kind":"call","span":{"start":[584,54],"end":[584,72],"bytes":[20791,20809]},"callee":null},"585:10":{"kind":"call","span":{"start":[585,10],"end":[585,53],"bytes":[20821,20864]},"callee":null},"589:2":{"kind":"call","span":{"start":[589,2],"end":[589,27],"bytes":[20901,20926]},"callee":null},"590:25":{"kind":"call","span":{"start":[590,25],"end":[590,52],"bytes":[20951,20978]},"callee":null},"591:2":{"kind":"call","span":{"start":[591,2],"end":[591,29],"bytes":[20980,21007]},"callee":null},"593:2":{"kind":"call","span":{"start":[593,2],"end":[593,25],"bytes":[21010,21033]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"595:2":{"kind":"call","span":{"start":[595,2],"end":[595,84],"bytes":[21036,21118]},"callee":null}}},"github.com/benbjohnson/litestream.DB.SQLDB":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SQLDB","kind":"method","span":{"start":[433,1],"end":[435,2],"bytes":[16652,16699]},"signature":"github.com/benbjohnson/litestream.DB.SQLDB","parameters":[],"return_type":"*database/sql.DB","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.SetLogger":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","kind":"method","span":{"start":[419,1],"end":[430,2],"bytes":[16254,16584]},"signature":"github.com/benbjohnson/litestream.DB.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[419,1],"end":[419,47],"bytes":[16254,16300]}}],"metrics":{"cyclomatic":4},"body":{"421:12":{"kind":"call","span":{"start":[421,12],"end":[421,26],"bytes":[16332,16346]},"callee":null},"425:26":{"kind":"call","span":{"start":[425,26],"end":[425,77],"bytes":[16421,16472]},"callee":null},"425:3":{"kind":"call","span":{"start":[425,3],"end":[425,78],"bytes":[16398,16473]},"callee":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.setLogger"},"428:3":{"kind":"call","span":{"start":[428,3],"end":[428,51],"bytes":[16531,16579]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger"},"428:31":{"kind":"call","span":{"start":[428,31],"end":[428,50],"bytes":[16559,16578]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}}},"github.com/benbjohnson/litestream.DB.SetMetaPath":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetMetaPath","kind":"method","span":{"start":[566,1],"end":[568,2],"bytes":[20158,20220]},"signature":"github.com/benbjohnson/litestream.DB.SetMetaPath","parameters":[{"name":"path","type":"string","span":{"start":[566,1],"end":[566,41],"bytes":[20158,20198]}}],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.Snapshot":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","kind":"method","span":{"start":[3007,1],"end":[3024,2],"bytes":[96361,96783]},"signature":"github.com/benbjohnson/litestream.DB.Snapshot","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3007,1],"end":[3007,69],"bytes":[96361,96429]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"3008:17":{"kind":"call","span":{"start":[3008,17],"end":[3008,39],"bytes":[96446,96468]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader"},"3012:8":{"kind":"call","span":{"start":[3012,8],"end":[3012,34],"bytes":[96514,96540]},"callee":null},"3014:15":{"kind":"call","span":{"start":[3014,15],"end":[3014,81],"bytes":[96556,96622]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile"},"3019:2":{"kind":"call","span":{"start":[3019,2],"end":[3019,27],"bytes":[96664,96689]},"callee":null},"3021:2":{"kind":"call","span":{"start":[3021,2],"end":[3021,29],"bytes":[96735,96762]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot/github.com/benbjohnson/litestream.DB.Snapshot.closure_1","kind":"function","span":{"start":[3012,1],"end":[3012,34],"bytes":[96507,96540]},"signature":"github.com/benbjohnson/litestream.DB.Snapshot.closure_1","parameters":[],"body":{"3012:21":{"kind":"call","span":{"start":[3012,21],"end":[3012,30],"bytes":[96527,96536]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.SnapshotReader":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","kind":"method","span":{"start":[2782,1],"end":[2794,2],"bytes":[89442,89739]},"signature":"github.com/benbjohnson/litestream.DB.SnapshotReader","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2782,1],"end":[2782,84],"bytes":[89442,89525]}}],"return_type":"(github.com/superfly/ltx.Pos, io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"2783:14":{"kind":"call","span":{"start":[2783,14],"end":[2783,38],"bytes":[89539,89563]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition"},"2788:12":{"kind":"call","span":{"start":[2788,12],"end":[2788,39],"bytes":[89625,89652]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader"},"2790:3":{"kind":"call","span":{"start":[2790,3],"end":[2790,14],"bytes":[89672,89683]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close"}}},"github.com/benbjohnson/litestream.DB.Sync":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","kind":"method","span":{"start":[1286,1],"end":[1299,2],"bytes":[41251,41557]},"signature":"github.com/benbjohnson/litestream.DB.Sync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1286,1],"end":[1286,48],"bytes":[41251,41298]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"1288:13":{"kind":"call","span":{"start":[1288,13],"end":[1288,22],"bytes":[41318,41327]},"callee":null},"1289:11":{"kind":"call","span":{"start":[1289,11],"end":[1289,29],"bytes":[41352,41370]},"callee":null},"1292:18":{"kind":"call","span":{"start":[1292,18],"end":[1292,54],"bytes":[41393,41429]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce"}}},"github.com/benbjohnson/litestream.DB.SyncAndWait":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","kind":"method","span":{"start":[769,1],"end":[781,2],"bytes":[26300,26616]},"signature":"github.com/benbjohnson/litestream.DB.SyncAndWait","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[769,1],"end":[769,55],"bytes":[26300,26354]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"771:10":{"kind":"call","span":{"start":[771,10],"end":[771,45],"bytes":[26388,26423]},"callee":null},"774:12":{"kind":"call","span":{"start":[774,12],"end":[774,24],"bytes":[26439,26451]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync"},"775:10":{"kind":"call","span":{"start":[775,10],"end":[775,40],"bytes":[26475,26505]},"callee":null},"777:12":{"kind":"call","span":{"start":[777,12],"end":[777,32],"bytes":[26520,26540]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync"},"778:10":{"kind":"call","span":{"start":[778,10],"end":[778,45],"bytes":[26564,26599]},"callee":null}}},"github.com/benbjohnson/litestream.DB.SyncDiagnostic":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","kind":"method","span":{"start":[443,1],"end":[482,2],"bytes":[16866,18214]},"signature":"github.com/benbjohnson/litestream.DB.SyncDiagnostic","parameters":[],"return_type":"github.com/benbjohnson/litestream.SyncDiagnostic","metrics":{"cyclomatic":6},"body":{"444:2":{"kind":"call","span":{"start":[444,2],"end":[444,21],"bytes":[16915,16934]},"callee":null},"445:8":{"kind":"call","span":{"start":[445,8],"end":[445,29],"bytes":[16942,16963]},"callee":null},"450:24":{"kind":"call","span":{"start":[450,24],"end":[450,53],"bytes":[17088,17117]},"callee":null},"451:24":{"kind":"call","span":{"start":[451,24],"end":[451,49],"bytes":[17142,17167]},"callee":null},"452:24":{"kind":"call","span":{"start":[452,24],"end":[452,48],"bytes":[17192,17216]},"callee":null},"461:6":{"kind":"call","span":{"start":[461,6],"end":[461,46],"bytes":[17565,17605]},"callee":null},"464:30":{"kind":"call","span":{"start":[464,30],"end":[464,73],"bytes":[17724,17767]},"callee":null},"466:6":{"kind":"call","span":{"start":[466,6],"end":[466,36],"bytes":[17786,17816]},"callee":null},"470:6":{"kind":"call","span":{"start":[470,6],"end":[470,36],"bytes":[17894,17924]},"callee":null},"474:6":{"kind":"call","span":{"start":[474,6],"end":[474,36],"bytes":[18002,18032]},"callee":null},"476:28":{"kind":"call","span":{"start":[476,28],"end":[476,40],"bytes":[18093,18105]},"callee":null},"477:10":{"kind":"call","span":{"start":[477,10],"end":[477,20],"bytes":[18117,18127]},"callee":null},"479:25":{"kind":"call","span":{"start":[479,25],"end":[479,55],"bytes":[18156,18186]},"callee":null}}},"github.com/benbjohnson/litestream.DB.SyncStatus":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus","kind":"method","span":{"start":[745,1],"end":[765,2],"bytes":[25625,26171]},"signature":"github.com/benbjohnson/litestream.DB.SyncStatus","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[745,1],"end":[745,68],"bytes":[25625,25692]}}],"return_type":"(github.com/benbjohnson/litestream.SyncStatus, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"747:24":{"kind":"call","span":{"start":[747,24],"end":[747,59],"bytes":[25740,25775]},"callee":null},"750:19":{"kind":"call","span":{"start":[750,19],"end":[750,27],"bytes":[25798,25806]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"752:24":{"kind":"call","span":{"start":[752,24],"end":[752,61],"bytes":[25847,25884]},"callee":null},"755:20":{"kind":"call","span":{"start":[755,20],"end":[755,43],"bytes":[25908,25931]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos"},"757:24":{"kind":"call","span":{"start":[757,24],"end":[757,62],"bytes":[25972,26010]},"callee":null}}},"github.com/benbjohnson/litestream.DB.WALPath":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","kind":"method","span":{"start":[556,1],"end":[558,2],"bytes":[19934,19993]},"signature":"github.com/benbjohnson/litestream.DB.WALPath","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.acquireReadLock":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","kind":"method","span":{"start":[1244,1],"end":[1267,2],"bytes":[39962,40703]},"signature":"github.com/benbjohnson/litestream.DB.acquireReadLock","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1244,1],"end":[1244,59],"bytes":[39962,40020]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1253:13":{"kind":"call","span":{"start":[1253,13],"end":[1253,59],"bytes":[40358,40404]},"callee":null},"1253:27":{"kind":"call","span":{"start":[1253,27],"end":[1253,53],"bytes":[40372,40398]},"callee":null},"1259:15":{"kind":"call","span":{"start":[1259,15],"end":[1259,75],"bytes":[40497,40557]},"callee":null},"1260:7":{"kind":"call","span":{"start":[1260,7],"end":[1260,20],"bytes":[40578,40591]},"callee":null}}},"github.com/benbjohnson/litestream.DB.applySyncExecutor":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","kind":"method","span":{"start":[2025,1],"end":[2054,2],"bytes":[65496,66196]},"signature":"github.com/benbjohnson/litestream.DB.applySyncExecutor","parameters":[{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[2025,1],"end":[2025,67],"bytes":[65496,65562]}},{"name":"notify","type":"bool","span":{"start":[2025,1],"end":[2025,67],"bytes":[65496,65562]}}],"metrics":{"cyclomatic":5},"body":{"2034:3":{"kind":"call","span":{"start":[2034,3],"end":[2034,16],"bytes":[65826,65839]},"callee":null},"2037:3":{"kind":"call","span":{"start":[2037,3],"end":[2037,18],"bytes":[65882,65897]},"callee":null},"2041:3":{"kind":"call","span":{"start":[2041,3],"end":[2041,28],"bytes":[65933,65958]},"callee":null},"2044:3":{"kind":"call","span":{"start":[2044,3],"end":[2044,30],"bytes":[66022,66049]},"callee":null},"2047:2":{"kind":"call","span":{"start":[2047,2],"end":[2047,14],"bytes":[66055,66067]},"callee":null},"2050:3":{"kind":"call","span":{"start":[2050,3],"end":[2050,19],"bytes":[66125,66141]},"callee":null},"2051:15":{"kind":"call","span":{"start":[2051,15],"end":[2051,34],"bytes":[66156,66175]},"callee":null},"2053:2":{"kind":"call","span":{"start":[2053,2],"end":[2053,16],"bytes":[66180,66194]},"callee":null}}},"github.com/benbjohnson/litestream.DB.applySyncResult":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncResult","kind":"method","span":{"start":[1989,1],"end":[2002,2],"bytes":[64732,65122]},"signature":"github.com/benbjohnson/litestream.DB.applySyncResult","parameters":[{"name":"state","type":"*github.com/benbjohnson/litestream.syncState","span":{"start":[1989,1],"end":[1989,69],"bytes":[64732,64800]}},{"name":"result","type":"github.com/benbjohnson/litestream.syncResult","span":{"start":[1989,1],"end":[1989,69],"bytes":[64732,64800]}}],"metrics":{"cyclomatic":3},"body":{"1993:3":{"kind":"call","span":{"start":[1993,3],"end":[1993,16],"bytes":[64920,64933]},"callee":null},"1995:3":{"kind":"call","span":{"start":[1995,3],"end":[1995,18],"bytes":[64964,64979]},"callee":null},"1998:3":{"kind":"call","span":{"start":[1998,3],"end":[1998,28],"bytes":[65016,65041]},"callee":null},"2000:3":{"kind":"call","span":{"start":[2000,3],"end":[2000,30],"bytes":[65090,65117]},"callee":null}}},"github.com/benbjohnson/litestream.DB.beginSyncDiag":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","kind":"method","span":{"start":[484,1],"end":[502,2],"bytes":[18216,18753]},"signature":"github.com/benbjohnson/litestream.DB.beginSyncDiag","parameters":[{"name":"operation","type":"github.com/benbjohnson/litestream.diagOp","span":{"start":[484,1],"end":[484,48],"bytes":[18216,18263]}}],"metrics":{"cyclomatic":1},"body":{"485:9":{"kind":"call","span":{"start":[485,9],"end":[485,19],"bytes":[18272,18282]},"callee":null},"486:16":{"kind":"call","span":{"start":[486,16],"end":[486,32],"bytes":[18298,18314]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize"},"488:2":{"kind":"call","span":{"start":[488,2],"end":[488,20],"bytes":[18317,18335]},"callee":null},"501:2":{"kind":"call","span":{"start":[501,2],"end":[501,22],"bytes":[18731,18751]},"callee":null}}},"github.com/benbjohnson/litestream.DB.beginSyncExecutorWait":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","kind":"method","span":{"start":[530,1],"end":[537,2],"bytes":[19293,19510]},"signature":"github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","parameters":[],"metrics":{"cyclomatic":2},"body":{"531:2":{"kind":"call","span":{"start":[531,2],"end":[531,20],"bytes":[19334,19352]},"callee":null},"532:8":{"kind":"call","span":{"start":[532,8],"end":[532,28],"bytes":[19360,19380]},"callee":null},"534:37":{"kind":"call","span":{"start":[534,37],"end":[534,47],"bytes":[19460,19470]},"callee":null}}},"github.com/benbjohnson/litestream.DB.bumpLitestreamSeq":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","kind":"method","span":{"start":[1638,1],"end":[1641,2],"bytes":[53165,53373]},"signature":"github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1638,1],"end":[1638,61],"bytes":[53165,53225]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"1639:12":{"kind":"call","span":{"start":[1639,12],"end":[1639,134],"bytes":[53237,53359]},"callee":null}}},"github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","kind":"method","span":{"start":[1660,1],"end":[1737,2],"bytes":[54138,56383]},"signature":"github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1660,1],"end":[1660,70],"bytes":[54138,54207]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"1662:16":{"kind":"call","span":{"start":[1662,16],"end":[1662,24],"bytes":[54269,54277]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"1664:10":{"kind":"call","span":{"start":[1664,10],"end":[1664,54],"bytes":[54304,54348]},"callee":null},"1668:22":{"kind":"call","span":{"start":[1668,22],"end":[1668,55],"bytes":[54411,54444]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo"},"1670:10":{"kind":"call","span":{"start":[1670,10],"end":[1670,53],"bytes":[54471,54514]},"callee":null},"1680:2":{"kind":"call","span":{"start":[1680,2],"end":[1682,39],"bytes":[54728,54842]},"callee":null},"1685:11":{"kind":"call","span":{"start":[1685,11],"end":[1685,28],"bytes":[54879,54896]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir"},"1686:12":{"kind":"call","span":{"start":[1686,12],"end":[1686,31],"bytes":[54908,54927]},"callee":null},"1686:48":{"kind":"call","span":{"start":[1686,48],"end":[1686,66],"bytes":[54944,54962]},"callee":null},"1687:10":{"kind":"call","span":{"start":[1687,10],"end":[1687,52],"bytes":[54974,55016]},"callee":null},"1689:2":{"kind":"call","span":{"start":[1689,2],"end":[1689,25],"bytes":[55021,55044]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"1690:12":{"kind":"call","span":{"start":[1690,12],"end":[1690,48],"bytes":[55056,55092]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"1691:10":{"kind":"call","span":{"start":[1691,10],"end":[1691,54],"bytes":[55116,55160]},"callee":null},"1696:17":{"kind":"call","span":{"start":[1696,17],"end":[1696,78],"bytes":[55285,55346]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"1698:10":{"kind":"call","span":{"start":[1698,10],"end":[1698,52],"bytes":[55373,55415]},"callee":null},"1700:8":{"kind":"call","span":{"start":[1700,8],"end":[1700,39],"bytes":[55426,55457]},"callee":null},"1703:15":{"kind":"call","span":{"start":[1703,15],"end":[1703,46],"bytes":[55518,55549]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"1706:18":{"kind":"call","span":{"start":[1706,18],"end":[1706,36],"bytes":[55599,55617]},"callee":null},"1708:10":{"kind":"call","span":{"start":[1708,10],"end":[1708,52],"bytes":[55644,55686]},"callee":null},"1710:8":{"kind":"call","span":{"start":[1710,8],"end":[1710,43],"bytes":[55697,55732]},"callee":null},"1712:15":{"kind":"call","span":{"start":[1712,15],"end":[1712,39],"bytes":[55779,55803]},"callee":null},"1713:7":{"kind":"call","span":{"start":[1713,7],"end":[1713,22],"bytes":[55824,55839]},"callee":null},"1714:10":{"kind":"call","span":{"start":[1714,10],"end":[1714,45],"bytes":[55849,55884]},"callee":null},"1717:12":{"kind":"call","span":{"start":[1717,12],"end":[1717,26],"bytes":[55900,55914]},"callee":null},"1718:7":{"kind":"call","span":{"start":[1718,7],"end":[1718,22],"bytes":[55935,55950]},"callee":null},"1719:10":{"kind":"call","span":{"start":[1719,10],"end":[1719,45],"bytes":[55960,55995]},"callee":null},"1722:12":{"kind":"call","span":{"start":[1722,12],"end":[1722,27],"bytes":[56011,56026]},"callee":null},"1723:10":{"kind":"call","span":{"start":[1723,10],"end":[1723,46],"bytes":[56050,56086]},"callee":null},"1727:12":{"kind":"call","span":{"start":[1727,12],"end":[1727,41],"bytes":[56148,56177]},"callee":null},"1728:10":{"kind":"call","span":{"start":[1728,10],"end":[1728,47],"bytes":[56201,56238]},"callee":null},"1730:2":{"kind":"call","span":{"start":[1730,2],"end":[1730,25],"bytes":[56243,56266]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"1732:2":{"kind":"call","span":{"start":[1732,2],"end":[1734,23],"bytes":[56269,56368]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_1","kind":"function","span":{"start":[1700,1],"end":[1700,39],"bytes":[55419,55457]},"signature":"github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_1","parameters":[],"body":{"1700:21":{"kind":"call","span":{"start":[1700,21],"end":[1700,35],"bytes":[55439,55453]},"callee":null}}},"closure_2":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_2","kind":"function","span":{"start":[1710,1],"end":[1710,74],"bytes":[55690,55763]},"signature":"github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_2","parameters":[],"body":{"1710:21":{"kind":"call","span":{"start":[1710,21],"end":[1710,39],"bytes":[55710,55728]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.checkpoint":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","kind":"method","span":{"start":[2491,1],"end":[2517,2],"bytes":[79907,80471]},"signature":"github.com/benbjohnson/litestream.DB.checkpoint","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2491,1],"end":[2491,85],"bytes":[79907,79991]}},{"name":"mode","type":"string","span":{"start":[2491,1],"end":[2491,85],"bytes":[79907,79991]}},{"name":"state","type":"*github.com/benbjohnson/litestream.syncState","span":{"start":[2491,1],"end":[2491,85],"bytes":[79907,79991]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"2492:14":{"kind":"call","span":{"start":[2492,14],"end":[2492,22],"bytes":[80005,80013]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"2494:10":{"kind":"call","span":{"start":[2494,10],"end":[2494,36],"bytes":[80040,80066]},"callee":null},"2501:15":{"kind":"call","span":{"start":[2501,15],"end":[2501,57],"bytes":[80143,80185]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"2506:2":{"kind":"call","span":{"start":[2506,2],"end":[2506,15],"bytes":[80239,80252]},"callee":null},"2509:2":{"kind":"call","span":{"start":[2509,2],"end":[2509,17],"bytes":[80291,80306]},"callee":null},"2511:3":{"kind":"call","span":{"start":[2511,3],"end":[2511,28],"bytes":[80338,80363]},"callee":null},"2514:3":{"kind":"call","span":{"start":[2514,3],"end":[2514,30],"bytes":[80427,80454]},"callee":null}}},"github.com/benbjohnson/litestream.DB.checkpointIfNeeded":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","kind":"method","span":{"start":[1478,1],"end":[1565,2],"bytes":[47383,50904]},"signature":"github.com/benbjohnson/litestream.DB.checkpointIfNeeded","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1478,1],"end":[1478,113],"bytes":[47383,47495]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[1478,1],"end":[1478,113],"bytes":[47383,47495]}},{"name":"origWALSize","type":"int64","span":{"start":[1478,1],"end":[1478,113],"bytes":[47383,47495]}},{"name":"newWALSize","type":"int64","span":{"start":[1478,1],"end":[1478,113],"bytes":[47383,47495]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":19},"body":{"1482:6":{"kind":"call","span":{"start":[1482,6],"end":[1482,65],"bytes":[47540,47599]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1488:5":{"kind":"call","span":{"start":[1488,5],"end":[1488,45],"bytes":[47799,47839]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1489:24":{"kind":"call","span":{"start":[1489,24],"end":[1489,93],"bytes":[47865,47934]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.calcWALSize"},"1489:36":{"kind":"call","span":{"start":[1489,36],"end":[1489,55],"bytes":[47877,47896]},"callee":null},"1489:57":{"kind":"call","span":{"start":[1489,57],"end":[1489,92],"bytes":[47898,47933]},"callee":null},"1489:64":{"kind":"call","span":{"start":[1489,64],"end":[1489,91],"bytes":[47905,47932]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN"},"1495:25":{"kind":"call","span":{"start":[1495,25],"end":[1495,84],"bytes":[48195,48254]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"1496:9":{"kind":"call","span":{"start":[1496,9],"end":[1496,31],"bytes":[48277,48299]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError"},"1500:5":{"kind":"call","span":{"start":[1500,5],"end":[1500,101],"bytes":[48372,48468]},"callee":null},"1503:9":{"kind":"call","span":{"start":[1503,9],"end":[1503,68],"bytes":[48547,48606]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1504:6":{"kind":"call","span":{"start":[1504,6],"end":[1506,38],"bytes":[48614,48766]},"callee":null},"1514:3":{"kind":"call","span":{"start":[1514,3],"end":[1516,35],"bytes":[48885,48993]},"callee":null},"1517:21":{"kind":"call","span":{"start":[1517,21],"end":[1517,81],"bytes":[49014,49074]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"1518:20":{"kind":"call","span":{"start":[1518,20],"end":[1518,79],"bytes":[49094,49153]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1525:19":{"kind":"call","span":{"start":[1525,19],"end":[1525,82],"bytes":[49306,49369]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.calcWALSize"},"1525:31":{"kind":"call","span":{"start":[1525,31],"end":[1525,50],"bytes":[49318,49337]},"callee":null},"1525:52":{"kind":"call","span":{"start":[1525,52],"end":[1525,81],"bytes":[49339,49368]},"callee":null},"1526:16":{"kind":"call","span":{"start":[1526,16],"end":[1526,75],"bytes":[49387,49446]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"1529:7":{"kind":"call","span":{"start":[1529,7],"end":[1529,29],"bytes":[49618,49640]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError"},"1530:5":{"kind":"call","span":{"start":[1530,5],"end":[1530,101],"bytes":[49647,49743]},"callee":null},"1544:14":{"kind":"call","span":{"start":[1544,14],"end":[1544,25],"bytes":[50196,50207]},"callee":null},"1546:11":{"kind":"call","span":{"start":[1546,11],"end":[1546,47],"bytes":[50236,50272]},"callee":null},"1550:17":{"kind":"call","span":{"start":[1550,17],"end":[1550,29],"bytes":[50358,50370]},"callee":null},"1550:6":{"kind":"call","span":{"start":[1550,6],"end":[1550,30],"bytes":[50347,50371]},"callee":null},"1550:71":{"kind":"call","span":{"start":[1550,71],"end":[1550,106],"bytes":[50412,50447]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.calcWALSize"},"1550:83":{"kind":"call","span":{"start":[1550,83],"end":[1550,102],"bytes":[50424,50443]},"callee":null},"1551:17":{"kind":"call","span":{"start":[1551,17],"end":[1551,76],"bytes":[50466,50525]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"1554:8":{"kind":"call","span":{"start":[1554,8],"end":[1554,30],"bytes":[50700,50722]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError"},"1555:6":{"kind":"call","span":{"start":[1555,6],"end":[1555,102],"bytes":[50730,50826]},"callee":null}}},"github.com/benbjohnson/litestream.DB.checkpointWithExecutor":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","kind":"method","span":{"start":[2522,1],"end":[2706,2],"bytes":[80699,86958]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2522,1],"end":[2522,124],"bytes":[80699,80822]}},{"name":"mode","type":"string","span":{"start":[2522,1],"end":[2522,124],"bytes":[80699,80822]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[2522,1],"end":[2522,124],"bytes":[80699,80822]}}],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":25},"body":{"2524:2":{"kind":"call","span":{"start":[2524,2],"end":[2528,5],"bytes":[80858,81015]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2531:6":{"kind":"call","span":{"start":[2531,6],"end":[2531,24],"bytes":[81134,81152]},"callee":null},"2533:4":{"kind":"call","span":{"start":[2533,4],"end":[2533,76],"bytes":[81196,81268]},"callee":null},"2535:4":{"kind":"call","span":{"start":[2535,4],"end":[2535,101],"bytes":[81283,81380]},"callee":null},"2539:8":{"kind":"call","span":{"start":[2539,8],"end":[2539,25],"bytes":[81415,81432]},"callee":null},"2543:2":{"kind":"call","span":{"start":[2543,2],"end":[2547,5],"bytes":[81541,81707]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2548:14":{"kind":"call","span":{"start":[2548,14],"end":[2548,41],"bytes":[81721,81748]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"2548:28":{"kind":"call","span":{"start":[2548,28],"end":[2548,40],"bytes":[81735,81747]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2554:2":{"kind":"call","span":{"start":[2554,2],"end":[2558,5],"bytes":[81858,82021]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2559:17":{"kind":"call","span":{"start":[2559,17],"end":[2559,65],"bytes":[82038,82086]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"2561:17":{"kind":"call","span":{"start":[2561,17],"end":[2561,73],"bytes":[82120,82176]},"callee":null},"2563:2":{"kind":"call","span":{"start":[2563,2],"end":[2563,30],"bytes":[82181,82209]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2567:20":{"kind":"call","span":{"start":[2567,20],"end":[2567,43],"bytes":[82289,82312]},"callee":null},"2569:18":{"kind":"call","span":{"start":[2569,18],"end":[2569,73],"bytes":[82348,82403]},"callee":null},"2571:9":{"kind":"call","span":{"start":[2571,9],"end":[2575,6],"bytes":[82416,82488]},"callee":null},"2577:16":{"kind":"call","span":{"start":[2577,16],"end":[2577,91],"bytes":[82505,82580]},"callee":null},"2578:18":{"kind":"call","span":{"start":[2578,18],"end":[2578,57],"bytes":[82612,82651]},"callee":null},"2581:17":{"kind":"call","span":{"start":[2581,17],"end":[2581,65],"bytes":[82673,82721]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"2583:18":{"kind":"call","span":{"start":[2583,18],"end":[2583,82],"bytes":[82757,82821]},"callee":null},"2585:3":{"kind":"call","span":{"start":[2585,3],"end":[2585,31],"bytes":[82828,82856]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2588:15":{"kind":"call","span":{"start":[2588,15],"end":[2588,54],"bytes":[82875,82914]},"callee":null},"2591:25":{"kind":"call","span":{"start":[2591,25],"end":[2591,90],"bytes":[83018,83083]},"callee":null},"2596:2":{"kind":"call","span":{"start":[2596,2],"end":[2600,5],"bytes":[83190,83347]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2601:20":{"kind":"call","span":{"start":[2601,20],"end":[2601,48],"bytes":[83367,83395]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint"},"2607:12":{"kind":"call","span":{"start":[2607,12],"end":[2607,31],"bytes":[83471,83490]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.rollback"},"2608:18":{"kind":"call","span":{"start":[2608,18],"end":[2608,76],"bytes":[83522,83580]},"callee":null},"2613:11":{"kind":"call","span":{"start":[2613,11],"end":[2613,36],"bytes":[83617,83642]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq"},"2614:17":{"kind":"call","span":{"start":[2614,17],"end":[2614,59],"bytes":[83673,83715]},"callee":null},"2618:2":{"kind":"call","span":{"start":[2618,2],"end":[2622,5],"bytes":[83761,83927]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2623:16":{"kind":"call","span":{"start":[2623,16],"end":[2623,43],"bytes":[83943,83970]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"2623:30":{"kind":"call","span":{"start":[2623,30],"end":[2623,42],"bytes":[83957,83969]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2626:12":{"kind":"call","span":{"start":[2626,12],"end":[2626,35],"bytes":[84019,84042]},"callee":null},"2633:17":{"kind":"call","span":{"start":[2633,17],"end":[2633,65],"bytes":[84206,84254]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"2635:18":{"kind":"call","span":{"start":[2635,18],"end":[2635,81],"bytes":[84290,84353]},"callee":null},"2637:3":{"kind":"call","span":{"start":[2637,3],"end":[2637,31],"bytes":[84360,84388]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2649:17":{"kind":"call","span":{"start":[2649,17],"end":[2649,65],"bytes":[84925,84973]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"2651:18":{"kind":"call","span":{"start":[2651,18],"end":[2651,73],"bytes":[85009,85064]},"callee":null},"2653:3":{"kind":"call","span":{"start":[2653,3],"end":[2653,31],"bytes":[85071,85099]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2659:2":{"kind":"call","span":{"start":[2659,2],"end":[2663,5],"bytes":[85233,85406]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2664:13":{"kind":"call","span":{"start":[2664,13],"end":[2664,36],"bytes":[85419,85442]},"callee":null},"2666:17":{"kind":"call","span":{"start":[2666,17],"end":[2666,45],"bytes":[85476,85504]},"callee":null},"2668:8":{"kind":"call","span":{"start":[2668,8],"end":[2668,37],"bytes":[85515,85544]},"callee":null},"2674:15":{"kind":"call","span":{"start":[2674,15],"end":[2674,83],"bytes":[85849,85917]},"callee":null},"2675:17":{"kind":"call","span":{"start":[2675,17],"end":[2675,56],"bytes":[85948,85987]},"callee":null},"2679:2":{"kind":"call","span":{"start":[2679,2],"end":[2683,5],"bytes":[86056,86225]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2686:17":{"kind":"call","span":{"start":[2686,17],"end":[2686,52],"bytes":[86300,86335]},"callee":null},"2687:17":{"kind":"call","span":{"start":[2687,17],"end":[2687,52],"bytes":[86353,86388]},"callee":null},"2691:16":{"kind":"call","span":{"start":[2691,16],"end":[2691,57],"bytes":[86478,86519]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync"},"2693:17":{"kind":"call","span":{"start":[2693,17],"end":[2693,72],"bytes":[86553,86608]},"callee":null},"2695:2":{"kind":"call","span":{"start":[2695,2],"end":[2695,30],"bytes":[86613,86641]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2700:12":{"kind":"call","span":{"start":[2700,12],"end":[2700,24],"bytes":[86799,86811]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.rollback"},"2701:17":{"kind":"call","span":{"start":[2701,17],"end":[2701,67],"bytes":[86842,86892]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_1","kind":"function","span":{"start":[2525,1],"end":[2528,5],"bytes":[80903,81015]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_1","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2525,1],"end":[2525,23],"bytes":[80903,80925]}}],"body":{}},"closure_2":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_2","kind":"function","span":{"start":[2544,1],"end":[2547,5],"bytes":[81595,81707]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_2","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2544,1],"end":[2544,23],"bytes":[81595,81617]}}],"body":{}},"closure_3":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_3","kind":"function","span":{"start":[2555,1],"end":[2558,5],"bytes":[81909,82021]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_3","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2555,1],"end":[2555,23],"bytes":[81909,81931]}}],"body":{}},"closure_4":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_4","kind":"function","span":{"start":[2571,1],"end":[2575,6],"bytes":[82408,82488]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_4","parameters":[],"body":{"2573:9":{"kind":"call","span":{"start":[2573,9],"end":[2573,28],"bytes":[82458,82477]},"callee":null}}},"closure_5":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_5","kind":"function","span":{"start":[2597,1],"end":[2600,5],"bytes":[83235,83347]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_5","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2597,1],"end":[2597,23],"bytes":[83235,83257]}}],"body":{}},"closure_6":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_6","kind":"function","span":{"start":[2619,1],"end":[2622,5],"bytes":[83815,83927]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_6","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2619,1],"end":[2619,23],"bytes":[83815,83837]}}],"body":{}},"closure_7":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_7","kind":"function","span":{"start":[2660,1],"end":[2663,5],"bytes":[85294,85406]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_7","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2660,1],"end":[2660,23],"bytes":[85294,85316]}}],"body":{}},"closure_8":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_8","kind":"function","span":{"start":[2668,1],"end":[2668,37],"bytes":[85508,85544]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_8","parameters":[],"body":{"2668:21":{"kind":"call","span":{"start":[2668,21],"end":[2668,33],"bytes":[85528,85540]},"callee":null}}},"closure_9":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_9","kind":"function","span":{"start":[2680,1],"end":[2683,5],"bytes":[86113,86225]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_9","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2680,1],"end":[2680,23],"bytes":[86113,86135]}}],"body":{}}}},"github.com/benbjohnson/litestream.DB.deleteLocalLTXFile":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","kind":"method","span":{"start":[620,1],"end":[629,2],"bytes":[22008,22271]},"signature":"github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","parameters":[{"name":"level","type":"int","span":{"start":[620,1],"end":[620,79],"bytes":[22008,22086]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[620,1],"end":[620,79],"bytes":[22008,22086]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[620,1],"end":[620,79],"bytes":[22008,22086]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"621:10":{"kind":"call","span":{"start":[621,10],"end":[621,45],"bytes":[22096,22131]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"622:12":{"kind":"call","span":{"start":[622,12],"end":[622,27],"bytes":[22143,22158]},"callee":null},"622:44":{"kind":"call","span":{"start":[622,44],"end":[622,62],"bytes":[22175,22193]},"callee":null},"626:3":{"kind":"call","span":{"start":[626,3],"end":[626,26],"bytes":[22231,22254]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"}}},"github.com/benbjohnson/litestream.DB.deleteMetrics":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics","kind":"method","span":{"start":[382,1],"end":[416,2],"bytes":[15025,16181]},"signature":"github.com/benbjohnson/litestream.DB.deleteMetrics","parameters":[],"metrics":{"cyclomatic":4},"body":{"383:2":{"kind":"call","span":{"start":[383,2],"end":[383,23],"bytes":[15058,15079]},"callee":null},"384:8":{"kind":"call","span":{"start":[384,8],"end":[384,31],"bytes":[15087,15110]},"callee":null},"390:10":{"kind":"call","span":{"start":[390,10],"end":[390,32],"bytes":[15191,15213]},"callee":null},"393:3":{"kind":"call","span":{"start":[393,3],"end":[393,41],"bytes":[15292,15330]},"callee":null},"394:3":{"kind":"call","span":{"start":[394,3],"end":[394,81],"bytes":[15333,15411]},"callee":null},"401:2":{"kind":"call","span":{"start":[401,2],"end":[401,39],"bytes":[15503,15540]},"callee":null},"404:2":{"kind":"call","span":{"start":[404,2],"end":[404,43],"bytes":[15587,15628]},"callee":null},"405:2":{"kind":"call","span":{"start":[405,2],"end":[405,44],"bytes":[15630,15672]},"callee":null},"406:2":{"kind":"call","span":{"start":[406,2],"end":[406,52],"bytes":[15674,15724]},"callee":null},"407:2":{"kind":"call","span":{"start":[407,2],"end":[407,46],"bytes":[15726,15770]},"callee":null},"408:2":{"kind":"call","span":{"start":[408,2],"end":[408,44],"bytes":[15772,15814]},"callee":null},"409:2":{"kind":"call","span":{"start":[409,2],"end":[409,49],"bytes":[15816,15863]},"callee":null},"410:2":{"kind":"call","span":{"start":[410,2],"end":[410,50],"bytes":[15865,15913]},"callee":null},"411:2":{"kind":"call","span":{"start":[411,2],"end":[411,45],"bytes":[15915,15958]},"callee":null},"412:2":{"kind":"call","span":{"start":[412,2],"end":[412,60],"bytes":[15960,16018]},"callee":null},"413:2":{"kind":"call","span":{"start":[413,2],"end":[413,50],"bytes":[16020,16068]},"callee":null},"414:2":{"kind":"call","span":{"start":[414,2],"end":[414,55],"bytes":[16070,16123]},"callee":null},"415:2":{"kind":"call","span":{"start":[415,2],"end":[415,56],"bytes":[16125,16179]},"callee":null}}},"github.com/benbjohnson/litestream.DB.detectFullCheckpoint":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","kind":"method","span":{"start":[1939,1],"end":[1967,2],"bytes":[63389,64226]},"signature":"github.com/benbjohnson/litestream.DB.detectFullCheckpoint","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1939,1],"end":[1939,96],"bytes":[63389,63484]}},{"name":"knownSalts","type":"[][2]uint32","span":{"start":[1939,1],"end":[1939,96],"bytes":[63389,63484]}}],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1940:18":{"kind":"call","span":{"start":[1940,18],"end":[1940,39],"bytes":[63502,63523]},"callee":null},"1940:26":{"kind":"call","span":{"start":[1940,26],"end":[1940,38],"bytes":[63510,63522]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1942:17":{"kind":"call","span":{"start":[1942,17],"end":[1942,53],"bytes":[63557,63593]},"callee":null},"1944:8":{"kind":"call","span":{"start":[1944,8],"end":[1944,23],"bytes":[63604,63619]},"callee":null},"1947:5":{"kind":"call","span":{"start":[1947,5],"end":[1947,20],"bytes":[63654,63669]},"callee":null},"1948:30":{"kind":"call","span":{"start":[1948,30],"end":[1948,45],"bytes":[63705,63720]},"callee":null},"1951:13":{"kind":"call","span":{"start":[1951,13],"end":[1951,90],"bytes":[63740,63817]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader"},"1951:35":{"kind":"call","span":{"start":[1951,35],"end":[1951,89],"bytes":[63762,63816]},"callee":null},"1953:17":{"kind":"call","span":{"start":[1953,17],"end":[1953,54],"bytes":[63851,63888]},"callee":null},"1955:12":{"kind":"call","span":{"start":[1955,12],"end":[1955,50],"bytes":[63903,63941]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil"},"1957:17":{"kind":"call","span":{"start":[1957,17],"end":[1957,57],"bytes":[63975,64015]},"callee":null},"1962:3":{"kind":"call","span":{"start":[1962,3],"end":[1962,18],"bytes":[64094,64109]},"callee":null},"1966:9":{"kind":"call","span":{"start":[1966,9],"end":[1966,15],"bytes":[64208,64214]},"callee":null}}},"github.com/benbjohnson/litestream.DB.effectiveTruncatePageN":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN","kind":"method","span":{"start":[1575,1],"end":[1580,2],"bytes":[51251,51383]},"signature":"github.com/benbjohnson/litestream.DB.effectiveTruncatePageN","parameters":[],"return_type":"int","metrics":{"cyclomatic":2},"body":{}},"github.com/benbjohnson/litestream.DB.ensureWALExists":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","kind":"method","span":{"start":[1644,1],"end":[1652,2],"bytes":[53444,53756]},"signature":"github.com/benbjohnson/litestream.DB.ensureWALExists","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1644,1],"end":[1644,65],"bytes":[53444,53508]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1646:16":{"kind":"call","span":{"start":[1646,16],"end":[1646,37],"bytes":[53561,53582]},"callee":null},"1646:24":{"kind":"call","span":{"start":[1646,24],"end":[1646,36],"bytes":[53569,53581]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1646:53":{"kind":"call","span":{"start":[1646,53],"end":[1646,62],"bytes":[53598,53607]},"callee":null},"1651:9":{"kind":"call","span":{"start":[1651,9],"end":[1651,34],"bytes":[53729,53754]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq"}}},"github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","kind":"method","span":{"start":[1569,1],"end":[1573,2],"bytes":[51023,51249]},"signature":"github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","parameters":[{"name":"walSize","type":"int64","span":{"start":[1569,1],"end":[1569,61],"bytes":[51023,51083]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"1570:19":{"kind":"call","span":{"start":[1570,19],"end":[1570,46],"bytes":[51102,51129]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN"},"1572:14":{"kind":"call","span":{"start":[1572,14],"end":[1572,69],"bytes":[51192,51247]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.calcWALSize"},"1572:26":{"kind":"call","span":{"start":[1572,26],"end":[1572,45],"bytes":[51204,51223]},"callee":null},"1572:47":{"kind":"call","span":{"start":[1572,47],"end":[1572,68],"bytes":[51225,51246]},"callee":null}}},"github.com/benbjohnson/litestream.DB.execCheckpoint":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","kind":"method","span":{"start":[2710,1],"end":[2754,2],"bytes":[87105,88720]},"signature":"github.com/benbjohnson/litestream.DB.execCheckpoint","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2710,1],"end":[2710,92],"bytes":[87105,87196]}},{"name":"mode","type":"string","span":{"start":[2710,1],"end":[2710,92],"bytes":[87105,87196]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"2717:7":{"kind":"call","span":{"start":[2717,7],"end":[2717,17],"bytes":[87319,87329]},"callee":null},"2718:8":{"kind":"call","span":{"start":[2718,8],"end":[2725,5],"bytes":[87337,87597]},"callee":null},"2729:12":{"kind":"call","span":{"start":[2729,12],"end":[2729,32],"bytes":[87754,87774]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock"},"2730:13":{"kind":"call","span":{"start":[2730,13],"end":[2730,53],"bytes":[87801,87841]},"callee":null},"2732:8":{"kind":"call","span":{"start":[2732,8],"end":[2732,48],"bytes":[87852,87892]},"callee":null},"2743:12":{"kind":"call","span":{"start":[2743,12],"end":[2743,46],"bytes":[88324,88358]},"callee":null},"2746:2":{"kind":"call","span":{"start":[2746,2],"end":[2746,104],"bytes":[88425,88527]},"callee":null},"2746:56":{"kind":"call","span":{"start":[2746,56],"end":[2746,103],"bytes":[88479,88526]},"callee":null},"2749:12":{"kind":"call","span":{"start":[2749,12],"end":[2749,35],"bytes":[88602,88625]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock"},"2750:13":{"kind":"call","span":{"start":[2750,13],"end":[2750,55],"bytes":[88652,88694]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1","kind":"function","span":{"start":[2718,1],"end":[2725,5],"bytes":[87330,87597]},"signature":"github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1","parameters":[],"body":{"2720:3":{"kind":"call","span":{"start":[2720,3],"end":[2720,40],"bytes":[87392,87429]},"callee":null},"2722:4":{"kind":"call","span":{"start":[2722,4],"end":[2722,46],"bytes":[87457,87499]},"callee":null},"2724:24":{"kind":"call","span":{"start":[2724,24],"end":[2724,67],"bytes":[87533,87576]},"callee":null},"2724:3":{"kind":"call","span":{"start":[2724,3],"end":[2724,83],"bytes":[87512,87592]},"callee":null},"2724:69":{"kind":"call","span":{"start":[2724,69],"end":[2724,82],"bytes":[87578,87591]},"callee":null}}},"closure_2":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_2","kind":"function","span":{"start":[2732,1],"end":[2732,48],"bytes":[87845,87892]},"signature":"github.com/benbjohnson/litestream.DB.execCheckpoint.closure_2","parameters":[],"body":{"2732:21":{"kind":"call","span":{"start":[2732,21],"end":[2732,44],"bytes":[87865,87888]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.finishSyncDiag":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag","kind":"method","span":{"start":[517,1],"end":[528,2],"bytes":[19046,19291]},"signature":"github.com/benbjohnson/litestream.DB.finishSyncDiag","parameters":[{"name":"err","type":"error","span":{"start":[517,1],"end":[517,42],"bytes":[19046,19087]}}],"metrics":{"cyclomatic":3},"body":{"518:2":{"kind":"call","span":{"start":[518,2],"end":[518,20],"bytes":[19089,19107]},"callee":null},"519:8":{"kind":"call","span":{"start":[519,8],"end":[519,28],"bytes":[19115,19135]},"callee":null},"524:26":{"kind":"call","span":{"start":[524,26],"end":[524,36],"bytes":[19227,19237]},"callee":null},"526:21":{"kind":"call","span":{"start":[526,21],"end":[526,32],"bytes":[19275,19286]},"callee":null}}},"github.com/benbjohnson/litestream.DB.finishSyncExecutorWait":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","kind":"method","span":{"start":[539,1],"end":[546,2],"bytes":[19512,19731]},"signature":"github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","parameters":[],"metrics":{"cyclomatic":2},"body":{"540:2":{"kind":"call","span":{"start":[540,2],"end":[540,20],"bytes":[19554,19572]},"callee":null},"541:8":{"kind":"call","span":{"start":[541,8],"end":[541,28],"bytes":[19580,19600]},"callee":null}}},"github.com/benbjohnson/litestream.DB.init":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","kind":"method","span":{"start":[1085,1],"end":[1199,2],"bytes":[35148,38717]},"signature":"github.com/benbjohnson/litestream.DB.init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1085,1],"end":[1085,54],"bytes":[35148,35201]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":21},"body":{"1092:13":{"kind":"call","span":{"start":[1092,13],"end":[1092,29],"bytes":[35320,35336]},"callee":null},"1093:5":{"kind":"call","span":{"start":[1093,5],"end":[1093,23],"bytes":[35341,35359]},"callee":null},"1101:15":{"kind":"call","span":{"start":[1101,15],"end":[1101,45],"bytes":[35493,35523]},"callee":null},"1101:23":{"kind":"call","span":{"start":[1101,23],"end":[1101,44],"bytes":[35501,35522]},"callee":null},"1106:9":{"kind":"call","span":{"start":[1106,9],"end":[1107,42],"bytes":[35580,35699]},"callee":null},"1107:12":{"kind":"call","span":{"start":[1107,12],"end":[1107,41],"bytes":[35669,35698]},"callee":null},"1109:18":{"kind":"call","span":{"start":[1109,18],"end":[1109,41],"bytes":[35718,35741]},"callee":null},"1114:12":{"kind":"call","span":{"start":[1114,12],"end":[1114,33],"bytes":[35865,35886]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL"},"1115:10":{"kind":"call","span":{"start":[1115,10],"end":[1115,48],"bytes":[35910,35948]},"callee":null},"1119:17":{"kind":"call","span":{"start":[1119,17],"end":[1119,33],"bytes":[36045,36061]},"callee":null},"1120:10":{"kind":"call","span":{"start":[1120,10],"end":[1120,56],"bytes":[36085,36131]},"callee":null},"1125:8":{"kind":"call","span":{"start":[1125,8],"end":[1132,5],"bytes":[36231,36353]},"callee":null},"1137:12":{"kind":"call","span":{"start":[1137,12],"end":[1137,68],"bytes":[36519,36575]},"callee":null},"1140:10":{"kind":"call","span":{"start":[1140,10],"end":[1140,56],"bytes":[36651,36697]},"callee":null},"1145:15":{"kind":"call","span":{"start":[1145,15],"end":[1145,122],"bytes":[36823,36930]},"callee":null},"1146:10":{"kind":"call","span":{"start":[1146,10],"end":[1146,61],"bytes":[36954,37005]},"callee":null},"1151:15":{"kind":"call","span":{"start":[1151,15],"end":[1151,98],"bytes":[37167,37250]},"callee":null},"1152:10":{"kind":"call","span":{"start":[1152,10],"end":[1152,62],"bytes":[37274,37326]},"callee":null},"1157:12":{"kind":"call","span":{"start":[1157,12],"end":[1157,35],"bytes":[37438,37461]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock"},"1158:10":{"kind":"call","span":{"start":[1158,10],"end":[1158,50],"bytes":[37485,37525]},"callee":null},"1162:12":{"kind":"call","span":{"start":[1162,12],"end":[1162,59],"bytes":[37561,37608]},"callee":null},"1163:10":{"kind":"call","span":{"start":[1163,10],"end":[1163,47],"bytes":[37651,37688]},"callee":null},"1165:10":{"kind":"call","span":{"start":[1165,10],"end":[1165,61],"bytes":[37728,37779]},"callee":null},"1169:12":{"kind":"call","span":{"start":[1169,12],"end":[1169,54],"bytes":[37839,37881]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"1174:12":{"kind":"call","span":{"start":[1174,12],"end":[1174,35],"bytes":[37969,37992]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists"},"1175:10":{"kind":"call","span":{"start":[1175,10],"end":[1175,50],"bytes":[38016,38056]},"callee":null},"1181:13":{"kind":"call","span":{"start":[1181,13],"end":[1181,47],"bytes":[38224,38258]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica"},"1182:11":{"kind":"call","span":{"start":[1182,11],"end":[1182,63],"bytes":[38283,38335]},"callee":null},"1195:3":{"kind":"call","span":{"start":[1195,3],"end":[1195,27],"bytes":[38675,38699]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start"}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init/github.com/benbjohnson/litestream.DB.init.closure_1","kind":"function","span":{"start":[1125,1],"end":[1132,5],"bytes":[36224,36353]},"signature":"github.com/benbjohnson/litestream.DB.init.closure_1","parameters":[],"body":{"1127:8":{"kind":"call","span":{"start":[1127,8],"end":[1127,28],"bytes":[36265,36285]},"callee":null},"1128:4":{"kind":"call","span":{"start":[1128,4],"end":[1128,17],"bytes":[36289,36302]},"callee":null},"1129:4":{"kind":"call","span":{"start":[1129,4],"end":[1129,16],"bytes":[36306,36318]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.initMetrics":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","kind":"method","span":{"start":[356,1],"end":[378,2],"bytes":[13702,14876]},"signature":"github.com/benbjohnson/litestream.DB.initMetrics","parameters":[],"metrics":{"cyclomatic":2},"body":{"357:2":{"kind":"call","span":{"start":[357,2],"end":[357,23],"bytes":[13733,13754]},"callee":null},"358:8":{"kind":"call","span":{"start":[358,8],"end":[358,31],"bytes":[13762,13785]},"callee":null},"364:27":{"kind":"call","span":{"start":[364,27],"end":[364,49],"bytes":[13913,13935]},"callee":null},"366:19":{"kind":"call","span":{"start":[366,19],"end":[366,58],"bytes":[13958,13997]},"callee":null},"367:20":{"kind":"call","span":{"start":[367,20],"end":[367,60],"bytes":[14017,14057]},"callee":null},"368:28":{"kind":"call","span":{"start":[368,28],"end":[368,76],"bytes":[14085,14133]},"callee":null},"369:17":{"kind":"call","span":{"start":[369,17],"end":[369,59],"bytes":[14150,14192]},"callee":null},"370:20":{"kind":"call","span":{"start":[370,20],"end":[370,60],"bytes":[14212,14252]},"callee":null},"371:25":{"kind":"call","span":{"start":[371,25],"end":[371,70],"bytes":[14277,14322]},"callee":null},"372:26":{"kind":"call","span":{"start":[372,26],"end":[372,72],"bytes":[14348,14394]},"callee":null},"373:21":{"kind":"call","span":{"start":[373,21],"end":[373,62],"bytes":[14415,14456]},"callee":null},"374:29":{"kind":"call","span":{"start":[374,29],"end":[374,98],"bytes":[14485,14554]},"callee":null},"375:34":{"kind":"call","span":{"start":[375,34],"end":[375,108],"bytes":[14588,14662]},"callee":null},"376:35":{"kind":"call","span":{"start":[376,35],"end":[376,110],"bytes":[14697,14772]},"callee":null},"377:46":{"kind":"call","span":{"start":[377,46],"end":[377,102],"bytes":[14818,14874]},"callee":null}}},"github.com/benbjohnson/litestream.DB.invalidatePosCache":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","kind":"method","span":{"start":[699,1],"end":[703,2],"bytes":[24221,24311]},"signature":"github.com/benbjohnson/litestream.DB.invalidatePosCache","parameters":[],"metrics":{"cyclomatic":1},"body":{"700:2":{"kind":"call","span":{"start":[700,2],"end":[700,15],"bytes":[24259,24272]},"callee":null},"702:2":{"kind":"call","span":{"start":[702,2],"end":[702,17],"bytes":[24294,24309]},"callee":null}}},"github.com/benbjohnson/litestream.DB.lastPageMatch":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","kind":"method","span":{"start":[1899,1],"end":[1935,2],"bytes":[62116,63253]},"signature":"github.com/benbjohnson/litestream.DB.lastPageMatch","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1899,1],"end":[1899,115],"bytes":[62116,62230]}},{"name":"dec","type":"*github.com/superfly/ltx.Decoder","span":{"start":[1899,1],"end":[1899,115],"bytes":[62116,62230]}},{"name":"prevWALOffset","type":"int64","span":{"start":[1899,1],"end":[1899,115],"bytes":[62116,62230]}},{"name":"frameSize","type":"int64","span":{"start":[1899,1],"end":[1899,115],"bytes":[62116,62230]}}],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"1904:16":{"kind":"call","span":{"start":[1904,16],"end":[1904,69],"bytes":[62307,62360]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALFileAt"},"1904:30":{"kind":"call","span":{"start":[1904,30],"end":[1904,42],"bytes":[62321,62333]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1906:17":{"kind":"call","span":{"start":[1906,17],"end":[1906,72],"bytes":[62394,62449]},"callee":null},"1908:10":{"kind":"call","span":{"start":[1908,10],"end":[1908,44],"bytes":[62462,62496]},"callee":null},"1909:12":{"kind":"call","span":{"start":[1909,12],"end":[1909,46],"bytes":[62508,62542]},"callee":null},"1910:12":{"kind":"call","span":{"start":[1910,12],"end":[1910,47],"bytes":[62554,62589]},"callee":null},"1913:15":{"kind":"call","span":{"start":[1913,15],"end":[1913,27],"bytes":[62641,62653]},"callee":null},"1913:50":{"kind":"call","span":{"start":[1913,50],"end":[1913,62],"bytes":[62676,62688]},"callee":null},"1918:22":{"kind":"call","span":{"start":[1918,22],"end":[1918,34],"bytes":[62815,62827]},"callee":null},"1918:9":{"kind":"call","span":{"start":[1918,9],"end":[1918,44],"bytes":[62802,62837]},"callee":null},"1921:13":{"kind":"call","span":{"start":[1921,13],"end":[1921,38],"bytes":[62882,62907]},"callee":null},"1921:40":{"kind":"call","span":{"start":[1921,40],"end":[1921,62],"bytes":[62909,62931]},"callee":null},"1924:18":{"kind":"call","span":{"start":[1924,18],"end":[1924,56],"bytes":[63027,63065]},"callee":null},"1930:7":{"kind":"call","span":{"start":[1930,7],"end":[1930,29],"bytes":[63146,63168]},"callee":null}}},"github.com/benbjohnson/litestream.DB.lockExec":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","kind":"method","span":{"start":[1310,1],"end":[1321,2],"bytes":[41797,42101]},"signature":"github.com/benbjohnson/litestream.DB.lockExec","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1310,1],"end":[1310,52],"bytes":[41797,41848]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1311:5":{"kind":"call","span":{"start":[1311,5],"end":[1311,29],"bytes":[41853,41877]},"callee":null},"1314:2":{"kind":"call","span":{"start":[1314,2],"end":[1314,28],"bytes":[41897,41923]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait"},"1315:8":{"kind":"call","span":{"start":[1315,8],"end":[1315,35],"bytes":[41931,41958]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait"},"1317:12":{"kind":"call","span":{"start":[1317,12],"end":[1317,38],"bytes":[41971,41997]},"callee":null},"1318:10":{"kind":"call","span":{"start":[1318,10],"end":[1318,73],"bytes":[42021,42084]},"callee":null},"1318:54":{"kind":"call","span":{"start":[1318,54],"end":[1318,72],"bytes":[42065,42083]},"callee":null}}},"github.com/benbjohnson/litestream.DB.monitor":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","kind":"method","span":{"start":[3227,1],"end":[3311,2],"bytes":[103385,105989]},"signature":"github.com/benbjohnson/litestream.DB.monitor","parameters":[],"metrics":{"cyclomatic":17},"body":{"3228:12":{"kind":"call","span":{"start":[3228,12],"end":[3228,46],"bytes":[103422,103456]},"callee":null},"3229:8":{"kind":"call","span":{"start":[3229,8],"end":[3229,21],"bytes":[103464,103477]},"callee":null},"3239:10":{"kind":"call","span":{"start":[3239,10],"end":[3239,23],"bytes":[103663,103676]},"callee":null},"3247:11":{"kind":"call","span":{"start":[3247,11],"end":[3247,24],"bytes":[103816,103829]},"callee":null},"3249:11":{"kind":"call","span":{"start":[3249,11],"end":[3249,30],"bytes":[103852,103871]},"callee":null},"3259:13":{"kind":"call","span":{"start":[3259,13],"end":[3259,28],"bytes":[104299,104314]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync"},"3259:45":{"kind":"call","span":{"start":[3259,45],"end":[3259,73],"bytes":[104331,104359]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"3273:7":{"kind":"call","span":{"start":[3273,7],"end":[3273,30],"bytes":[104705,104728]},"callee":null},"3275:39":{"kind":"call","span":{"start":[3275,39],"end":[3275,62],"bytes":[104818,104841]},"callee":null},"3275:8":{"kind":"call","span":{"start":[3275,8],"end":[3275,35],"bytes":[104787,104814]},"callee":null},"3278:6":{"kind":"call","span":{"start":[3278,6],"end":[3284,44],"bytes":[104943,105246]},"callee":null},"3281:15":{"kind":"call","span":{"start":[3281,15],"end":[3281,39],"bytes":[105097,105121]},"callee":null},"3286:6":{"kind":"call","span":{"start":[3286,6],"end":[3289,26],"bytes":[105265,105385]},"callee":null},"3291:19":{"kind":"call","span":{"start":[3291,19],"end":[3291,29],"bytes":[105410,105420]},"callee":null},"3295:7":{"kind":"call","span":{"start":[3295,7],"end":[3295,27],"bytes":[105502,105522]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"3296:5":{"kind":"call","span":{"start":[3296,5],"end":[3296,81],"bytes":[105553,105629]},"callee":null},"3297:22":{"kind":"call","span":{"start":[3297,22],"end":[3297,49],"bytes":[105651,105678]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles"},"3298:6":{"kind":"call","span":{"start":[3298,6],"end":[3298,70],"bytes":[105705,105769]},"callee":null},"3306:4":{"kind":"call","span":{"start":[3306,4],"end":[3306,72],"bytes":[105876,105944]},"callee":null}}},"github.com/benbjohnson/litestream.DB.newSyncExecutor":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","kind":"method","span":{"start":[2004,1],"end":[2023,2],"bytes":[65124,65494]},"signature":"github.com/benbjohnson/litestream.DB.newSyncExecutor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2004,1],"end":[2004,76],"bytes":[65124,65199]}}],"return_type":"(*github.com/benbjohnson/litestream.syncExecutor, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"2005:2":{"kind":"call","span":{"start":[2005,2],"end":[2005,14],"bytes":[65201,65213]},"callee":null},"2006:8":{"kind":"call","span":{"start":[2006,8],"end":[2006,22],"bytes":[65221,65235]},"callee":null},"2008:12":{"kind":"call","span":{"start":[2008,12],"end":[2008,24],"bytes":[65248,65260]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init"},"2014:14":{"kind":"call","span":{"start":[2014,14],"end":[2014,22],"bytes":[65354,65362]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"2016:15":{"kind":"call","span":{"start":[2016,15],"end":[2016,41],"bytes":[65394,65420]},"callee":null}}},"github.com/benbjohnson/litestream.DB.openLocalLTXFile":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.openLocalLTXFile","kind":"method","span":{"start":[614,1],"end":[616,2],"bytes":[21758,21906]},"signature":"github.com/benbjohnson/litestream.DB.openLocalLTXFile","parameters":[{"name":"level","type":"int","span":{"start":[614,1],"end":[614,94],"bytes":[21758,21851]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[614,1],"end":[614,94],"bytes":[21758,21851]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[614,1],"end":[614,94],"bytes":[21758,21851]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"615:17":{"kind":"call","span":{"start":[615,17],"end":[615,52],"bytes":[21868,21903]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"615:9":{"kind":"call","span":{"start":[615,9],"end":[615,53],"bytes":[21860,21904]},"callee":null}}},"github.com/benbjohnson/litestream.DB.releaseReadLock":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","kind":"method","span":{"start":[1270,1],"end":[1283,2],"bytes":[40770,41189]},"signature":"github.com/benbjohnson/litestream.DB.releaseReadLock","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1280:9":{"kind":"call","span":{"start":[1280,9],"end":[1280,25],"bytes":[41145,41161]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.rollback"}}},"github.com/benbjohnson/litestream.DB.setPersistWAL":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL","kind":"method","span":{"start":[1061,1],"end":[1081,2],"bytes":[34525,35020]},"signature":"github.com/benbjohnson/litestream.DB.setPersistWAL","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1061,1],"end":[1061,57],"bytes":[34525,34581]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1062:15":{"kind":"call","span":{"start":[1062,15],"end":[1062,30],"bytes":[34596,34611]},"callee":null},"1064:10":{"kind":"call","span":{"start":[1064,10],"end":[1064,47],"bytes":[34638,34675]},"callee":null},"1066:8":{"kind":"call","span":{"start":[1066,8],"end":[1066,20],"bytes":[34686,34698]},"callee":null},"1068:9":{"kind":"call","span":{"start":[1068,9],"end":[1080,4],"bytes":[34708,35018]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL/github.com/benbjohnson/litestream.DB.setPersistWAL.closure_1","kind":"function","span":{"start":[1068,1],"end":[1080,4],"bytes":[34700,35018]},"signature":"github.com/benbjohnson/litestream.DB.setPersistWAL.closure_1","parameters":[{"name":"driverConn","type":"interface{}","span":{"start":[1068,1],"end":[1068,54],"bytes":[34700,34753]}}],"return_type":"error","error_channel":["error"],"body":{"1071:11":{"kind":"call","span":{"start":[1071,11],"end":[1071,62],"bytes":[34819,34870]},"callee":null},"1074:13":{"kind":"call","span":{"start":[1074,13],"end":[1074,48],"bytes":[34888,34923]},"callee":null},"1076:11":{"kind":"call","span":{"start":[1076,11],"end":[1076,55],"bytes":[34952,34996]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.setSyncDiagPhase":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","kind":"method","span":{"start":[504,1],"end":[515,2],"bytes":[18755,19044]},"signature":"github.com/benbjohnson/litestream.DB.setSyncDiagPhase","parameters":[{"name":"phase","type":"github.com/benbjohnson/litestream.diagPhase","span":{"start":[504,1],"end":[504,79],"bytes":[18755,18833]}},{"name":"updates","type":"[]func(*github.com/benbjohnson/litestream.diagState)","span":{"start":[504,1],"end":[504,79],"bytes":[18755,18833]},"is_variadic":true}],"metrics":{"cyclomatic":3},"body":{"505:2":{"kind":"call","span":{"start":[505,2],"end":[505,20],"bytes":[18835,18853]},"callee":null},"506:8":{"kind":"call","span":{"start":[506,8],"end":[506,28],"bytes":[18861,18881]},"callee":null},"511:26":{"kind":"call","span":{"start":[511,26],"end":[511,36],"bytes":[18972,18982]},"callee":null},"513:3":{"kind":"call","span":{"start":[513,3],"end":[513,23],"bytes":[19019,19039]},"callee":null}}},"github.com/benbjohnson/litestream.DB.snapshotPosition":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","kind":"method","span":{"start":[2796,1],"end":[2833,2],"bytes":[89741,90845]},"signature":"github.com/benbjohnson/litestream.DB.snapshotPosition","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2796,1],"end":[2796,85],"bytes":[89741,89825]}}],"return_type":"(*github.com/benbjohnson/litestream.snapshotReadPosition, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"2797:12":{"kind":"call","span":{"start":[2797,12],"end":[2797,28],"bytes":[89837,89853]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec"},"2800:8":{"kind":"call","span":{"start":[2800,8],"end":[2800,29],"bytes":[89896,89917]},"callee":null},"2802:14":{"kind":"call","span":{"start":[2802,14],"end":[2802,27],"bytes":[89932,89945]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize"},"2803:14":{"kind":"call","span":{"start":[2803,14],"end":[2803,22],"bytes":[89959,89967]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"2806:3":{"kind":"call","span":{"start":[2806,3],"end":[2806,66],"bytes":[89991,90054]},"callee":null},"2810:15":{"kind":"call","span":{"start":[2810,15],"end":[2810,41],"bytes":[90157,90183]},"callee":null},"2813:23":{"kind":"call","span":{"start":[2813,23],"end":[2813,51],"bytes":[90210,90238]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset"},"2826:2":{"kind":"call","span":{"start":[2826,2],"end":[2826,18],"bytes":[90691,90707]},"callee":null}}},"github.com/benbjohnson/litestream.DB.snapshotReader":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader","kind":"method","span":{"start":[2876,1],"end":[2971,2],"bytes":[92366,95068]},"signature":"github.com/benbjohnson/litestream.DB.snapshotReader","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2876,1],"end":[2876,102],"bytes":[92366,92467]}},{"name":"pos","type":"*github.com/benbjohnson/litestream.snapshotReadPosition","span":{"start":[2876,1],"end":[2876,102],"bytes":[92366,92467]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"2877:2":{"kind":"call","span":{"start":[2877,2],"end":[2877,94],"bytes":[92469,92561]},"callee":null},"2877:38":{"kind":"call","span":{"start":[2877,38],"end":[2877,59],"bytes":[92505,92526]},"callee":null},"2881:13":{"kind":"call","span":{"start":[2881,13],"end":[2881,24],"bytes":[92632,92643]},"callee":null},"2885:12":{"kind":"call","span":{"start":[2885,12],"end":[2885,51],"bytes":[92693,92732]},"callee":null},"2885:19":{"kind":"call","span":{"start":[2885,19],"end":[2885,28],"bytes":[92700,92709]},"callee":null},"2885:31":{"kind":"call","span":{"start":[2885,31],"end":[2885,50],"bytes":[92712,92731]},"callee":null},"2888:12":{"kind":"call","span":{"start":[2888,12],"end":[2888,21],"bytes":[92835,92844]},"callee":null},"2889:5":{"kind":"call","span":{"start":[2889,5],"end":[2968,5],"bytes":[92849,95006]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","kind":"function","span":{"start":[2889,1],"end":[2968,5],"bytes":[92845,95006]},"signature":"github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","parameters":[],"body":{"2890:9":{"kind":"call","span":{"start":[2890,9],"end":[2890,20],"bytes":[92866,92877]},"callee":null},"2892:19":{"kind":"call","span":{"start":[2892,19],"end":[2892,40],"bytes":[92897,92918]},"callee":null},"2892:27":{"kind":"call","span":{"start":[2892,27],"end":[2892,39],"bytes":[92905,92917]},"callee":null},"2894:4":{"kind":"call","span":{"start":[2894,4],"end":[2894,26],"bytes":[92940,92962]},"callee":null},"2897:9":{"kind":"call","span":{"start":[2897,9],"end":[2897,24],"bytes":[92985,93000]},"callee":null},"2899:14":{"kind":"call","span":{"start":[2899,14],"end":[2899,91],"bytes":[93015,93092]},"callee":null},"2899:36":{"kind":"call","span":{"start":[2899,36],"end":[2899,90],"bytes":[93037,93091]},"callee":null},"2901:22":{"kind":"call","span":{"start":[2901,22],"end":[2901,59],"bytes":[93132,93169]},"callee":null},"2901:4":{"kind":"call","span":{"start":[2901,4],"end":[2901,60],"bytes":[93114,93170]},"callee":null},"2907:14":{"kind":"call","span":{"start":[2907,14],"end":[2907,36],"bytes":[93317,93339]},"callee":null},"2911:44":{"kind":"call","span":{"start":[2911,44],"end":[2911,69],"bytes":[93448,93473]},"callee":null},"2913:23":{"kind":"call","span":{"start":[2913,23],"end":[2913,54],"bytes":[93515,93546]},"callee":null},"2913:5":{"kind":"call","span":{"start":[2913,5],"end":[2913,55],"bytes":[93497,93547]},"callee":null},"2922:22":{"kind":"call","span":{"start":[2922,22],"end":[2922,128],"bytes":[93673,93779]},"callee":null},"2922:4":{"kind":"call","span":{"start":[2922,4],"end":[2922,129],"bytes":[93655,93780]},"callee":null},"2925:25":{"kind":"call","span":{"start":[2925,25],"end":[2925,98],"bytes":[93819,93892]},"callee":null},"2925:59":{"kind":"call","span":{"start":[2925,59],"end":[2925,97],"bytes":[93853,93891]},"callee":null},"2927:3":{"kind":"call","span":{"start":[2927,3],"end":[2934,22],"bytes":[93896,94123]},"callee":null},"2928:12":{"kind":"call","span":{"start":[2928,12],"end":[2928,33],"bytes":[93949,93970]},"callee":null},"2936:15":{"kind":"call","span":{"start":[2936,15],"end":[2936,33],"bytes":[94139,94157]},"callee":null},"2938:22":{"kind":"call","span":{"start":[2938,22],"end":[2938,60],"bytes":[94197,94235]},"callee":null},"2938:4":{"kind":"call","span":{"start":[2938,4],"end":[2938,61],"bytes":[94179,94236]},"callee":null},"2941:13":{"kind":"call","span":{"start":[2941,13],"end":[2953,5],"bytes":[94263,94600]},"callee":null},"2944:15":{"kind":"call","span":{"start":[2944,15],"end":[2944,35],"bytes":[94373,94393]},"callee":null},"2948:15":{"kind":"call","span":{"start":[2948,15],"end":[2948,25],"bytes":[94476,94486]},"callee":null},"2954:22":{"kind":"call","span":{"start":[2954,22],"end":[2954,71],"bytes":[94636,94685]},"callee":null},"2954:4":{"kind":"call","span":{"start":[2954,4],"end":[2954,72],"bytes":[94618,94686]},"callee":null},"2958:13":{"kind":"call","span":{"start":[2958,13],"end":[2958,66],"bytes":[94714,94767]},"callee":null},"2959:22":{"kind":"call","span":{"start":[2959,22],"end":[2959,63],"bytes":[94803,94844]},"callee":null},"2959:4":{"kind":"call","span":{"start":[2959,4],"end":[2959,64],"bytes":[94785,94845]},"callee":null},"2963:13":{"kind":"call","span":{"start":[2963,13],"end":[2963,24],"bytes":[94873,94884]},"callee":null},"2964:22":{"kind":"call","span":{"start":[2964,22],"end":[2964,71],"bytes":[94920,94969]},"callee":null},"2964:4":{"kind":"call","span":{"start":[2964,4],"end":[2964,72],"bytes":[94902,94970]},"callee":null},"2967:7":{"kind":"call","span":{"start":[2967,7],"end":[2967,17],"bytes":[94991,95001]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.snapshotWALEndOffset":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","kind":"method","span":{"start":[2838,1],"end":[2874,2],"bytes":[91069,92364]},"signature":"github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","parameters":[{"name":"pos","type":"github.com/superfly/ltx.Pos","span":{"start":[2838,1],"end":[2838,65],"bytes":[91069,91133]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"2846:13":{"kind":"call","span":{"start":[2846,13],"end":[2846,46],"bytes":[91291,91324]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"2847:12":{"kind":"call","span":{"start":[2847,12],"end":[2847,28],"bytes":[91336,91352]},"callee":null},"2849:13":{"kind":"call","span":{"start":[2849,13],"end":[2849,85],"bytes":[91382,91454]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2849:45":{"kind":"call","span":{"start":[2849,45],"end":[2849,61],"bytes":[91414,91430]},"callee":null},"2849:63":{"kind":"call","span":{"start":[2849,63],"end":[2849,79],"bytes":[91432,91448]},"callee":null},"2851:8":{"kind":"call","span":{"start":[2851,8],"end":[2851,34],"bytes":[91465,91491]},"callee":null},"2853:9":{"kind":"call","span":{"start":[2853,9],"end":[2853,26],"bytes":[91501,91518]},"callee":null},"2854:12":{"kind":"call","span":{"start":[2854,12],"end":[2854,30],"bytes":[91530,91548]},"callee":null},"2855:13":{"kind":"call","span":{"start":[2855,13],"end":[2855,126],"bytes":[91575,91688]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2855:47":{"kind":"call","span":{"start":[2855,47],"end":[2855,63],"bytes":[91609,91625]},"callee":null},"2855:65":{"kind":"call","span":{"start":[2855,65],"end":[2855,81],"bytes":[91627,91643]},"callee":null},"2855:83":{"kind":"call","span":{"start":[2855,83],"end":[2855,125],"bytes":[91645,91687]},"callee":null},"2861:14":{"kind":"call","span":{"start":[2861,14],"end":[2861,41],"bytes":[91882,91909]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"2861:28":{"kind":"call","span":{"start":[2861,28],"end":[2861,40],"bytes":[91896,91908]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2862:27":{"kind":"call","span":{"start":[2862,27],"end":[2862,49],"bytes":[91936,91958]},"callee":null},"2862:5":{"kind":"call","span":{"start":[2862,5],"end":[2862,23],"bytes":[91914,91932]},"callee":null},"2862:53":{"kind":"call","span":{"start":[2862,53],"end":[2862,88],"bytes":[91962,91997]},"callee":null},"2865:13":{"kind":"call","span":{"start":[2865,13],"end":[2865,58],"bytes":[92064,92109]},"callee":null},"2867:11":{"kind":"call","span":{"start":[2867,11],"end":[2867,44],"bytes":[92123,92156]},"callee":null},"2868:11":{"kind":"call","span":{"start":[2868,11],"end":[2868,44],"bytes":[92167,92200]},"callee":null},"2869:14":{"kind":"call","span":{"start":[2869,14],"end":[2869,26],"bytes":[92214,92226]},"callee":null},"2869:48":{"kind":"call","span":{"start":[2869,48],"end":[2869,60],"bytes":[92248,92260]},"callee":null},"2873:34":{"kind":"call","span":{"start":[2873,34],"end":[2873,46],"bytes":[92337,92349]},"callee":null},"2873:9":{"kind":"call","span":{"start":[2873,9],"end":[2873,21],"bytes":[92312,92324]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset.closure_1","kind":"function","span":{"start":[2851,1],"end":[2851,34],"bytes":[91458,91491]},"signature":"github.com/benbjohnson/litestream.DB.snapshotWALEndOffset.closure_1","parameters":[],"body":{"2851:21":{"kind":"call","span":{"start":[2851,21],"end":[2851,30],"bytes":[91478,91487]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.sync":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","kind":"method","span":{"start":[2072,1],"end":[2360,2],"bytes":[66720,75776]},"signature":"github.com/benbjohnson/litestream.DB.sync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}},{"name":"checkpointing","type":"bool","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}},{"name":"info","type":"github.com/benbjohnson/litestream.syncInfo","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}},{"name":"maxSyncWALBytes","type":"int64","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":40},"body":{"2081:2":{"kind":"call","span":{"start":[2081,2],"end":[2086,5],"bytes":[67119,67269]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2088:14":{"kind":"call","span":{"start":[2088,14],"end":[2088,39],"bytes":[67284,67309]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"2091:11":{"kind":"call","span":{"start":[2091,11],"end":[2091,24],"bytes":[67340,67353]},"callee":null},"2095:13":{"kind":"call","span":{"start":[2095,13],"end":[2095,45],"bytes":[67415,67447]},"callee":null},"2098:13":{"kind":"call","span":{"start":[2098,13],"end":[2098,44],"bytes":[67487,67518]},"callee":null},"2101:13":{"kind":"call","span":{"start":[2101,13],"end":[2101,51],"bytes":[67558,67596]},"callee":null},"2103:2":{"kind":"call","span":{"start":[2103,2],"end":[2103,37],"bytes":[67601,67636]},"callee":null},"2107:3":{"kind":"call","span":{"start":[2107,3],"end":[2107,19],"bytes":[67742,67758]},"callee":null},"2108:9":{"kind":"call","span":{"start":[2108,9],"end":[2108,27],"bytes":[67767,67785]},"callee":null},"2111:13":{"kind":"call","span":{"start":[2111,13],"end":[2111,24],"bytes":[67802,67813]},"callee":null},"2115:10":{"kind":"call","span":{"start":[2115,10],"end":[2115,19],"bytes":[67864,67873]},"callee":null},"2116:12":{"kind":"call","span":{"start":[2116,12],"end":[2116,50],"bytes":[67885,67923]},"callee":null},"2116:19":{"kind":"call","span":{"start":[2116,19],"end":[2116,28],"bytes":[67892,67901]},"callee":null},"2116:31":{"kind":"call","span":{"start":[2116,31],"end":[2116,49],"bytes":[67904,67922]},"callee":null},"2118:18":{"kind":"call","span":{"start":[2118,18],"end":[2118,39],"bytes":[67942,67963]},"callee":null},"2118:26":{"kind":"call","span":{"start":[2118,26],"end":[2118,38],"bytes":[67950,67962]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2122:8":{"kind":"call","span":{"start":[2122,8],"end":[2122,23],"bytes":[68012,68027]},"callee":null},"2124:21":{"kind":"call","span":{"start":[2124,21],"end":[2124,75],"bytes":[68049,68103]},"callee":null},"2127:16":{"kind":"call","span":{"start":[2127,16],"end":[2127,54],"bytes":[68173,68211]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader"},"2128:19":{"kind":"call","span":{"start":[2128,19],"end":[2128,56],"bytes":[68244,68281]},"callee":null},"2133:108":{"kind":"call","span":{"start":[2133,108],"end":[2133,133],"bytes":[68486,68511]},"callee":null},"2133:16":{"kind":"call","span":{"start":[2133,16],"end":[2133,106],"bytes":[68394,68484]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset"},"2134:4":{"kind":"call","span":{"start":[2134,4],"end":[2134,101],"bytes":[68517,68614]},"callee":null},"2136:17":{"kind":"call","span":{"start":[2136,17],"end":[2136,55],"bytes":[68662,68700]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader"},"2137:20":{"kind":"call","span":{"start":[2137,20],"end":[2137,61],"bytes":[68734,68775]},"callee":null},"2140:19":{"kind":"call","span":{"start":[2140,19],"end":[2140,68],"bytes":[68824,68873]},"callee":null},"2145:2":{"kind":"call","span":{"start":[2145,2],"end":[2150,5],"bytes":[68953,69103]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2154:49":{"kind":"call","span":{"start":[2154,49],"end":[2154,81],"bytes":[69201,69233]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap"},"2156:18":{"kind":"call","span":{"start":[2156,18],"end":[2156,49],"bytes":[69268,69299]},"callee":null},"2166:18":{"kind":"call","span":{"start":[2166,18],"end":[2166,123],"bytes":[69458,69563]},"callee":null},"2166:2":{"kind":"call","span":{"start":[2166,2],"end":[2166,124],"bytes":[69442,69564]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert"},"2167:2":{"kind":"call","span":{"start":[2167,2],"end":[2173,5],"bytes":[69566,69737]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2177:3":{"kind":"call","span":{"start":[2177,3],"end":[2177,43],"bytes":[69788,69828]},"callee":null},"2177:31":{"kind":"call","span":{"start":[2177,31],"end":[2177,42],"bytes":[69816,69827]},"callee":null},"2182:3":{"kind":"call","span":{"start":[2182,3],"end":[2182,86],"bytes":[69936,70019]},"callee":null},"2187:12":{"kind":"call","span":{"start":[2187,12],"end":[2187,68],"bytes":[70090,70146]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"2187:30":{"kind":"call","span":{"start":[2187,30],"end":[2187,55],"bytes":[70108,70133]},"callee":null},"2188:6":{"kind":"call","span":{"start":[2188,6],"end":[2188,26],"bytes":[70166,70186]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2189:19":{"kind":"call","span":{"start":[2189,19],"end":[2189,129],"bytes":[70207,70317]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2189:62":{"kind":"call","span":{"start":[2189,62],"end":[2189,74],"bytes":[70250,70262]},"callee":null},"2189:76":{"kind":"call","span":{"start":[2189,76],"end":[2189,88],"bytes":[70264,70276]},"callee":null},"2189:90":{"kind":"call","span":{"start":[2189,90],"end":[2189,128],"bytes":[70278,70316]},"callee":null},"2194:18":{"kind":"call","span":{"start":[2194,18],"end":[2194,85],"bytes":[70364,70431]},"callee":null},"2196:6":{"kind":"call","span":{"start":[2196,6],"end":[2196,26],"bytes":[70454,70474]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2197:19":{"kind":"call","span":{"start":[2197,19],"end":[2197,128],"bytes":[70495,70604]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2197:61":{"kind":"call","span":{"start":[2197,61],"end":[2197,73],"bytes":[70537,70549]},"callee":null},"2197:75":{"kind":"call","span":{"start":[2197,75],"end":[2197,87],"bytes":[70551,70563]},"callee":null},"2197:89":{"kind":"call","span":{"start":[2197,89],"end":[2197,127],"bytes":[70565,70603]},"callee":null},"2199:18":{"kind":"call","span":{"start":[2199,18],"end":[2199,59],"bytes":[70626,70667]},"callee":null},"2201:8":{"kind":"call","span":{"start":[2201,8],"end":[2201,47],"bytes":[70678,70717]},"callee":null},"2202:8":{"kind":"call","span":{"start":[2202,8],"end":[2202,40],"bytes":[70725,70757]},"callee":null},"2204:14":{"kind":"call","span":{"start":[2204,14],"end":[2204,44],"bytes":[70772,70802]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo"},"2205:6":{"kind":"call","span":{"start":[2205,6],"end":[2205,37],"bytes":[70808,70839]},"callee":null},"2207:2":{"kind":"call","span":{"start":[2207,2],"end":[2213,21],"bytes":[70842,71030]},"callee":null},"2208:11":{"kind":"call","span":{"start":[2208,11],"end":[2208,24],"bytes":[70909,70922]},"callee":null},"2215:15":{"kind":"call","span":{"start":[2215,15],"end":[2215,25],"bytes":[71046,71056]},"callee":null},"2216:14":{"kind":"call","span":{"start":[2216,14],"end":[2216,37],"bytes":[71070,71093]},"callee":null},"2218:18":{"kind":"call","span":{"start":[2218,18],"end":[2218,56],"bytes":[71128,71166]},"callee":null},"2220:12":{"kind":"call","span":{"start":[2220,12],"end":[2232,4],"bytes":[71181,71496]},"callee":null},"2223:14":{"kind":"call","span":{"start":[2223,14],"end":[2223,33],"bytes":[71288,71307]},"callee":null},"2227:14":{"kind":"call","span":{"start":[2227,14],"end":[2227,35],"bytes":[71381,71402]},"callee":null},"2233:6":{"kind":"call","span":{"start":[2233,6],"end":[2233,26],"bytes":[71516,71536]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2234:19":{"kind":"call","span":{"start":[2234,19],"end":[2234,129],"bytes":[71557,71667]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2234:62":{"kind":"call","span":{"start":[2234,62],"end":[2234,74],"bytes":[71600,71612]},"callee":null},"2234:76":{"kind":"call","span":{"start":[2234,76],"end":[2234,88],"bytes":[71614,71626]},"callee":null},"2234:90":{"kind":"call","span":{"start":[2234,90],"end":[2234,128],"bytes":[71628,71666]},"callee":null},"2236:18":{"kind":"call","span":{"start":[2236,18],"end":[2236,58],"bytes":[71689,71729]},"callee":null},"2242:3":{"kind":"call","span":{"start":[2242,3],"end":[2248,6],"bytes":[71880,72044]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2249:13":{"kind":"call","span":{"start":[2249,13],"end":[2249,66],"bytes":[72057,72110]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB"},"2250:7":{"kind":"call","span":{"start":[2250,7],"end":[2250,27],"bytes":[72131,72151]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2251:20":{"kind":"call","span":{"start":[2251,20],"end":[2251,130],"bytes":[72173,72283]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2251:63":{"kind":"call","span":{"start":[2251,63],"end":[2251,75],"bytes":[72216,72228]},"callee":null},"2251:77":{"kind":"call","span":{"start":[2251,77],"end":[2251,89],"bytes":[72230,72242]},"callee":null},"2251:91":{"kind":"call","span":{"start":[2251,91],"end":[2251,129],"bytes":[72244,72282]},"callee":null},"2253:19":{"kind":"call","span":{"start":[2253,19],"end":[2253,59],"bytes":[72307,72347]},"callee":null},"2256:3":{"kind":"call","span":{"start":[2256,3],"end":[2262,6],"bytes":[72364,72530]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2263:13":{"kind":"call","span":{"start":[2263,13],"end":[2263,84],"bytes":[72543,72614]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL"},"2264:7":{"kind":"call","span":{"start":[2264,7],"end":[2264,27],"bytes":[72635,72655]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2265:20":{"kind":"call","span":{"start":[2265,20],"end":[2265,130],"bytes":[72677,72787]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2265:63":{"kind":"call","span":{"start":[2265,63],"end":[2265,75],"bytes":[72720,72732]},"callee":null},"2265:77":{"kind":"call","span":{"start":[2265,77],"end":[2265,89],"bytes":[72734,72746]},"callee":null},"2265:91":{"kind":"call","span":{"start":[2265,91],"end":[2265,129],"bytes":[72748,72786]},"callee":null},"2267:19":{"kind":"call","span":{"start":[2267,19],"end":[2267,60],"bytes":[72811,72852]},"callee":null},"2272:2":{"kind":"call","span":{"start":[2272,2],"end":[2275,4],"bytes":[72915,73011]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2276:12":{"kind":"call","span":{"start":[2276,12],"end":[2276,23],"bytes":[73023,73034]},"callee":null},"2277:6":{"kind":"call","span":{"start":[2277,6],"end":[2277,26],"bytes":[73054,73074]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2278:19":{"kind":"call","span":{"start":[2278,19],"end":[2278,129],"bytes":[73095,73205]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2278:62":{"kind":"call","span":{"start":[2278,62],"end":[2278,74],"bytes":[73138,73150]},"callee":null},"2278:76":{"kind":"call","span":{"start":[2278,76],"end":[2278,88],"bytes":[73152,73164]},"callee":null},"2278:90":{"kind":"call","span":{"start":[2278,90],"end":[2278,128],"bytes":[73166,73204]},"callee":null},"2280:18":{"kind":"call","span":{"start":[2280,18],"end":[2280,58],"bytes":[73227,73267]},"callee":null},"2284:2":{"kind":"call","span":{"start":[2284,2],"end":[2287,4],"bytes":[73300,73396]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2288:12":{"kind":"call","span":{"start":[2288,12],"end":[2288,26],"bytes":[73408,73422]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Sync"},"2289:6":{"kind":"call","span":{"start":[2289,6],"end":[2289,26],"bytes":[73442,73462]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2290:19":{"kind":"call","span":{"start":[2290,19],"end":[2290,128],"bytes":[73483,73592]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2290:61":{"kind":"call","span":{"start":[2290,61],"end":[2290,73],"bytes":[73525,73537]},"callee":null},"2290:75":{"kind":"call","span":{"start":[2290,75],"end":[2290,87],"bytes":[73539,73551]},"callee":null},"2290:89":{"kind":"call","span":{"start":[2290,89],"end":[2290,127],"bytes":[73553,73591]},"callee":null},"2292:18":{"kind":"call","span":{"start":[2292,18],"end":[2292,54],"bytes":[73614,73650]},"callee":null},"2294:12":{"kind":"call","span":{"start":[2294,12],"end":[2294,27],"bytes":[73665,73680]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Close"},"2295:6":{"kind":"call","span":{"start":[2295,6],"end":[2295,26],"bytes":[73700,73720]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2296:19":{"kind":"call","span":{"start":[2296,19],"end":[2296,129],"bytes":[73741,73851]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2296:62":{"kind":"call","span":{"start":[2296,62],"end":[2296,74],"bytes":[73784,73796]},"callee":null},"2296:76":{"kind":"call","span":{"start":[2296,76],"end":[2296,88],"bytes":[73798,73810]},"callee":null},"2296:90":{"kind":"call","span":{"start":[2296,90],"end":[2296,128],"bytes":[73812,73850]},"callee":null},"2298:18":{"kind":"call","span":{"start":[2298,18],"end":[2298,55],"bytes":[73873,73910]},"callee":null},"2302:2":{"kind":"call","span":{"start":[2302,2],"end":[2305,4],"bytes":[73958,74055]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2306:12":{"kind":"call","span":{"start":[2306,12],"end":[2306,44],"bytes":[74067,74099]},"callee":null},"2307:3":{"kind":"call","span":{"start":[2307,3],"end":[2307,28],"bytes":[74116,74141]},"callee":null},"2308:3":{"kind":"call","span":{"start":[2308,3],"end":[2308,34],"bytes":[74144,74175]},"callee":null},"2309:3":{"kind":"call","span":{"start":[2309,3],"end":[2309,30],"bytes":[74213,74240]},"callee":null},"2310:3":{"kind":"call","span":{"start":[2310,3],"end":[2310,26],"bytes":[74243,74266]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"2311:18":{"kind":"call","span":{"start":[2311,18],"end":[2311,56],"bytes":[74284,74322]},"callee":null},"2313:12":{"kind":"call","span":{"start":[2313,12],"end":[2313,53],"bytes":[74337,74378]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"2313:30":{"kind":"call","span":{"start":[2313,30],"end":[2313,52],"bytes":[74355,74377]},"callee":null},"2314:3":{"kind":"call","span":{"start":[2314,3],"end":[2314,28],"bytes":[74395,74420]},"callee":null},"2315:3":{"kind":"call","span":{"start":[2315,3],"end":[2315,34],"bytes":[74423,74454]},"callee":null},"2316:3":{"kind":"call","span":{"start":[2316,3],"end":[2316,30],"bytes":[74492,74519]},"callee":null},"2317:3":{"kind":"call","span":{"start":[2317,3],"end":[2317,26],"bytes":[74522,74545]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"2318:18":{"kind":"call","span":{"start":[2318,18],"end":[2318,53],"bytes":[74563,74598]},"callee":null},"2326:14":{"kind":"call","span":{"start":[2326,14],"end":[2326,24],"bytes":[74728,74738]},"callee":null},"2327:14":{"kind":"call","span":{"start":[2327,14],"end":[2327,21],"bytes":[74753,74760]},"callee":null},"2330:12":{"kind":"call","span":{"start":[2330,12],"end":[2330,30],"bytes":[74777,74795]},"callee":null},"2343:21":{"kind":"call","span":{"start":[2343,21],"end":[2343,37],"bytes":[75374,75390]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize"},"2348:2":{"kind":"call","span":{"start":[2348,2],"end":[2355,5],"bytes":[75500,75708]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2357:2":{"kind":"call","span":{"start":[2357,2],"end":[2357,44],"bytes":[75711,75753]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_1","kind":"function","span":{"start":[2082,1],"end":[2086,5],"bytes":[67161,67269]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_1","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2082,1],"end":[2082,23],"bytes":[67161,67183]}}],"body":{}},"closure_10":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_10","kind":"function","span":{"start":[2302,1],"end":[2305,4],"bytes":[73957,74055]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_10","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2302,1],"end":[2302,62],"bytes":[73957,74018]}}],"body":{}},"closure_11":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_11","kind":"function","span":{"start":[2349,1],"end":[2355,5],"bytes":[75543,75708]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_11","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2349,1],"end":[2349,23],"bytes":[75543,75565]}}],"body":{}},"closure_2":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_2","kind":"function","span":{"start":[2146,1],"end":[2150,5],"bytes":[68995,69103]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_2","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2146,1],"end":[2146,23],"bytes":[68995,69017]}}],"body":{}},"closure_3":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_3","kind":"function","span":{"start":[2168,1],"end":[2173,5],"bytes":[69611,69737]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_3","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2168,1],"end":[2168,23],"bytes":[69611,69633]}}],"body":{}},"closure_4":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_4","kind":"function","span":{"start":[2201,1],"end":[2201,47],"bytes":[70671,70717]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_4","parameters":[],"body":{"2201:21":{"kind":"call","span":{"start":[2201,21],"end":[2201,43],"bytes":[70691,70713]},"callee":null}}},"closure_5":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_5","kind":"function","span":{"start":[2202,1],"end":[2202,40],"bytes":[70718,70757]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_5","parameters":[],"body":{"2202:21":{"kind":"call","span":{"start":[2202,21],"end":[2202,36],"bytes":[70738,70753]},"callee":null}}},"closure_6":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_6","kind":"function","span":{"start":[2243,1],"end":[2248,6],"bytes":[71925,72044]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_6","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2243,1],"end":[2243,24],"bytes":[71925,71948]}}],"body":{}},"closure_7":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_7","kind":"function","span":{"start":[2257,1],"end":[2262,6],"bytes":[72410,72530]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_7","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2257,1],"end":[2257,24],"bytes":[72410,72433]}}],"body":{}},"closure_8":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_8","kind":"function","span":{"start":[2272,1],"end":[2275,4],"bytes":[72914,73011]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_8","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2272,1],"end":[2272,61],"bytes":[72914,72974]}}],"body":{}},"closure_9":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_9","kind":"function","span":{"start":[2284,1],"end":[2287,4],"bytes":[73299,73396]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_9","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2284,1],"end":[2284,61],"bytes":[73299,73359]}}],"body":{}}}},"github.com/benbjohnson/litestream.DB.syncLocked":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","kind":"method","span":{"start":[1331,1],"end":[1410,2],"bytes":[42342,44853]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1331,1],"end":[1331,102],"bytes":[42342,42443]}},{"name":"maxSyncWALBytes","type":"int64","span":{"start":[1331,1],"end":[1331,102],"bytes":[42342,42443]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1332:2":{"kind":"call","span":{"start":[1332,2],"end":[1332,30],"bytes":[42445,42473]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag"},"1333:8":{"kind":"call","span":{"start":[1333,8],"end":[1333,43],"bytes":[42481,42516]},"callee":null},"1336:7":{"kind":"call","span":{"start":[1336,7],"end":[1336,17],"bytes":[42554,42564]},"callee":null},"1337:8":{"kind":"call","span":{"start":[1337,8],"end":[1348,5],"bytes":[42572,42819]},"callee":null},"1350:15":{"kind":"call","span":{"start":[1350,15],"end":[1350,38],"bytes":[42835,42858]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor"},"1354:3":{"kind":"call","span":{"start":[1354,3],"end":[1354,45],"bytes":[42924,42966]},"callee":null},"1357:8":{"kind":"call","span":{"start":[1357,8],"end":[1357,40],"bytes":[42998,43030]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor"},"1360:2":{"kind":"call","span":{"start":[1360,2],"end":[1362,4],"bytes":[43078,43199]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1363:12":{"kind":"call","span":{"start":[1363,12],"end":[1363,35],"bytes":[43211,43234]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists"},"1364:18":{"kind":"call","span":{"start":[1364,18],"end":[1364,58],"bytes":[43266,43306]},"callee":null},"1367:2":{"kind":"call","span":{"start":[1367,2],"end":[1369,4],"bytes":[43312,43409]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1370:16":{"kind":"call","span":{"start":[1370,16],"end":[1370,79],"bytes":[43425,43488]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"1374:2":{"kind":"call","span":{"start":[1374,2],"end":[1374,30],"bytes":[43531,43559]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"1385:49":{"kind":"call","span":{"start":[1385,49],"end":[1385,96],"bytes":[44031,44078]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1386:3":{"kind":"call","span":{"start":[1386,3],"end":[1389,5],"bytes":[44083,44241]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1390:13":{"kind":"call","span":{"start":[1390,13],"end":[1390,84],"bytes":[44254,44325]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded"},"1391:19":{"kind":"call","span":{"start":[1391,19],"end":[1391,52],"bytes":[44358,44391]},"callee":null},"1395:2":{"kind":"call","span":{"start":[1395,2],"end":[1398,4],"bytes":[44401,44551]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1401:19":{"kind":"call","span":{"start":[1401,19],"end":[1401,41],"bytes":[44624,44646]},"callee":null},"1401:2":{"kind":"call","span":{"start":[1401,2],"end":[1401,42],"bytes":[44607,44647]},"callee":null},"1404:16":{"kind":"call","span":{"start":[1404,16],"end":[1404,32],"bytes":[44694,44710]},"callee":null},"1405:22":{"kind":"call","span":{"start":[1405,22],"end":[1405,40],"bytes":[44746,44764]},"callee":null},"1405:3":{"kind":"call","span":{"start":[1405,3],"end":[1405,41],"bytes":[44727,44765]},"callee":null},"1405:30":{"kind":"call","span":{"start":[1405,30],"end":[1405,39],"bytes":[44754,44763]},"callee":null},"1407:2":{"kind":"call","span":{"start":[1407,2],"end":[1407,62],"bytes":[44770,44830]},"callee":null},"1407:22":{"kind":"call","span":{"start":[1407,22],"end":[1407,61],"bytes":[44790,44829]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_1","kind":"function","span":{"start":[1333,1],"end":[1333,43],"bytes":[42474,42516]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_1","parameters":[],"body":{"1333:17":{"kind":"call","span":{"start":[1333,17],"end":[1333,39],"bytes":[42490,42512]},"callee":null}}},"closure_2":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2","kind":"function","span":{"start":[1337,1],"end":[1348,5],"bytes":[42565,42819]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_2","parameters":[],"body":{"1338:3":{"kind":"call","span":{"start":[1338,3],"end":[1338,24],"bytes":[42583,42604]},"callee":null},"1340:4":{"kind":"call","span":{"start":[1340,4],"end":[1340,30],"bytes":[42626,42652]},"callee":null},"1342:6":{"kind":"call","span":{"start":[1342,6],"end":[1342,26],"bytes":[42662,42682]},"callee":null},"1343:4":{"kind":"call","span":{"start":[1343,4],"end":[1343,27],"bytes":[42688,42711]},"callee":null},"1345:4":{"kind":"call","span":{"start":[1345,4],"end":[1345,27],"bytes":[42726,42749]},"callee":null},"1347:3":{"kind":"call","span":{"start":[1347,3],"end":[1347,61],"bytes":[42756,42814]},"callee":null},"1347:47":{"kind":"call","span":{"start":[1347,47],"end":[1347,60],"bytes":[42800,42813]},"callee":null}}},"closure_3":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_3","kind":"function","span":{"start":[1360,1],"end":[1362,4],"bytes":[43077,43199]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_3","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1360,1],"end":[1360,62],"bytes":[43077,43138]}}],"body":{}},"closure_4":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_4","kind":"function","span":{"start":[1367,1],"end":[1369,4],"bytes":[43311,43409]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_4","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1367,1],"end":[1367,66],"bytes":[43311,43376]}}],"body":{}},"closure_5":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_5","kind":"function","span":{"start":[1386,1],"end":[1389,5],"bytes":[44081,44241]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_5","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1386,1],"end":[1386,72],"bytes":[44081,44152]}}],"body":{}},"closure_6":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_6","kind":"function","span":{"start":[1395,1],"end":[1398,4],"bytes":[44400,44551]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_6","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1395,1],"end":[1395,66],"bytes":[44400,44465]}}],"body":{}}}},"github.com/benbjohnson/litestream.DB.syncOnce":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce","kind":"method","span":{"start":[1301,1],"end":[1308,2],"bytes":[41559,41795]},"signature":"github.com/benbjohnson/litestream.DB.syncOnce","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1301,1],"end":[1301,89],"bytes":[41559,41647]}},{"name":"maxSyncWALBytes","type":"int64","span":{"start":[1301,1],"end":[1301,89],"bytes":[41559,41647]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1302:12":{"kind":"call","span":{"start":[1302,12],"end":[1302,28],"bytes":[41659,41675]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec"},"1305:8":{"kind":"call","span":{"start":[1305,8],"end":[1305,29],"bytes":[41727,41748]},"callee":null},"1307:9":{"kind":"call","span":{"start":[1307,9],"end":[1307,44],"bytes":[41758,41793]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked"}}},"github.com/benbjohnson/litestream.DB.syncReplicaWithRetry":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","kind":"method","span":{"start":[944,1],"end":[1057,2],"bytes":[31215,34369]},"signature":"github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[944,1],"end":[944,64],"bytes":[31215,31278]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":24},"body":{"1002:13":{"kind":"call","span":{"start":[1002,13],"end":[1002,37],"bytes":[32598,32622]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync"},"1004:5":{"kind":"call","span":{"start":[1004,5],"end":[1006,40],"bytes":[32661,32780]},"callee":null},"1006:18":{"kind":"call","span":{"start":[1006,18],"end":[1006,39],"bytes":[32758,32779]},"callee":null},"1015:10":{"kind":"call","span":{"start":[1015,10],"end":[1015,28],"bytes":[32916,32934]},"callee":null},"1016:4":{"kind":"call","span":{"start":[1016,4],"end":[1019,22],"bytes":[32939,33078]},"callee":null},"1018:17":{"kind":"call","span":{"start":[1018,17],"end":[1018,38],"bytes":[33034,33055]},"callee":null},"1020:11":{"kind":"call","span":{"start":[1020,11],"end":[1020,86],"bytes":[33089,33164]},"callee":null},"1022:4":{"kind":"call","span":{"start":[1022,4],"end":[1025,22],"bytes":[33186,33325]},"callee":null},"1024:17":{"kind":"call","span":{"start":[1024,17],"end":[1024,38],"bytes":[33281,33302]},"callee":null},"1026:11":{"kind":"call","span":{"start":[1026,11],"end":[1026,79],"bytes":[33336,33404]},"callee":null},"1032:4":{"kind":"call","span":{"start":[1032,4],"end":[1036,53],"bytes":[33508,33723]},"callee":null},"1035:16":{"kind":"call","span":{"start":[1035,16],"end":[1035,37],"bytes":[33648,33669]},"callee":null},"1036:18":{"kind":"call","span":{"start":[1036,18],"end":[1036,52],"bytes":[33688,33722]},"callee":null},"1036:29":{"kind":"call","span":{"start":[1036,29],"end":[1036,51],"bytes":[33699,33721]},"callee":null},"1038:4":{"kind":"call","span":{"start":[1038,4],"end":[1042,53],"bytes":[33738,33924]},"callee":null},"1041:16":{"kind":"call","span":{"start":[1041,16],"end":[1041,37],"bytes":[33849,33870]},"callee":null},"1042:18":{"kind":"call","span":{"start":[1042,18],"end":[1042,52],"bytes":[33889,33923]},"callee":null},"1042:29":{"kind":"call","span":{"start":[1042,29],"end":[1042,51],"bytes":[33900,33922]},"callee":null},"1047:10":{"kind":"call","span":{"start":[1047,10],"end":[1047,30],"bytes":[34006,34026]},"callee":null},"1048:10":{"kind":"call","span":{"start":[1048,10],"end":[1048,28],"bytes":[34037,34055]},"callee":null},"1049:11":{"kind":"call","span":{"start":[1049,11],"end":[1049,86],"bytes":[34067,34142]},"callee":null},"1051:4":{"kind":"call","span":{"start":[1051,4],"end":[1053,39],"bytes":[34164,34281]},"callee":null},"1053:17":{"kind":"call","span":{"start":[1053,17],"end":[1053,38],"bytes":[34259,34280]},"callee":null},"1054:11":{"kind":"call","span":{"start":[1054,11],"end":[1054,79],"bytes":[34292,34360]},"callee":null},"954:10":{"kind":"call","span":{"start":[954,10],"end":[954,30],"bytes":[31470,31490]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync"},"963:33":{"kind":"call","span":{"start":[963,33],"end":[963,66],"bytes":[31682,31715]},"callee":null},"964:8":{"kind":"call","span":{"start":[964,8],"end":[964,24],"bytes":[31723,31739]},"callee":null},"971:25":{"kind":"call","span":{"start":[971,25],"end":[971,56],"bytes":[31989,32020]},"callee":null},"972:6":{"kind":"call","span":{"start":[972,6],"end":[979,6],"bytes":[32026,32140]},"callee":null,"is_goroutine":true},"984:15":{"kind":"call","span":{"start":[984,15],"end":[984,25],"bytes":[32192,32202]},"callee":null},"991:5":{"kind":"call","span":{"start":[991,5],"end":[993,40],"bytes":[32328,32456]},"callee":null},"993:18":{"kind":"call","span":{"start":[993,18],"end":[993,39],"bytes":[32434,32455]},"callee":null},"994:12":{"kind":"call","span":{"start":[994,12],"end":[994,80],"bytes":[32468,32536]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry.closure_1","kind":"function","span":{"start":[972,1],"end":[979,6],"bytes":[32021,32140]},"signature":"github.com/benbjohnson/litestream.DB.syncReplicaWithRetry.closure_1","parameters":[],"body":{"975:5":{"kind":"call","span":{"start":[975,5],"end":[975,17],"bytes":[32070,32082]},"callee":null},"976:11":{"kind":"call","span":{"start":[976,11],"end":[976,29],"bytes":[32093,32111]},"callee":null},"977:5":{"kind":"call","span":{"start":[977,5],"end":[977,17],"bytes":[32117,32129]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.verify":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify","kind":"method","span":{"start":[1741,1],"end":[1751,2],"bytes":[56519,56779]},"signature":"github.com/benbjohnson/litestream.DB.verify","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1741,1],"end":[1741,89],"bytes":[56519,56607]}},{"name":"state","type":"*github.com/benbjohnson/litestream.syncState","span":{"start":[1741,1],"end":[1741,89],"bytes":[56519,56607]}}],"return_type":"(github.com/benbjohnson/litestream.syncInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1742:14":{"kind":"call","span":{"start":[1742,14],"end":[1742,22],"bytes":[56621,56629]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"1744:16":{"kind":"call","span":{"start":[1744,16],"end":[1744,42],"bytes":[56662,56688]},"callee":null},"1747:9":{"kind":"call","span":{"start":[1747,9],"end":[1750,4],"bytes":[56701,56777]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor"}}},"github.com/benbjohnson/litestream.DB.verifyAndSync":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync","kind":"method","span":{"start":[1412,1],"end":[1422,2],"bytes":[44855,45168]},"signature":"github.com/benbjohnson/litestream.DB.verifyAndSync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1412,1],"end":[1412,109],"bytes":[44855,44963]}},{"name":"checkpointing","type":"bool","span":{"start":[1412,1],"end":[1412,109],"bytes":[44855,44963]}},{"name":"state","type":"*github.com/benbjohnson/litestream.syncState","span":{"start":[1412,1],"end":[1412,109],"bytes":[44855,44963]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1413:14":{"kind":"call","span":{"start":[1413,14],"end":[1413,22],"bytes":[44977,44985]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"1415:24":{"kind":"call","span":{"start":[1415,24],"end":[1415,50],"bytes":[45026,45052]},"callee":null},"1418:9":{"kind":"call","span":{"start":[1418,9],"end":[1421,7],"bytes":[45065,45166]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"}}},"github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","kind":"method","span":{"start":[1424,1],"end":[1465,2],"bytes":[45170,46694]},"signature":"github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1424,1],"end":[1424,146],"bytes":[45170,45315]}},{"name":"checkpointing","type":"bool","span":{"start":[1424,1],"end":[1424,146],"bytes":[45170,45315]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[1424,1],"end":[1424,146],"bytes":[45170,45315]}},{"name":"maxSyncWALBytes","type":"int64","span":{"start":[1424,1],"end":[1424,146],"bytes":[45170,45315]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"1425:2":{"kind":"call","span":{"start":[1425,2],"end":[1428,4],"bytes":[45317,45465]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1437:22":{"kind":"call","span":{"start":[1437,22],"end":[1437,38],"bytes":[45823,45839]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize"},"1439:25":{"kind":"call","span":{"start":[1439,25],"end":[1439,68],"bytes":[45882,45925]},"callee":null},"1446:2":{"kind":"call","span":{"start":[1446,2],"end":[1446,38],"bytes":[46107,46143]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1447:15":{"kind":"call","span":{"start":[1447,15],"end":[1447,47],"bytes":[46158,46190]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor"},"1449:24":{"kind":"call","span":{"start":[1449,24],"end":[1449,70],"bytes":[46231,46277]},"callee":null},"1452:2":{"kind":"call","span":{"start":[1452,2],"end":[1457,4],"bytes":[46283,46493]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1458:17":{"kind":"call","span":{"start":[1458,17],"end":[1458,73],"bytes":[46510,46566]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync"},"1460:24":{"kind":"call","span":{"start":[1460,24],"end":[1460,51],"bytes":[46607,46634]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor.closure_1","kind":"function","span":{"start":[1425,1],"end":[1428,4],"bytes":[45316,45465]},"signature":"github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor.closure_1","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1425,1],"end":[1425,60],"bytes":[45316,45375]}}],"body":{}},"closure_2":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor.closure_2","kind":"function","span":{"start":[1452,1],"end":[1457,4],"bytes":[46282,46493]},"signature":"github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor.closure_2","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1452,1],"end":[1452,60],"bytes":[46282,46341]}}],"body":{}}}},"github.com/benbjohnson/litestream.DB.verifyWithExecutor":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","kind":"method","span":{"start":[1753,1],"end":[1896,2],"bytes":[56781,62028]},"signature":"github.com/benbjohnson/litestream.DB.verifyWithExecutor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1753,1],"end":[1753,103],"bytes":[56781,56883]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[1753,1],"end":[1753,103],"bytes":[56781,56883]}}],"return_type":"(github.com/benbjohnson/litestream.syncInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":20},"body":{"1754:15":{"kind":"call","span":{"start":[1754,15],"end":[1754,54],"bytes":[56898,56937]},"callee":null},"1763:13":{"kind":"call","span":{"start":[1763,13],"end":[1763,56],"bytes":[57113,57156]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"1764:18":{"kind":"call","span":{"start":[1764,18],"end":[1764,34],"bytes":[57174,57190]},"callee":null},"1766:16":{"kind":"call","span":{"start":[1766,16],"end":[1766,98],"bytes":[57223,57305]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"1766:48":{"kind":"call","span":{"start":[1766,48],"end":[1766,69],"bytes":[57255,57276]},"callee":null},"1766:71":{"kind":"call","span":{"start":[1766,71],"end":[1766,92],"bytes":[57278,57299]},"callee":null},"1768:8":{"kind":"call","span":{"start":[1768,8],"end":[1768,40],"bytes":[57316,57348]},"callee":null},"1770:9":{"kind":"call","span":{"start":[1770,9],"end":[1770,32],"bytes":[57358,57381]},"callee":null},"1771:12":{"kind":"call","span":{"start":[1771,12],"end":[1771,30],"bytes":[57393,57411]},"callee":null},"1773:13":{"kind":"call","span":{"start":[1773,13],"end":[1773,136],"bytes":[57479,57602]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"1773:47":{"kind":"call","span":{"start":[1773,47],"end":[1773,68],"bytes":[57513,57534]},"callee":null},"1773:70":{"kind":"call","span":{"start":[1773,70],"end":[1773,91],"bytes":[57536,57557]},"callee":null},"1773:93":{"kind":"call","span":{"start":[1773,93],"end":[1773,135],"bytes":[57559,57601]},"callee":null},"1776:16":{"kind":"call","span":{"start":[1776,16],"end":[1776,28],"bytes":[57643,57655]},"callee":null},"1776:41":{"kind":"call","span":{"start":[1776,41],"end":[1776,53],"bytes":[57668,57680]},"callee":null},"1777:15":{"kind":"call","span":{"start":[1777,15],"end":[1777,27],"bytes":[57703,57715]},"callee":null},"1778:15":{"kind":"call","span":{"start":[1778,15],"end":[1778,27],"bytes":[57739,57751]},"callee":null},"1779:20":{"kind":"call","span":{"start":[1779,20],"end":[1779,32],"bytes":[57780,57792]},"callee":null},"1782:16":{"kind":"call","span":{"start":[1782,16],"end":[1782,37],"bytes":[57895,57916]},"callee":null},"1782:24":{"kind":"call","span":{"start":[1782,24],"end":[1782,36],"bytes":[57903,57915]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1783:16":{"kind":"call","span":{"start":[1783,16],"end":[1783,52],"bytes":[57946,57982]},"callee":null},"1784:26":{"kind":"call","span":{"start":[1784,26],"end":[1784,35],"bytes":[58008,58017]},"callee":null},"1792:16":{"kind":"call","span":{"start":[1792,16],"end":[1792,43],"bytes":[58389,58416]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"1792:30":{"kind":"call","span":{"start":[1792,30],"end":[1792,42],"bytes":[58403,58415]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1794:18":{"kind":"call","span":{"start":[1794,18],"end":[1794,82],"bytes":[58453,58517]},"callee":null},"1798:17":{"kind":"call","span":{"start":[1798,17],"end":[1798,50],"bytes":[58571,58604]},"callee":null},"1799:17":{"kind":"call","span":{"start":[1799,17],"end":[1799,50],"bytes":[58621,58654]},"callee":null},"1804:4":{"kind":"call","span":{"start":[1804,4],"end":[1806,29],"bytes":[58743,58897]},"callee":null},"1816:15":{"kind":"call","span":{"start":[1816,15],"end":[1816,42],"bytes":[59081,59108]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"1816:29":{"kind":"call","span":{"start":[1816,29],"end":[1816,41],"bytes":[59095,59107]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1818:16":{"kind":"call","span":{"start":[1818,16],"end":[1818,61],"bytes":[59141,59186]},"callee":null},"1820:11":{"kind":"call","span":{"start":[1820,11],"end":[1820,45],"bytes":[59200,59234]},"callee":null},"1821:11":{"kind":"call","span":{"start":[1821,11],"end":[1821,45],"bytes":[59245,59279]},"callee":null},"1822:24":{"kind":"call","span":{"start":[1822,24],"end":[1822,36],"bytes":[59303,59315]},"callee":null},"1822:58":{"kind":"call","span":{"start":[1822,58],"end":[1822,70],"bytes":[59337,59349]},"callee":null},"1833:3":{"kind":"call","span":{"start":[1833,3],"end":[1833,73],"bytes":[59806,59876]},"callee":null},"1844:2":{"kind":"call","span":{"start":[1844,2],"end":[1844,83],"bytes":[60154,60235]},"callee":null},"1855:16":{"kind":"call","span":{"start":[1855,16],"end":[1855,93],"bytes":[60608,60685]},"callee":null},"1859:24":{"kind":"call","span":{"start":[1859,24],"end":[1859,76],"bytes":[60801,60853]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch"},"1861:16":{"kind":"call","span":{"start":[1861,16],"end":[1861,54],"bytes":[60886,60924]},"callee":null},"1870:2":{"kind":"call","span":{"start":[1870,2],"end":[1870,61],"bytes":[61217,61276]},"callee":null},"1875:3":{"kind":"call","span":{"start":[1875,3],"end":[1877,19],"bytes":[61450,61544]},"callee":null},"1882:104":{"kind":"call","span":{"start":[1882,104],"end":[1882,116],"bytes":[61720,61732]},"callee":null},"1882:23":{"kind":"call","span":{"start":[1882,23],"end":[1882,128],"bytes":[61639,61744]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint"},"1882:81":{"kind":"call","span":{"start":[1882,81],"end":[1882,93],"bytes":[61697,61709]},"callee":null},"1883:17":{"kind":"call","span":{"start":[1883,17],"end":[1883,62],"bytes":[61775,61820]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor/github.com/benbjohnson/litestream.DB.verifyWithExecutor.closure_1","kind":"function","span":{"start":[1768,1],"end":[1768,40],"bytes":[57309,57348]},"signature":"github.com/benbjohnson/litestream.DB.verifyWithExecutor.closure_1","parameters":[],"body":{"1768:21":{"kind":"call","span":{"start":[1768,21],"end":[1768,36],"bytes":[57329,57344]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.walFileSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","kind":"method","span":{"start":[1622,1],"end":[1630,2],"bytes":[52670,52857]},"signature":"github.com/benbjohnson/litestream.DB.walFileSize","parameters":[],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1623:13":{"kind":"call","span":{"start":[1623,13],"end":[1623,34],"bytes":[52727,52748]},"callee":null},"1623:21":{"kind":"call","span":{"start":[1623,21],"end":[1623,33],"bytes":[52735,52747]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1624:5":{"kind":"call","span":{"start":[1624,5],"end":[1624,23],"bytes":[52753,52771]},"callee":null},"1629:9":{"kind":"call","span":{"start":[1629,9],"end":[1629,18],"bytes":[52841,52850]},"callee":null}}},"github.com/benbjohnson/litestream.DB.writeLTXFromDB":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","kind":"method","span":{"start":[2362,1],"end":[2407,2],"bytes":[75778,77350]},"signature":"github.com/benbjohnson/litestream.DB.writeLTXFromDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}},{"name":"enc","type":"*github.com/superfly/ltx.Encoder","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}},{"name":"walFile","type":"*os.File","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}},{"name":"commit","type":"uint32","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}},{"name":"pageMap","type":"map[uint32]int64","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"2363:14":{"kind":"call","span":{"start":[2363,14],"end":[2363,47],"bytes":[75926,75959]},"callee":null},"2363:27":{"kind":"call","span":{"start":[2363,27],"end":[2363,46],"bytes":[75939,75958]},"callee":null},"2364:10":{"kind":"call","span":{"start":[2364,10],"end":[2364,35],"bytes":[75969,75994]},"callee":null},"2366:14":{"kind":"call","span":{"start":[2366,14],"end":[2366,23],"bytes":[76009,76018]},"callee":null},"2373:10":{"kind":"call","span":{"start":[2373,10],"end":[2373,20],"bytes":[76163,76173]},"callee":null},"2374:11":{"kind":"call","span":{"start":[2374,11],"end":[2374,29],"bytes":[76185,76203]},"callee":null},"2380:4":{"kind":"call","span":{"start":[2380,4],"end":[2380,147],"bytes":[76311,76454]},"callee":null},"2380:76":{"kind":"call","span":{"start":[2380,76],"end":[2380,88],"bytes":[76383,76395]},"callee":null},"2382:17":{"kind":"call","span":{"start":[2382,17],"end":[2382,64],"bytes":[76472,76519]},"callee":null},"2383:12":{"kind":"call","span":{"start":[2383,12],"end":[2383,66],"bytes":[76545,76599]},"callee":null},"2384:19":{"kind":"call","span":{"start":[2384,19],"end":[2384,28],"bytes":[76618,76627]},"callee":null},"2385:12":{"kind":"call","span":{"start":[2385,12],"end":[2385,63],"bytes":[76641,76692]},"callee":null},"2388:14":{"kind":"call","span":{"start":[2388,14],"end":[2388,62],"bytes":[76712,76760]},"callee":null},"2389:12":{"kind":"call","span":{"start":[2389,12],"end":[2389,67],"bytes":[76786,76841]},"callee":null},"2394:13":{"kind":"call","span":{"start":[2394,13],"end":[2394,26],"bytes":[76876,76889]},"callee":null},"2394:29":{"kind":"call","span":{"start":[2394,29],"end":[2394,47],"bytes":[76892,76910]},"callee":null},"2395:3":{"kind":"call","span":{"start":[2395,3],"end":[2395,103],"bytes":[76913,77013]},"callee":null},"2398:16":{"kind":"call","span":{"start":[2398,16],"end":[2398,41],"bytes":[77083,77108]},"callee":null},"2399:11":{"kind":"call","span":{"start":[2399,11],"end":[2399,61],"bytes":[77133,77183]},"callee":null},"2401:13":{"kind":"call","span":{"start":[2401,13],"end":[2401,61],"bytes":[77200,77248]},"callee":null},"2402:11":{"kind":"call","span":{"start":[2402,11],"end":[2402,66],"bytes":[77273,77328]},"callee":null}}},"github.com/benbjohnson/litestream.DB.writeLTXFromWAL":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","kind":"method","span":{"start":[2409,1],"end":[2466,2],"bytes":[77352,79300]},"signature":"github.com/benbjohnson/litestream.DB.writeLTXFromWAL","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"enc","type":"*github.com/superfly/ltx.Encoder","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"walFile","type":"*os.File","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"prevCommit","type":"uint32","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"commit","type":"uint32","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"pageMap","type":"map[uint32]int64","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":16},"body":{"2411:11":{"kind":"call","span":{"start":[2411,11],"end":[2411,42],"bytes":[77588,77619]},"callee":null},"2411:29":{"kind":"call","span":{"start":[2411,29],"end":[2411,41],"bytes":[77606,77618]},"callee":null},"2413:11":{"kind":"call","span":{"start":[2413,11],"end":[2413,30],"bytes":[77659,77678]},"callee":null},"2415:14":{"kind":"call","span":{"start":[2415,14],"end":[2415,47],"bytes":[77695,77728]},"callee":null},"2415:27":{"kind":"call","span":{"start":[2415,27],"end":[2415,46],"bytes":[77708,77727]},"callee":null},"2417:15":{"kind":"call","span":{"start":[2417,15],"end":[2417,25],"bytes":[77769,77779]},"callee":null},"2425:12":{"kind":"call","span":{"start":[2425,12],"end":[2425,31],"bytes":[77942,77961]},"callee":null},"2427:21":{"kind":"call","span":{"start":[2427,21],"end":[2427,31],"bytes":[77986,77996]},"callee":null},"2428:4":{"kind":"call","span":{"start":[2428,4],"end":[2432,22],"bytes":[78030,78196]},"callee":null},"2429:13":{"kind":"call","span":{"start":[2429,13],"end":[2429,25],"bytes":[78100,78112]},"callee":null},"2435:2":{"kind":"call","span":{"start":[2435,2],"end":[2435,20],"bytes":[78205,78223]},"callee":null},"2437:10":{"kind":"call","span":{"start":[2437,10],"end":[2437,35],"bytes":[78234,78259]},"callee":null},"2440:10":{"kind":"call","span":{"start":[2440,10],"end":[2440,20],"bytes":[78310,78320]},"callee":null},"2441:11":{"kind":"call","span":{"start":[2441,11],"end":[2441,29],"bytes":[78332,78350]},"callee":null},"2445:4":{"kind":"call","span":{"start":[2445,4],"end":[2445,148],"bytes":[78408,78552]},"callee":null},"2445:76":{"kind":"call","span":{"start":[2445,76],"end":[2445,88],"bytes":[78480,78492]},"callee":null},"2447:17":{"kind":"call","span":{"start":[2447,17],"end":[2447,64],"bytes":[78570,78617]},"callee":null},"2448:12":{"kind":"call","span":{"start":[2448,12],"end":[2448,66],"bytes":[78643,78697]},"callee":null},"2449:19":{"kind":"call","span":{"start":[2449,19],"end":[2449,28],"bytes":[78716,78725]},"callee":null},"2450:12":{"kind":"call","span":{"start":[2450,12],"end":[2450,63],"bytes":[78739,78790]},"callee":null},"2453:14":{"kind":"call","span":{"start":[2453,14],"end":[2453,27],"bytes":[78820,78833]},"callee":null},"2453:30":{"kind":"call","span":{"start":[2453,30],"end":[2453,48],"bytes":[78836,78854]},"callee":null},"2454:4":{"kind":"call","span":{"start":[2454,4],"end":[2454,155],"bytes":[78858,79009]},"callee":null},"2454:81":{"kind":"call","span":{"start":[2454,81],"end":[2454,93],"bytes":[78935,78947]},"callee":null},"2456:17":{"kind":"call","span":{"start":[2456,17],"end":[2456,42],"bytes":[79027,79052]},"callee":null},"2457:12":{"kind":"call","span":{"start":[2457,12],"end":[2457,62],"bytes":[79078,79128]},"callee":null},"2461:13":{"kind":"call","span":{"start":[2461,13],"end":[2461,61],"bytes":[79151,79199]},"callee":null},"2462:11":{"kind":"call","span":{"start":[2462,11],"end":[2462,66],"bytes":[79224,79279]},"callee":null}}}},"fields":{"BusyTimeout":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/BusyTimeout","kind":"field","type":"time.Duration","span":{"start":[157,1],"end":[157,27],"bytes":[5538,5564]}},"CheckpointInterval":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/CheckpointInterval","kind":"field","type":"time.Duration","span":{"start":[145,1],"end":[145,34],"bytes":[5123,5156]}},"Done":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/Done","kind":"field","type":"\u003c-chan struct{}","span":{"start":[105,1],"end":[105,24],"bytes":[3368,3391]}},"L0Retention":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/L0Retention","kind":"field","type":"time.Duration","span":{"start":[160,1],"end":[160,27],"bytes":[5642,5668]}},"Logger":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/Logger","kind":"field","type":"*log/slog.Logger","span":{"start":[192,1],"end":[192,21],"bytes":[6903,6923]}},"MaxSyncWALBytes":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/MaxSyncWALBytes","kind":"field","type":"int64","span":{"start":[154,1],"end":[154,23],"bytes":[5467,5489]}},"MinCheckpointPageN":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/MinCheckpointPageN","kind":"field","type":"int","span":{"start":[127,1],"end":[127,24],"bytes":[4322,4345]}},"MonitorInterval":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/MonitorInterval","kind":"field","type":"time.Duration","span":{"start":[148,1],"end":[148,31],"bytes":[5201,5231]}},"Replica":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/Replica","kind":"field","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[174,1],"end":[174,18],"bytes":[6207,6224]}},"RetentionEnabled":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/RetentionEnabled","kind":"field","type":"bool","span":{"start":[170,1],"end":[170,23],"bytes":[6107,6129]}},"ShutdownSyncInterval":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/ShutdownSyncInterval","kind":"field","type":"time.Duration","span":{"start":[184,1],"end":[184,36],"bytes":[6584,6619]}},"ShutdownSyncTimeout":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/ShutdownSyncTimeout","kind":"field","type":"time.Duration","span":{"start":[183,1],"end":[183,36],"bytes":[6548,6583]}},"TruncatePageN":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/TruncatePageN","kind":"field","type":"int","span":{"start":[137,1],"end":[137,19],"bytes":[4817,4835]}},"VerifyCompaction":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/VerifyCompaction","kind":"field","type":"bool","span":{"start":[165,1],"end":[165,23],"bytes":[5864,5886]}},"cancel":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/cancel","kind":"field","type":"func()","span":{"start":[103,1],"end":[103,15],"bytes":[3330,3344]}},"checkpointErrorNCounterVec":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/checkpointErrorNCounterVec","kind":"field","type":"*github.com/prometheus/client_golang/prometheus.CounterVec","span":{"start":[118,1],"end":[118,52],"bytes":[3867,3918]}},"checkpointNCounterVec":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/checkpointNCounterVec","kind":"field","type":"*github.com/prometheus/client_golang/prometheus.CounterVec","span":{"start":[117,1],"end":[117,52],"bytes":[3815,3866]}},"checkpointSecondsCounterVec":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/checkpointSecondsCounterVec","kind":"field","type":"*github.com/prometheus/client_golang/prometheus.CounterVec","span":{"start":[119,1],"end":[119,52],"bytes":[3919,3970]}},"chkMu":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/chkMu","kind":"field","type":"sync.RWMutex","span":{"start":[77,1],"end":[77,44],"bytes":[2567,2610]}},"compactor":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/compactor","kind":"field","type":"*github.com/benbjohnson/litestream.Compactor","span":{"start":[178,1],"end":[178,22],"bytes":[6358,6379]}},"ctx":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/ctx","kind":"field","type":"context.Context","span":{"start":[102,1],"end":[102,24],"bytes":[3306,3329]}},"db":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/db","kind":"field","type":"*database/sql.DB","span":{"start":[72,1],"end":[72,44],"bytes":[2308,2351]}},"dbSizeGauge":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/dbSizeGauge","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Gauge","span":{"start":[109,1],"end":[109,46],"bytes":[3439,3484]}},"dirInfo":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/dirInfo","kind":"field","type":"os.FileInfo","span":{"start":[96,1],"end":[96,60],"bytes":[3051,3110]}},"diskFullGauge":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/diskFullGauge","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Gauge","span":{"start":[116,1],"end":[116,46],"bytes":[3769,3814]}},"execSem":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/execSem","kind":"field","type":"*golang.org/x/sync/semaphore.Weighted","span":{"start":[69,1],"end":[69,31],"bytes":[2173,2203]}},"f":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/f","kind":"field","type":"*os.File","span":{"start":[73,1],"end":[73,60],"bytes":[2352,2411]}},"fileInfo":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/fileInfo","kind":"field","type":"os.FileInfo","span":{"start":[95,1],"end":[95,52],"bytes":[2999,3050]}},"lastSuccessfulSyncAt":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/lastSuccessfulSyncAt","kind":"field","type":"time.Time","span":{"start":[189,1],"end":[189,32],"bytes":[6793,6824]}},"lastSuccessfulSyncMu":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/lastSuccessfulSyncMu","kind":"field","type":"sync.RWMutex","span":{"start":[188,1],"end":[188,35],"bytes":[6758,6792]}},"maxLTXFileInfos":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/maxLTXFileInfos","kind":"field","type":"struct{sync.Mutex; m map[int]*github.com/superfly/ltx.FileInfo}","span":{"start":[83,1],"end":[86,3],"bytes":[2769,2836]}},"metaPath":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/metaPath","kind":"field","type":"string","span":{"start":[71,1],"end":[71,59],"bytes":[2249,2307]}},"metricsRegistered":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/metricsRegistered","kind":"field","type":"bool","span":{"start":[108,1],"end":[108,34],"bytes":[3405,3438]}},"mu":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/mu","kind":"field","type":"sync.RWMutex","span":{"start":[68,1],"end":[68,24],"bytes":[2149,2172]}},"notify":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/notify","kind":"field","type":"chan struct{}","span":{"start":[76,1],"end":[76,49],"bytes":[2518,2566]}},"openLTXFile":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/openLTXFile","kind":"field","type":"func(name string, flag int, perm os.FileMode) (github.com/benbjohnson/litestream.ltxStagingFile, error)","span":{"start":[100,1],"end":[100,83],"bytes":[3222,3304]}},"opened":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/opened","kind":"field","type":"bool","span":{"start":[78,1],"end":[78,81],"bytes":[2611,2691]}},"pageSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/pageSize","kind":"field","type":"int","span":{"start":[75,1],"end":[75,48],"bytes":[2470,2517]}},"path":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/path","kind":"field","type":"string","span":{"start":[70,1],"end":[70,45],"bytes":[2204,2248]}},"pos":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/pos","kind":"field","type":"struct{sync.Mutex; value *github.com/superfly/ltx.Pos}","span":{"start":[90,1],"end":[93,3],"bytes":[2951,2997]}},"rtx":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/rtx","kind":"field","type":"*database/sql.Tx","span":{"start":[74,1],"end":[74,58],"bytes":[2412,2469]}},"syncDiag":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/syncDiag","kind":"field","type":"github.com/benbjohnson/litestream.diagState","span":{"start":[80,1],"end":[80,21],"bytes":[2713,2733]}},"syncErrorNCounter":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/syncErrorNCounter","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Counter","span":{"start":[114,1],"end":[114,48],"bytes":[3673,3720]}},"syncNCounter":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/syncNCounter","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Counter","span":{"start":[113,1],"end":[113,48],"bytes":[3625,3672]}},"syncSecondsCounter":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/syncSecondsCounter","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Counter","span":{"start":[115,1],"end":[115,48],"bytes":[3721,3768]}},"syncState":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/syncState","kind":"field","type":"github.com/benbjohnson/litestream.syncState","span":{"start":[79,1],"end":[79,21],"bytes":[2692,2712]}},"totalWALBytesCounter":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/totalWALBytesCounter","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Counter","span":{"start":[111,1],"end":[111,48],"bytes":[3531,3578]}},"txIDGauge":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/txIDGauge","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Gauge","span":{"start":[112,1],"end":[112,46],"bytes":[3579,3624]}},"walSizeGauge":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/walSizeGauge","kind":"field","type":"github.com/prometheus/client_golang/prometheus.Gauge","span":{"start":[110,1],"end":[110,46],"bytes":[3485,3530]}},"wg":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[104,1],"end":[104,23],"bytes":[3345,3367]}}}},"IntegrityCheckMode":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.IntegrityCheckMode","kind":"struct","span":{"start":[3376,1],"end":[3376,28],"bytes":[108196,108223]},"callables":{}},"RestoreOptions":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.RestoreOptions","kind":"struct","span":{"start":[3385,1],"end":[3411,2],"bytes":[108378,109263]},"callables":{},"fields":{"Follow":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.RestoreOptions/Follow","kind":"field","type":"bool","span":{"start":[3403,1],"end":[3403,13],"bytes":[108945,108957]}},"FollowInterval":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.RestoreOptions/FollowInterval","kind":"field","type":"time.Duration","span":{"start":[3406,1],"end":[3406,30],"bytes":[109040,109069]}},"IntegrityCheck":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.RestoreOptions/IntegrityCheck","kind":"field","type":"github.com/benbjohnson/litestream.IntegrityCheckMode","span":{"start":[3410,1],"end":[3410,35],"bytes":[109227,109261]}},"OutputPath":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.RestoreOptions/OutputPath","kind":"field","type":"string","span":{"start":[3388,1],"end":[3388,19],"bytes":[108484,108502]}},"Parallelism":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.RestoreOptions/Parallelism","kind":"field","type":"int","span":{"start":[3399,1],"end":[3399,17],"bytes":[108789,108805]}},"TXID":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.RestoreOptions/TXID","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[3392,1],"end":[3392,15],"bytes":[108574,108588]}},"Timestamp":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.RestoreOptions/Timestamp","kind":"field","type":"time.Time","span":{"start":[3396,1],"end":[3396,21],"bytes":[108691,108711]}}}},"SyncDiagnostic":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic","kind":"struct","span":{"start":[287,1],"end":[305,2],"bytes":[10852,11943]},"callables":{},"fields":{"Active":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Active","kind":"field","type":"bool","span":{"start":[289,1],"end":[289,48],"bytes":[10927,10974]}},"CheckpointMode":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/CheckpointMode","kind":"field","type":"string","span":{"start":[299,1],"end":[299,67],"bytes":[11538,11604]}},"ElapsedSeconds":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/ElapsedSeconds","kind":"field","type":"float64","span":{"start":[294,1],"end":[294,67],"bytes":[11217,11283]}},"Error":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Error","kind":"field","type":"string","span":{"start":[301,1],"end":[301,57],"bytes":[11663,11719]}},"ExecutorWaitSeconds":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/ExecutorWaitSeconds","kind":"field","type":"float64","span":{"start":[304,1],"end":[304,73],"bytes":[11869,11941]}},"ExecutorWaitStarted":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/ExecutorWaitStarted","kind":"field","type":"*time.Time","span":{"start":[303,1],"end":[303,76],"bytes":[11793,11868]}},"ExecutorWaiterCount":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/ExecutorWaiterCount","kind":"field","type":"int","span":{"start":[302,1],"end":[302,73],"bytes":[11720,11792]}},"LastSyncedWALOffset":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/LastSyncedWALOffset","kind":"field","type":"int64","span":{"start":[297,1],"end":[297,74],"bytes":[11400,11473]}},"Operation":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Operation","kind":"field","type":"string","span":{"start":[290,1],"end":[290,61],"bytes":[10975,11035]}},"Path":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Path","kind":"field","type":"string","span":{"start":[288,1],"end":[288,46],"bytes":[10881,10926]}},"Phase":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Phase","kind":"field","type":"string","span":{"start":[291,1],"end":[291,57],"bytes":[11036,11092]}},"Reason":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Reason","kind":"field","type":"string","span":{"start":[300,1],"end":[300,58],"bytes":[11605,11662]}},"Snapshotting":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Snapshotting","kind":"field","type":"bool","span":{"start":[298,1],"end":[298,64],"bytes":[11474,11537]}},"StartedAt":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/StartedAt","kind":"field","type":"*time.Time","span":{"start":[292,1],"end":[292,62],"bytes":[11093,11154]}},"TXID":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/TXID","kind":"field","type":"uint64","span":{"start":[295,1],"end":[295,56],"bytes":[11284,11339]}},"UpdatedAt":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/UpdatedAt","kind":"field","type":"*time.Time","span":{"start":[293,1],"end":[293,62],"bytes":[11155,11216]}},"WALSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/WALSize","kind":"field","type":"int64","span":{"start":[296,1],"end":[296,60],"bytes":[11340,11399]}}}},"SyncStatus":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncStatus","kind":"struct","span":{"start":[736,1],"end":[740,2],"bytes":[25295,25380]},"callables":{},"fields":{"InSync":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncStatus/InSync","kind":"field","type":"bool","span":{"start":[739,1],"end":[739,17],"bytes":[25362,25378]}},"LocalTXID":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncStatus/LocalTXID","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[737,1],"end":[737,21],"bytes":[25320,25340]}},"RemoteTXID":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.SyncStatus/RemoteTXID","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[738,1],"end":[738,21],"bytes":[25341,25361]}}}},"diagOp":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagOp","kind":"struct","span":{"start":[232,1],"end":[232,19],"bytes":[8494,8512]},"callables":{}},"diagPhase":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagPhase","kind":"struct","span":{"start":[239,1],"end":[239,22],"bytes":[8599,8620]},"callables":{}},"diagState":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState","kind":"struct","span":{"start":[268,1],"end":[284,2],"bytes":[10348,10784]},"base_types":["sync.RWMutex"],"callables":{},"fields":{"active":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/active","kind":"field","type":"bool","span":{"start":[270,1],"end":[270,26],"bytes":[10386,10411]}},"checkpointMode":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/checkpointMode","kind":"field","type":"string","span":{"start":[279,1],"end":[279,28],"bytes":[10643,10670]}},"err":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/err","kind":"field","type":"string","span":{"start":[281,1],"end":[281,28],"bytes":[10699,10726]}},"executorWaitStarted":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/executorWaitStarted","kind":"field","type":"time.Time","span":{"start":[283,1],"end":[283,31],"bytes":[10752,10782]}},"executorWaiterCount":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/executorWaiterCount","kind":"field","type":"int","span":{"start":[282,1],"end":[282,25],"bytes":[10727,10751]}},"lastSyncedWALOffset":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/lastSyncedWALOffset","kind":"field","type":"int64","span":{"start":[277,1],"end":[277,27],"bytes":[10590,10616]}},"operation":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/operation","kind":"field","type":"github.com/benbjohnson/litestream.diagOp","span":{"start":[271,1],"end":[271,28],"bytes":[10412,10439]}},"phase":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/phase","kind":"field","type":"github.com/benbjohnson/litestream.diagPhase","span":{"start":[272,1],"end":[272,31],"bytes":[10440,10470]}},"reason":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/reason","kind":"field","type":"string","span":{"start":[280,1],"end":[280,28],"bytes":[10671,10698]}},"snapshotting":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/snapshotting","kind":"field","type":"bool","span":{"start":[278,1],"end":[278,26],"bytes":[10617,10642]}},"startedAt":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/startedAt","kind":"field","type":"time.Time","span":{"start":[273,1],"end":[273,31],"bytes":[10471,10501]}},"sync.RWMutex":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/sync.RWMutex","kind":"field","type":"sync.RWMutex","span":{"start":[269,1],"end":[269,14],"bytes":[10372,10385]}},"txID":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/txID","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[275,1],"end":[275,30],"bytes":[10533,10562]}},"updatedAt":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/updatedAt","kind":"field","type":"time.Time","span":{"start":[274,1],"end":[274,31],"bytes":[10502,10532]}},"walSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.diagState/walSize","kind":"field","type":"int64","span":{"start":[276,1],"end":[276,27],"bytes":[10563,10589]}}}},"ltxStagingFile":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.ltxStagingFile","kind":"interface","span":{"start":[1611,1],"end":[1615,2],"bytes":[52405,52478]},"base_types":["io.Writer"],"callables":{"github.com/benbjohnson/litestream.ltxStagingFile.Close":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Close","kind":"method","span":{"start":[1614,1],"end":[1614,15],"bytes":[52462,52476]},"signature":"github.com/benbjohnson/litestream.ltxStagingFile.Close","parameters":[],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ltxStagingFile.Sync":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Sync","kind":"method","span":{"start":[1613,1],"end":[1613,14],"bytes":[52448,52461]},"signature":"github.com/benbjohnson/litestream.ltxStagingFile.Sync","parameters":[],"return_type":"error","error_channel":["error"],"body":{}}}},"snapshotReadCloser":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadCloser","kind":"struct","span":{"start":[2768,1],"end":[2771,2],"bytes":[88955,89032]},"base_types":["*io.PipeReader"],"callables":{"github.com/benbjohnson/litestream.snapshotReadCloser.Close":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/github.com/benbjohnson/litestream.snapshotReadCloser.Close","kind":"method","span":{"start":[2773,1],"end":[2776,2],"bytes":[89034,89130]},"signature":"github.com/benbjohnson/litestream.snapshotReadCloser.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"2774:8":{"kind":"call","span":{"start":[2774,8],"end":[2774,21],"bytes":[89086,89099]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close"},"2775:9":{"kind":"call","span":{"start":[2775,9],"end":[2775,29],"bytes":[89108,89128]},"callee":null}}}},"fields":{"*io.PipeReader":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/*io.PipeReader","kind":"field","type":"*io.PipeReader","span":{"start":[2769,1],"end":[2769,16],"bytes":[88988,89003]}},"pos":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/pos","kind":"field","type":"*github.com/benbjohnson/litestream.snapshotReadPosition","span":{"start":[2770,1],"end":[2770,27],"bytes":[89004,89030]}}}},"snapshotReadPosition":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition","kind":"struct","span":{"start":[2756,1],"end":[2762,2],"bytes":[88722,88860]},"callables":{"github.com/benbjohnson/litestream.snapshotReadPosition.close":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","kind":"method","span":{"start":[2764,1],"end":[2766,2],"bytes":[88862,88953]},"signature":"github.com/benbjohnson/litestream.snapshotReadPosition.close","parameters":[],"metrics":{"cyclomatic":1},"body":{"2765:2":{"kind":"call","span":{"start":[2765,2],"end":[2765,49],"bytes":[88904,88951]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close/github.com/benbjohnson/litestream.snapshotReadPosition.close.closure_1","kind":"function","span":{"start":[2765,1],"end":[2765,49],"bytes":[88903,88951]},"signature":"github.com/benbjohnson/litestream.snapshotReadPosition.close.closure_1","parameters":[],"body":{"2765:26":{"kind":"call","span":{"start":[2765,26],"end":[2765,46],"bytes":[88928,88948]},"callee":null}}}}}},"fields":{"closeOnce":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/closeOnce","kind":"field","type":"sync.Once","span":{"start":[2761,1],"end":[2761,24],"bytes":[88835,88858]}},"db":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/db","kind":"field","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[2760,1],"end":[2760,18],"bytes":[88817,88834]}},"pageSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/pageSize","kind":"field","type":"int","span":{"start":[2758,1],"end":[2758,18],"bytes":[88779,88796]}},"pos":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/pos","kind":"field","type":"github.com/superfly/ltx.Pos","span":{"start":[2757,1],"end":[2757,22],"bytes":[88757,88778]}},"walEndOffset":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/walEndOffset","kind":"field","type":"int64","span":{"start":[2759,1],"end":[2759,20],"bytes":[88797,88816]}}}},"syncExecutor":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor","kind":"struct","span":{"start":[223,1],"end":[230,2],"bytes":[8291,8492]},"callables":{"github.com/benbjohnson/litestream.syncExecutor.applySyncResult":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult","kind":"method","span":{"start":[2056,1],"end":[2068,2],"bytes":[66198,66575]},"signature":"github.com/benbjohnson/litestream.syncExecutor.applySyncResult","parameters":[{"name":"result","type":"github.com/benbjohnson/litestream.syncResult","span":{"start":[2056,1],"end":[2056,63],"bytes":[66198,66260]}}],"metrics":{"cyclomatic":3},"body":{}}},"fields":{"checkpointAttempted":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/checkpointAttempted","kind":"field","type":"bool","span":{"start":[229,1],"end":[229,26],"bytes":[8465,8490]}},"l0FileInfo":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/l0FileInfo","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[227,1],"end":[227,35],"bytes":[8404,8438]}},"pos":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/pos","kind":"field","type":"github.com/superfly/ltx.Pos","span":{"start":[225,1],"end":[225,29],"bytes":[8349,8377]}},"posChanged":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/posChanged","kind":"field","type":"bool","span":{"start":[226,1],"end":[226,26],"bytes":[8378,8403]}},"state":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/state","kind":"field","type":"github.com/benbjohnson/litestream.syncState","span":{"start":[224,1],"end":[224,31],"bytes":[8318,8348]}},"synced":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/synced","kind":"field","type":"bool","span":{"start":[228,1],"end":[228,26],"bytes":[8439,8464]}}}},"syncInfo":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncInfo","kind":"struct","span":{"start":[1969,1],"end":[1977,2],"bytes":[64228,64540]},"callables":{},"fields":{"clearSyncedToWALEnd":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncInfo/clearSyncedToWALEnd","kind":"field","type":"bool","span":{"start":[1976,1],"end":[1976,26],"bytes":[64513,64538]}},"offset":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncInfo/offset","kind":"field","type":"int64","span":{"start":[1970,1],"end":[1970,59],"bytes":[64251,64309]}},"prevCommit":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncInfo/prevCommit","kind":"field","type":"uint32","span":{"start":[1973,1],"end":[1973,28],"bytes":[64366,64393]}},"reason":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncInfo/reason","kind":"field","type":"string","span":{"start":[1975,1],"end":[1975,51],"bytes":[64462,64512]}},"salt1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncInfo/salt1","kind":"field","type":"uint32","span":{"start":[1971,1],"end":[1971,28],"bytes":[64310,64337]}},"salt2":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncInfo/salt2","kind":"field","type":"uint32","span":{"start":[1972,1],"end":[1972,28],"bytes":[64338,64365]}},"snapshotting":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncInfo/snapshotting","kind":"field","type":"bool","span":{"start":[1974,1],"end":[1974,68],"bytes":[64394,64461]}}}},"syncResult":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncResult","kind":"struct","span":{"start":[1979,1],"end":[1987,2],"bytes":[64542,64730]},"callables":{},"fields":{"l0FileInfo":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncResult/l0FileInfo","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1986,1],"end":[1986,30],"bytes":[64699,64728]}},"limited":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncResult/limited","kind":"field","type":"bool","span":{"start":[1983,1],"end":[1983,21],"bytes":[64632,64652]}},"newWALSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncResult/newWALSize","kind":"field","type":"int64","span":{"start":[1981,1],"end":[1981,22],"bytes":[64589,64610]}},"origWALSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncResult/origWALSize","kind":"field","type":"int64","span":{"start":[1980,1],"end":[1980,22],"bytes":[64567,64588]}},"pos":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncResult/pos","kind":"field","type":"*github.com/superfly/ltx.Pos","span":{"start":[1985,1],"end":[1985,25],"bytes":[64674,64698]}},"synced":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncResult/synced","kind":"field","type":"bool","span":{"start":[1982,1],"end":[1982,21],"bytes":[64611,64631]}},"syncedToWALEnd":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncResult/syncedToWALEnd","kind":"field","type":"bool","span":{"start":[1984,1],"end":[1984,21],"bytes":[64653,64673]}}}},"syncState":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncState","kind":"struct","span":{"start":[197,1],"end":[221,2],"bytes":[7068,8289]},"callables":{},"fields":{"lastSyncedWALOffset":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncState/lastSyncedWALOffset","kind":"field","type":"int64","span":{"start":[220,1],"end":[220,27],"bytes":[8261,8287]}},"syncedSinceCheckpoint":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncState/syncedSinceCheckpoint","kind":"field","type":"bool","span":{"start":[204,1],"end":[204,28],"bytes":[7392,7419]}},"syncedToWALEnd":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncState/syncedToWALEnd","kind":"field","type":"bool","span":{"start":[212,1],"end":[212,21],"bytes":[7813,7833]}},"truncatePassiveFailed":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncState/truncatePassiveFailed","kind":"field","type":"bool","span":{"start":[198,1],"end":[198,28],"bytes":[7092,7119]}}}}},"functions":{"github.com/benbjohnson/litestream.NewDB":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB","kind":"function","span":{"start":[308,1],"end":[352,2],"bytes":[12001,13590]},"signature":"github.com/benbjohnson/litestream.NewDB","parameters":[{"name":"path","type":"string","span":{"start":[308,1],"end":[308,30],"bytes":[12001,12030]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":1},"body":{"309:15":{"kind":"call","span":{"start":[309,15],"end":[309,35],"bytes":[12045,12065]},"callee":null},"313:13":{"kind":"call","span":{"start":[313,13],"end":[313,55],"bytes":[12109,12151]},"callee":null},"314:13":{"kind":"call","span":{"start":[314,13],"end":[314,37],"bytes":[12165,12189]},"callee":null},"315:13":{"kind":"call","span":{"start":[315,13],"end":[315,32],"bytes":[12203,12222]},"callee":null},"327:25":{"kind":"call","span":{"start":[327,25],"end":[327,65],"bytes":[12716,12756]},"callee":null},"327:45":{"kind":"call","span":{"start":[327,45],"end":[327,64],"bytes":[12736,12755]},"callee":null},"329:25":{"kind":"call","span":{"start":[329,25],"end":[329,52],"bytes":[12785,12812]},"callee":null},"332:22":{"kind":"call","span":{"start":[332,22],"end":[332,62],"bytes":[12872,12912]},"callee":null},"332:41":{"kind":"call","span":{"start":[332,41],"end":[332,61],"bytes":[12891,12911]},"callee":null},"335:17":{"kind":"call","span":{"start":[335,17],"end":[335,90],"bytes":[13013,13086]},"callee":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.NewCompactor"},"335:35":{"kind":"call","span":{"start":[335,35],"end":[335,89],"bytes":[13031,13085]},"callee":null},"338:2":{"kind":"call","span":{"start":[338,2],"end":[338,18],"bytes":[13195,13211]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics"}},"callables":{"closure_1":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_1","kind":"function","span":{"start":[339,1],"end":[344,3],"bytes":[13212,13406]},"signature":"github.com/benbjohnson/litestream.NewDB.closure_1","parameters":[{"name":"level","type":"int","span":{"start":[339,1],"end":[339,68],"bytes":[13212,13279]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, bool)","body":{"340:3":{"kind":"call","span":{"start":[340,3],"end":[340,28],"bytes":[13282,13307]},"callee":null},"341:9":{"kind":"call","span":{"start":[341,9],"end":[341,36],"bytes":[13316,13343]},"callee":null}}},"closure_2":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_2","kind":"function","span":{"start":[345,1],"end":[349,3],"bytes":[13407,13576]},"signature":"github.com/benbjohnson/litestream.NewDB.closure_2","parameters":[{"name":"level","type":"int","span":{"start":[345,1],"end":[345,66],"bytes":[13407,13472]}},{"name":"info","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[345,1],"end":[345,66],"bytes":[13407,13472]}}],"body":{"346:3":{"kind":"call","span":{"start":[346,3],"end":[346,28],"bytes":[13475,13500]},"callee":null},"347:9":{"kind":"call","span":{"start":[347,9],"end":[347,36],"bytes":[13509,13536]},"callee":null}}}}},"github.com/benbjohnson/litestream.NewRestoreOptions":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewRestoreOptions","kind":"function","span":{"start":[3414,1],"end":[3419,2],"bytes":[109342,109498]},"signature":"github.com/benbjohnson/litestream.NewRestoreOptions","parameters":[],"return_type":"github.com/benbjohnson/litestream.RestoreOptions","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.addDurationToCounter":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.addDurationToCounter","kind":"function","span":{"start":[1325,1],"end":[1329,2],"bytes":[42224,42340]},"signature":"github.com/benbjohnson/litestream.addDurationToCounter","parameters":[{"name":"counter","type":"github.com/prometheus/client_golang/prometheus.Counter","span":{"start":[1325,1],"end":[1325,73],"bytes":[42224,42296]}},{"name":"d","type":"time.Duration","span":{"start":[1325,1],"end":[1325,73],"bytes":[42224,42296]}}],"metrics":{"cyclomatic":2},"body":{"1327:15":{"kind":"call","span":{"start":[1327,15],"end":[1327,26],"bytes":[42323,42334]},"callee":null},"1327:3":{"kind":"call","span":{"start":[1327,3],"end":[1327,27],"bytes":[42311,42335]},"callee":null}}},"github.com/benbjohnson/litestream.calcWALSize":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.calcWALSize","kind":"function","span":{"start":[1634,1],"end":[1636,2],"bytes":[53023,53163]},"signature":"github.com/benbjohnson/litestream.calcWALSize","parameters":[{"name":"pageSize","type":"uint32","span":{"start":[1634,1],"end":[1634,56],"bytes":[53023,53078]}},{"name":"pageN","type":"uint32","span":{"start":[1634,1],"end":[1634,56],"bytes":[53023,53078]}}],"return_type":"int64","metrics":{"cyclomatic":1},"body":{"1635:33":{"kind":"call","span":{"start":[1635,33],"end":[1635,67],"bytes":[53111,53145]},"callee":null},"1635:70":{"kind":"call","span":{"start":[1635,70],"end":[1635,82],"bytes":[53148,53160]},"callee":null},"1635:9":{"kind":"call","span":{"start":[1635,9],"end":[1635,29],"bytes":[53087,53107]},"callee":null}}},"github.com/benbjohnson/litestream.defaultOpenLTXFile":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.defaultOpenLTXFile","kind":"function","span":{"start":[1617,1],"end":[1619,2],"bytes":[52480,52610]},"signature":"github.com/benbjohnson/litestream.defaultOpenLTXFile","parameters":[{"name":"name","type":"string","span":{"start":[1617,1],"end":[1617,91],"bytes":[52480,52570]}},{"name":"flag","type":"int","span":{"start":[1617,1],"end":[1617,91],"bytes":[52480,52570]}},{"name":"perm","type":"os.FileMode","span":{"start":[1617,1],"end":[1617,91],"bytes":[52480,52570]}}],"return_type":"(github.com/benbjohnson/litestream.ltxStagingFile, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"1618:9":{"kind":"call","span":{"start":[1618,9],"end":[1618,38],"bytes":[52579,52608]},"callee":null}}},"github.com/benbjohnson/litestream.isDiskFullError":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError","kind":"function","span":{"start":[1595,1],"end":[1609,2],"bytes":[51890,52403]},"signature":"github.com/benbjohnson/litestream.isDiskFullError","parameters":[{"name":"err","type":"error","span":{"start":[1595,1],"end":[1595,39],"bytes":[51890,51928]}}],"return_type":"bool","metrics":{"cyclomatic":3},"body":{"1599:36":{"kind":"call","span":{"start":[1599,36],"end":[1599,66],"bytes":[51999,52029]},"callee":null},"1599:5":{"kind":"call","span":{"start":[1599,5],"end":[1599,32],"bytes":[51968,51995]},"callee":null},"1602:12":{"kind":"call","span":{"start":[1602,12],"end":[1602,40],"bytes":[52060,52088]},"callee":null},"1602:28":{"kind":"call","span":{"start":[1602,28],"end":[1602,39],"bytes":[52076,52087]},"callee":null},"1603:9":{"kind":"call","span":{"start":[1603,9],"end":[1603,60],"bytes":[52097,52148]},"callee":null},"1604:3":{"kind":"call","span":{"start":[1604,3],"end":[1604,50],"bytes":[52154,52201]},"callee":null},"1605:3":{"kind":"call","span":{"start":[1605,3],"end":[1605,59],"bytes":[52207,52263]},"callee":null},"1606:3":{"kind":"call","span":{"start":[1606,3],"end":[1606,55],"bytes":[52269,52321]},"callee":null},"1607:3":{"kind":"call","span":{"start":[1607,3],"end":[1607,37],"bytes":[52327,52361]},"callee":null},"1608:3":{"kind":"call","span":{"start":[1608,3],"end":[1608,37],"bytes":[52367,52401]},"callee":null}}},"github.com/benbjohnson/litestream.isSQLiteBusyError":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError","kind":"function","span":{"start":[1583,1],"end":[1591,2],"bytes":[51457,51726]},"signature":"github.com/benbjohnson/litestream.isSQLiteBusyError","parameters":[{"name":"err","type":"error","span":{"start":[1583,1],"end":[1583,41],"bytes":[51457,51497]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"1588:12":{"kind":"call","span":{"start":[1588,12],"end":[1588,23],"bytes":[51613,51624]},"callee":null},"1589:9":{"kind":"call","span":{"start":[1589,9],"end":[1589,55],"bytes":[51633,51679]},"callee":null},"1590:3":{"kind":"call","span":{"start":[1590,3],"end":[1590,42],"bytes":[51685,51724]},"callee":null}}},"github.com/benbjohnson/litestream.snapshotHeaderWALRange":{"id":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotHeaderWALRange","kind":"function","span":{"start":[2973,1],"end":[2979,2],"bytes":[95070,95315]},"signature":"github.com/benbjohnson/litestream.snapshotHeaderWALRange","parameters":[{"name":"maxOffset","type":"int64","span":{"start":[2973,1],"end":[2973,79],"bytes":[95070,95148]}},{"name":"frameSize","type":"int64","span":{"start":[2973,1],"end":[2973,79],"bytes":[95070,95148]}}],"return_type":"(int64, int64)","metrics":{"cyclomatic":2},"body":{"2977:11":{"kind":"call","span":{"start":[2977,11],"end":[2977,50],"bytes":[95239,95278]},"callee":null}}}},"content_hash":"95d34cde5d76f1f6f683c38ec01b4dcf5e5167059935a0816889d1c72c7944fd"},"file/replica_client.go":{"id":"can://go/litestream/file/replica_client.go","kind":"module","span":{"start":[1,1],"end":[379,1],"bytes":[0,10820]},"package":"file","source":"package file\n\nimport (\n\t\"bytes\"\n\t\"cmp\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"time\"\n\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"file\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"file\"\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\nvar _ litestream.ReplicaClientV3 = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to disk.\ntype ReplicaClient struct {\n\tpath string // destination path\n\n\tReplica *litestream.Replica\n\tlogger *slog.Logger\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient(path string) *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tpath: path,\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\t// For file URLs, the path is the full path\n\tif urlPath == \"\" {\n\t\treturn nil, fmt.Errorf(\"file replica path required\")\n\t}\n\treturn NewReplicaClient(urlPath), nil\n}\n\n// db returns the database, if available.\nfunc (c *ReplicaClient) db() *litestream.DB {\n\tif c.Replica == nil {\n\t\treturn nil\n\t}\n\treturn c.Replica.DB()\n}\n\n// Type returns \"file\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init is a no-op for file replica client as no initialization is required.\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\treturn nil\n}\n\n// Path returns the destination path to replicate the database to.\nfunc (c *ReplicaClient) Path() string {\n\treturn c.path\n}\n\n// LTXLevelDir returns the path to a given level.\nfunc (c *ReplicaClient) LTXLevelDir(level int) string {\n\treturn filepath.FromSlash(litestream.LTXLevelDir(c.path, level))\n}\n\n// LTXFilePath returns the path to an LTX file.\nfunc (c *ReplicaClient) LTXFilePath(level int, minTXID, maxTXID ltx.TXID) string {\n\treturn filepath.FromSlash(litestream.LTXFilePath(c.path, level, minTXID, maxTXID))\n}\n\n// LTXFiles returns an iterator over all LTX files on the replica for the given level.\n// The useMetadata parameter is ignored for file backend as ModTime is always available from readdir.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tf, err := os.Open(c.LTXLevelDir(level))\n\tif os.IsNotExist(err) {\n\t\treturn ltx.NewFileInfoSliceIterator(nil), nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\tdefer f.Close()\n\n\tfis, err := f.Readdir(-1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Iterate over every file and convert to metadata.\n\t// ModTime contains the accurate timestamp set by Chtimes in WriteLTXFile.\n\tinfos := make([]*ltx.FileInfo, 0, len(fis))\n\tfor _, fi := range fis {\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(fi.Name())\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t} else if minTXID \u003c seek {\n\t\t\tcontinue\n\t\t}\n\n\t\tinfos = append(infos, \u0026ltx.FileInfo{\n\t\t\tLevel: level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: fi.Size(),\n\t\t\tCreatedAt: fi.ModTime().UTC(),\n\t\t})\n\t}\n\n\treturn ltx.NewFileInfoSliceIterator(infos), nil\n}\n\n// OpenLTXFile returns a reader for an LTX file at the given position.\n// Returns os.ErrNotExist if no matching index/offset is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tpath := c.LTXFilePath(level, minTXID, maxTXID)\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, litestream.NewLTXError(\"open\", path, level, uint64(minTXID), uint64(maxTXID), err)\n\t}\n\n\tif offset \u003e 0 {\n\t\tif _, err := f.Seek(offset, io.SeekStart); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif size \u003e 0 {\n\t\treturn internal.LimitReadCloser(f, size), nil\n\t}\n\n\treturn f, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\n// Extracts timestamp from LTX header and sets it as the file's ModTime to preserve original creation time.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tvar fileInfo, dirInfo os.FileInfo\n\tif db := c.db(); db != nil {\n\t\tfileInfo, dirInfo = db.FileInfo(), db.DirInfo()\n\t}\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\tfullReader := io.MultiReader(\u0026buf, rd)\n\n\t// Ensure parent directory exists.\n\tfilename := c.LTXFilePath(level, minTXID, maxTXID)\n\tif err := internal.MkdirAll(filepath.Dir(filename), dirInfo); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Write LTX file to temporary file next to destination path.\n\ttmpFilename := filename + \".tmp\"\n\tf, err := internal.CreateFile(tmpFilename, fileInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Clean up temp file on error. On successful rename, the temp file\n\t// becomes the final file and should not be removed.\n\tdefer func() {\n\t\t_ = f.Close()\n\t\tif err != nil {\n\t\t\t_ = os.Remove(tmpFilename)\n\t\t}\n\t}()\n\n\tif _, err := io.Copy(f, fullReader); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := f.Sync(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Build metadata.\n\tfi, err := f.Stat()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tinfo = \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: fi.Size(),\n\t\tCreatedAt: timestamp,\n\t}\n\n\tif err := f.Close(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Move LTX file to final path when it has been written \u0026 synced to disk.\n\tif err := os.Rename(tmpFilename, filename); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := internal.FsyncDir(filepath.Dir(filename)); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Set file ModTime to preserve original timestamp\n\tif err := os.Chtimes(filename, timestamp, timestamp); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn info, nil\n}\n\n// DeleteLTXFiles deletes LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tfor _, info := range a {\n\t\tfilename := c.LTXFilePath(info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", filename)\n\n\t\tif err := os.Remove(filename); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// DeleteAll deletes all LTX files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := os.RemoveAll(c.path); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// GenerationsV3 returns a list of v0.3.x generation IDs in the replica.\nfunc (c *ReplicaClient) GenerationsV3(ctx context.Context) ([]string, error) {\n\tgenPath := filepath.Join(c.path, litestream.GenerationsDirV3)\n\tentries, err := os.ReadDir(genPath)\n\tif os.IsNotExist(err) {\n\t\treturn nil, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar generations []string\n\tfor _, entry := range entries {\n\t\tif entry.IsDir() \u0026\u0026 litestream.IsGenerationIDV3(entry.Name()) {\n\t\t\tgenerations = append(generations, entry.Name())\n\t\t}\n\t}\n\tslices.Sort(generations)\n\treturn generations, nil\n}\n\n// SnapshotsV3 returns snapshots for a generation, sorted by index.\nfunc (c *ReplicaClient) SnapshotsV3(ctx context.Context, generation string) ([]litestream.SnapshotInfoV3, error) {\n\tsnapshotsPath := filepath.Join(c.path, litestream.GenerationsDirV3, generation, litestream.SnapshotsDirV3)\n\tentries, err := os.ReadDir(snapshotsPath)\n\tif os.IsNotExist(err) {\n\t\treturn nil, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar snapshots []litestream.SnapshotInfoV3\n\tfor _, entry := range entries {\n\t\tif entry.IsDir() {\n\t\t\tcontinue\n\t\t}\n\t\tindex, err := litestream.ParseSnapshotFilenameV3(entry.Name())\n\t\tif err != nil {\n\t\t\tcontinue // skip invalid filenames\n\t\t}\n\t\tinfo, err := entry.Info()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tsnapshots = append(snapshots, litestream.SnapshotInfoV3{\n\t\t\tGeneration: generation,\n\t\t\tIndex: index,\n\t\t\tSize: info.Size(),\n\t\t\tCreatedAt: info.ModTime(),\n\t\t})\n\t}\n\tslices.SortFunc(snapshots, func(a, b litestream.SnapshotInfoV3) int {\n\t\treturn a.Index - b.Index\n\t})\n\treturn snapshots, nil\n}\n\n// WALSegmentsV3 returns WAL segments for a generation, sorted by index then offset.\nfunc (c *ReplicaClient) WALSegmentsV3(ctx context.Context, generation string) ([]litestream.WALSegmentInfoV3, error) {\n\twalPath := filepath.Join(c.path, litestream.GenerationsDirV3, generation, litestream.WALDirV3)\n\tentries, err := os.ReadDir(walPath)\n\tif os.IsNotExist(err) {\n\t\treturn nil, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar segments []litestream.WALSegmentInfoV3\n\tfor _, entry := range entries {\n\t\tif entry.IsDir() {\n\t\t\tcontinue\n\t\t}\n\t\tindex, offset, err := litestream.ParseWALSegmentFilenameV3(entry.Name())\n\t\tif err != nil {\n\t\t\tcontinue // skip invalid filenames\n\t\t}\n\t\tinfo, err := entry.Info()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tsegments = append(segments, litestream.WALSegmentInfoV3{\n\t\t\tGeneration: generation,\n\t\t\tIndex: index,\n\t\t\tOffset: offset,\n\t\t\tSize: info.Size(),\n\t\t\tCreatedAt: info.ModTime(),\n\t\t})\n\t}\n\tslices.SortFunc(segments, func(a, b litestream.WALSegmentInfoV3) int {\n\t\tif a.Index != b.Index {\n\t\t\treturn a.Index - b.Index\n\t\t}\n\t\treturn cmp.Compare(a.Offset, b.Offset)\n\t})\n\treturn segments, nil\n}\n\n// OpenSnapshotV3 opens a v0.3.x snapshot file for reading.\n// The returned reader provides LZ4-decompressed data.\nfunc (c *ReplicaClient) OpenSnapshotV3(ctx context.Context, generation string, index int) (io.ReadCloser, error) {\n\tpath := filepath.Join(c.path, litestream.GenerationsDirV3, generation, litestream.SnapshotsDirV3, litestream.FormatSnapshotFilenameV3(index))\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn internal.NewLZ4Reader(f), nil\n}\n\n// OpenWALSegmentV3 opens a v0.3.x WAL segment file for reading.\n// The returned reader provides LZ4-decompressed data.\nfunc (c *ReplicaClient) OpenWALSegmentV3(ctx context.Context, generation string, index int, offset int64) (io.ReadCloser, error) {\n\tpath := filepath.Join(c.path, litestream.GenerationsDirV3, generation, litestream.WALDirV3, litestream.FormatWALSegmentFilenameV3(index, offset))\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn internal.NewLZ4Reader(f), nil\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"cmp","path":"cmp","span":{"start":[5,1],"end":[5,7],"bytes":[32,38]}},{"name":"context","path":"context","span":{"start":[6,1],"end":[6,11],"bytes":[39,49]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[50,56]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[57,62]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[63,74]}},{"name":"url","path":"net/url","span":{"start":[10,1],"end":[10,11],"bytes":[75,85]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[86,91]}},{"name":"filepath","path":"path/filepath","span":{"start":[12,1],"end":[12,17],"bytes":[92,108]}},{"name":"slices","path":"slices","span":{"start":[13,1],"end":[13,10],"bytes":[109,118]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[119,126]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[16,1],"end":[16,27],"bytes":[128,154]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[18,1],"end":[18,37],"bytes":[156,192]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[19,1],"end":[19,46],"bytes":[193,238]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient","kind":"struct","span":{"start":[33,1],"end":[38,2],"bytes":[598,712]},"callables":{"github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll","kind":"method","span":{"start":[255,1],"end":[260,2],"bytes":[6926,7087]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[255,1],"end":[255,63],"bytes":[6926,6988]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"256:12":{"kind":"call","span":{"start":[256,12],"end":[256,32],"bytes":[7000,7020]},"callee":null},"256:49":{"kind":"call","span":{"start":[256,49],"end":[256,67],"bytes":[7037,7055]},"callee":null}}},"github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[241,1],"end":[252,2],"bytes":[6475,6888]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[241,1],"end":[241,87],"bytes":[6475,6561]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[241,1],"end":[241,87],"bytes":[6475,6561]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"243:15":{"kind":"call","span":{"start":[243,15],"end":[243,68],"bytes":[6602,6655]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath"},"245:3":{"kind":"call","span":{"start":[245,3],"end":[245,127],"bytes":[6659,6783]},"callee":null},"247:13":{"kind":"call","span":{"start":[247,13],"end":[247,32],"bytes":[6797,6816]},"callee":null},"247:49":{"kind":"call","span":{"start":[247,49],"end":[247,67],"bytes":[6833,6851]},"callee":null}}},"github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","kind":"method","span":{"start":[263,1],"end":[280,2],"bytes":[7162,7665]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[263,1],"end":[263,79],"bytes":[7162,7240]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"264:13":{"kind":"call","span":{"start":[264,13],"end":[264,63],"bytes":[7253,7303]},"callee":null},"265:18":{"kind":"call","span":{"start":[265,18],"end":[265,37],"bytes":[7321,7340]},"callee":null},"266:5":{"kind":"call","span":{"start":[266,5],"end":[266,23],"bytes":[7345,7363]},"callee":null},"274:23":{"kind":"call","span":{"start":[274,23],"end":[274,64],"bytes":[7511,7552]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3"},"274:51":{"kind":"call","span":{"start":[274,51],"end":[274,63],"bytes":[7539,7551]},"callee":null},"274:6":{"kind":"call","span":{"start":[274,6],"end":[274,19],"bytes":[7494,7507]},"callee":null},"275:18":{"kind":"call","span":{"start":[275,18],"end":[275,51],"bytes":[7572,7605]},"callee":null},"275:38":{"kind":"call","span":{"start":[275,38],"end":[275,50],"bytes":[7592,7604]},"callee":null},"278:2":{"kind":"call","span":{"start":[278,2],"end":[278,26],"bytes":[7614,7638]},"callee":null}}},"github.com/benbjohnson/litestream/file.ReplicaClient.Init":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Init","kind":"method","span":{"start":[76,1],"end":[78,2],"bytes":[1816,1887]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[76,1],"end":[76,58],"bytes":[1816,1873]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","kind":"method","span":{"start":[91,1],"end":[93,2],"bytes":[2237,2405]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","parameters":[{"name":"level","type":"int","span":{"start":[91,1],"end":[91,83],"bytes":[2237,2319]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[91,1],"end":[91,83],"bytes":[2237,2319]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[91,1],"end":[91,83],"bytes":[2237,2319]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"92:28":{"kind":"call","span":{"start":[92,28],"end":[92,83],"bytes":[2347,2402]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"92:9":{"kind":"call","span":{"start":[92,9],"end":[92,84],"bytes":[2328,2403]},"callee":null}}},"github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","kind":"method","span":{"start":[97,1],"end":[132,2],"bytes":[2596,3521]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[97,1],"end":[97,126],"bytes":[2596,2721]}},{"name":"level","type":"int","span":{"start":[97,1],"end":[97,126],"bytes":[2596,2721]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[97,1],"end":[97,126],"bytes":[2596,2721]}},{"name":"useMetadata","type":"bool","span":{"start":[97,1],"end":[97,126],"bytes":[2596,2721]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"100:10":{"kind":"call","span":{"start":[100,10],"end":[100,43],"bytes":[2797,2830]},"callee":null},"104:8":{"kind":"call","span":{"start":[104,8],"end":[104,17],"bytes":[2888,2897]},"callee":null},"106:14":{"kind":"call","span":{"start":[106,14],"end":[106,27],"bytes":[2912,2925]},"callee":null},"113:11":{"kind":"call","span":{"start":[113,11],"end":[113,45],"bytes":[3104,3138]},"callee":null},"113:36":{"kind":"call","span":{"start":[113,36],"end":[113,44],"bytes":[3129,3137]},"callee":null},"115:28":{"kind":"call","span":{"start":[115,28],"end":[115,56],"bytes":[3192,3220]},"callee":null},"115:46":{"kind":"call","span":{"start":[115,46],"end":[115,55],"bytes":[3210,3219]},"callee":null},"122:11":{"kind":"call","span":{"start":[122,11],"end":[128,5],"bytes":[3307,3466]},"callee":null},"126:15":{"kind":"call","span":{"start":[126,15],"end":[126,24],"bytes":[3417,3426]},"callee":null},"127:15":{"kind":"call","span":{"start":[127,15],"end":[127,27],"bytes":[3442,3454]},"callee":null},"131:9":{"kind":"call","span":{"start":[131,9],"end":[131,44],"bytes":[3479,3514]},"callee":null},"98:12":{"kind":"call","span":{"start":[98,12],"end":[98,41],"bytes":[2733,2762]},"callee":null},"98:20":{"kind":"call","span":{"start":[98,20],"end":[98,40],"bytes":[2741,2761]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir"},"99:5":{"kind":"call","span":{"start":[99,5],"end":[99,23],"bytes":[2767,2785]},"callee":null}}},"github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","kind":"method","span":{"start":[86,1],"end":[88,2],"bytes":[2064,2187]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","parameters":[{"name":"level","type":"int","span":{"start":[86,1],"end":[86,56],"bytes":[2064,2119]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"87:28":{"kind":"call","span":{"start":[87,28],"end":[87,65],"bytes":[2147,2184]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"87:9":{"kind":"call","span":{"start":[87,9],"end":[87,66],"bytes":[2128,2185]},"callee":null}}},"github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[136,1],"end":[154,2],"bytes":[3658,4174]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"level","type":"int","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"offset","type":"int64","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"size","type":"int64","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"137:10":{"kind":"call","span":{"start":[137,10],"end":[137,48],"bytes":[3807,3845]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath"},"138:12":{"kind":"call","span":{"start":[138,12],"end":[138,25],"bytes":[3857,3870]},"callee":null},"140:15":{"kind":"call","span":{"start":[140,15],"end":[140,97],"bytes":[3902,3984]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"140:59":{"kind":"call","span":{"start":[140,59],"end":[140,74],"bytes":[3946,3961]},"callee":null},"140:76":{"kind":"call","span":{"start":[140,76],"end":[140,91],"bytes":[3963,3978]},"callee":null},"144:16":{"kind":"call","span":{"start":[144,16],"end":[144,44],"bytes":[4021,4049]},"callee":null},"150:10":{"kind":"call","span":{"start":[150,10],"end":[150,43],"bytes":[4115,4148]},"callee":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","kind":"method","span":{"start":[360,1],"end":[367,2],"bytes":[9957,10317]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[360,1],"end":[360,115],"bytes":[9957,10071]}},{"name":"generation","type":"string","span":{"start":[360,1],"end":[360,115],"bytes":[9957,10071]}},{"name":"index","type":"int","span":{"start":[360,1],"end":[360,115],"bytes":[9957,10071]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"361:10":{"kind":"call","span":{"start":[361,10],"end":[361,143],"bytes":[10081,10214]},"callee":null},"361:100":{"kind":"call","span":{"start":[361,100],"end":[361,142],"bytes":[10171,10213]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3"},"362:12":{"kind":"call","span":{"start":[362,12],"end":[362,25],"bytes":[10226,10239]},"callee":null},"366:9":{"kind":"call","span":{"start":[366,9],"end":[366,33],"bytes":[10286,10310]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","kind":"method","span":{"start":[371,1],"end":[378,2],"bytes":[10439,10819]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[371,1],"end":[371,131],"bytes":[10439,10569]}},{"name":"generation","type":"string","span":{"start":[371,1],"end":[371,131],"bytes":[10439,10569]}},{"name":"index","type":"int","span":{"start":[371,1],"end":[371,131],"bytes":[10439,10569]}},{"name":"offset","type":"int64","span":{"start":[371,1],"end":[371,131],"bytes":[10439,10569]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"372:10":{"kind":"call","span":{"start":[372,10],"end":[372,147],"bytes":[10579,10716]},"callee":null},"372:94":{"kind":"call","span":{"start":[372,94],"end":[372,146],"bytes":[10663,10715]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3"},"373:12":{"kind":"call","span":{"start":[373,12],"end":[373,25],"bytes":[10728,10741]},"callee":null},"377:9":{"kind":"call","span":{"start":[377,9],"end":[377,33],"bytes":[10788,10812]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.Path":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Path","kind":"method","span":{"start":[81,1],"end":[83,2],"bytes":[1956,2012]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.Path","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/file.ReplicaClient.SetLogger":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SetLogger","kind":"method","span":{"start":[48,1],"end":[50,2],"bytes":[928,1034]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[48,1],"end":[48,57],"bytes":[928,984]}}],"metrics":{"cyclomatic":1},"body":{"49:13":{"kind":"call","span":{"start":[49,13],"end":[49,48],"bytes":[997,1032]},"callee":null}}},"github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","kind":"method","span":{"start":[283,1],"end":[316,2],"bytes":[7735,8698]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[283,1],"end":[283,115],"bytes":[7735,7849]}},{"name":"generation","type":"string","span":{"start":[283,1],"end":[283,115],"bytes":[7735,7849]}}],"return_type":"([]github.com/benbjohnson/litestream.SnapshotInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"284:19":{"kind":"call","span":{"start":[284,19],"end":[284,108],"bytes":[7868,7957]},"callee":null},"285:18":{"kind":"call","span":{"start":[285,18],"end":[285,43],"bytes":[7975,8000]},"callee":null},"286:5":{"kind":"call","span":{"start":[286,5],"end":[286,23],"bytes":[8005,8023]},"callee":null},"294:6":{"kind":"call","span":{"start":[294,6],"end":[294,19],"bytes":[8171,8184]},"callee":null},"297:17":{"kind":"call","span":{"start":[297,17],"end":[297,65],"bytes":[8219,8267]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3"},"297:52":{"kind":"call","span":{"start":[297,52],"end":[297,64],"bytes":[8254,8266]},"callee":null},"301:16":{"kind":"call","span":{"start":[301,16],"end":[301,28],"bytes":[8343,8355]},"callee":null},"305:15":{"kind":"call","span":{"start":[305,15],"end":[310,5],"bytes":[8411,8568]},"callee":null},"308:16":{"kind":"call","span":{"start":[308,16],"end":[308,27],"bytes":[8520,8531]},"callee":null},"309:16":{"kind":"call","span":{"start":[309,16],"end":[309,30],"bytes":[8548,8562]},"callee":null},"312:2":{"kind":"call","span":{"start":[312,2],"end":[314,4],"bytes":[8573,8673]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3.closure_1","kind":"function","span":{"start":[312,1],"end":[314,4],"bytes":[8572,8673]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3.closure_1","parameters":[{"name":"a","type":"github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[312,1],"end":[312,71],"bytes":[8572,8642]}},{"name":"b","type":"github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[312,1],"end":[312,71],"bytes":[8572,8642]}}],"return_type":"int","body":{}}}},"github.com/benbjohnson/litestream/file.ReplicaClient.Type":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Type","kind":"method","span":{"start":[71,1],"end":[73,2],"bytes":[1670,1737]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","kind":"method","span":{"start":[319,1],"end":[356,2],"bytes":[8785,9840]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[319,1],"end":[319,119],"bytes":[8785,8903]}},{"name":"generation","type":"string","span":{"start":[319,1],"end":[319,119],"bytes":[8785,8903]}}],"return_type":"([]github.com/benbjohnson/litestream.WALSegmentInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"320:13":{"kind":"call","span":{"start":[320,13],"end":[320,96],"bytes":[8916,8999]},"callee":null},"321:18":{"kind":"call","span":{"start":[321,18],"end":[321,37],"bytes":[9017,9036]},"callee":null},"322:5":{"kind":"call","span":{"start":[322,5],"end":[322,23],"bytes":[9041,9059]},"callee":null},"330:6":{"kind":"call","span":{"start":[330,6],"end":[330,19],"bytes":[9208,9221]},"callee":null},"333:25":{"kind":"call","span":{"start":[333,25],"end":[333,75],"bytes":[9264,9314]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3"},"333:62":{"kind":"call","span":{"start":[333,62],"end":[333,74],"bytes":[9301,9313]},"callee":null},"337:16":{"kind":"call","span":{"start":[337,16],"end":[337,28],"bytes":[9390,9402]},"callee":null},"341:14":{"kind":"call","span":{"start":[341,14],"end":[347,5],"bytes":[9457,9638]},"callee":null},"345:16":{"kind":"call","span":{"start":[345,16],"end":[345,27],"bytes":[9590,9601]},"callee":null},"346:16":{"kind":"call","span":{"start":[346,16],"end":[346,30],"bytes":[9618,9632]},"callee":null},"349:2":{"kind":"call","span":{"start":[349,2],"end":[354,4],"bytes":[9643,9816]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3.closure_1","kind":"function","span":{"start":[349,1],"end":[354,4],"bytes":[9642,9816]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3.closure_1","parameters":[{"name":"a","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[349,1],"end":[349,72],"bytes":[9642,9713]}},{"name":"b","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[349,1],"end":[349,72],"bytes":[9642,9713]}}],"return_type":"int","body":{"353:10":{"kind":"call","span":{"start":[353,10],"end":[353,41],"bytes":[9781,9812]},"callee":null}}}}},"github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[158,1],"end":[238,2],"bytes":[4335,6436]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}},{"name":"level","type":"int","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}},{"name":"rd","type":"io.Reader","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"160:11":{"kind":"call","span":{"start":[160,11],"end":[160,17],"bytes":[4524,4530]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db"},"161:23":{"kind":"call","span":{"start":[161,23],"end":[161,36],"bytes":[4566,4579]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.FileInfo"},"161:38":{"kind":"call","span":{"start":[161,38],"end":[161,50],"bytes":[4581,4593]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo"},"166:15":{"kind":"call","span":{"start":[166,15],"end":[166,37],"bytes":[4707,4729]},"callee":null},"169:17":{"kind":"call","span":{"start":[169,17],"end":[169,42],"bytes":[4785,4810]},"callee":null},"171:15":{"kind":"call","span":{"start":[171,15],"end":[171,71],"bytes":[4842,4898]},"callee":null},"173:15":{"kind":"call","span":{"start":[173,15],"end":[173,44],"bytes":[4916,4945]},"callee":null},"176:16":{"kind":"call","span":{"start":[176,16],"end":[176,40],"bytes":[5014,5038]},"callee":null},"179:14":{"kind":"call","span":{"start":[179,14],"end":[179,52],"bytes":[5089,5127]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath"},"180:12":{"kind":"call","span":{"start":[180,12],"end":[180,62],"bytes":[5139,5189]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"180:30":{"kind":"call","span":{"start":[180,30],"end":[180,52],"bytes":[5157,5179]},"callee":null},"186:12":{"kind":"call","span":{"start":[186,12],"end":[186,54],"bytes":[5334,5376]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile"},"193:8":{"kind":"call","span":{"start":[193,8],"end":[198,5],"bytes":[5546,5627]},"callee":null},"200:15":{"kind":"call","span":{"start":[200,15],"end":[200,37],"bytes":[5643,5665]},"callee":null},"203:12":{"kind":"call","span":{"start":[203,12],"end":[203,20],"bytes":[5712,5720]},"callee":null},"208:13":{"kind":"call","span":{"start":[208,13],"end":[208,21],"bytes":[5789,5797]},"callee":null},"216:14":{"kind":"call","span":{"start":[216,14],"end":[216,23],"bytes":[5936,5945]},"callee":null},"220:12":{"kind":"call","span":{"start":[220,12],"end":[220,21],"bytes":[5986,5995]},"callee":null},"225:12":{"kind":"call","span":{"start":[225,12],"end":[225,44],"bytes":[6118,6150]},"callee":null},"228:12":{"kind":"call","span":{"start":[228,12],"end":[228,53],"bytes":[6197,6238]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"228:30":{"kind":"call","span":{"start":[228,30],"end":[228,52],"bytes":[6215,6237]},"callee":null},"233:12":{"kind":"call","span":{"start":[233,12],"end":[233,54],"bytes":[6338,6380]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile.closure_1","kind":"function","span":{"start":[193,1],"end":[198,5],"bytes":[5539,5627]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile.closure_1","parameters":[],"body":{"194:7":{"kind":"call","span":{"start":[194,7],"end":[194,16],"bytes":[5561,5570]},"callee":null},"196:8":{"kind":"call","span":{"start":[196,8],"end":[196,30],"bytes":[5596,5618]},"callee":null}}}}},"github.com/benbjohnson/litestream/file.ReplicaClient.db":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db","kind":"method","span":{"start":[63,1],"end":[68,2],"bytes":[1516,1625]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.db","parameters":[],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":2},"body":{"67:9":{"kind":"call","span":{"start":[67,9],"end":[67,23],"bytes":[1609,1623]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB"}}}},"fields":{"Replica":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/Replica","kind":"field","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[36,1],"end":[36,29],"bytes":[660,688]}},"logger":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[37,1],"end":[37,22],"bytes":[689,710]}},"path":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/path","kind":"field","type":"string","span":{"start":[34,1],"end":[34,33],"bytes":[626,658]}}}}},"functions":{"github.com/benbjohnson/litestream/file.NewReplicaClient":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","kind":"function","span":{"start":[41,1],"end":[46,2],"bytes":[775,926]},"signature":"github.com/benbjohnson/litestream/file.NewReplicaClient","parameters":[{"name":"path","type":"string","span":{"start":[41,1],"end":[41,52],"bytes":[775,826]}}],"return_type":"*github.com/benbjohnson/litestream/file.ReplicaClient","metrics":{"cyclomatic":1},"body":{"43:11":{"kind":"call","span":{"start":[43,11],"end":[43,25],"bytes":[861,875]},"callee":null}}},"github.com/benbjohnson/litestream/file.NewReplicaClientFromURL":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClientFromURL","kind":"function","span":{"start":[54,1],"end":[60,2],"bytes":[1172,1472]},"signature":"github.com/benbjohnson/litestream/file.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}},{"name":"host","type":"string","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}},{"name":"urlPath","type":"string","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}},{"name":"query","type":"net/url.Values","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"57:15":{"kind":"call","span":{"start":[57,15],"end":[57,55],"bytes":[1388,1428]},"callee":null},"59:9":{"kind":"call","span":{"start":[59,9],"end":[59,34],"bytes":[1440,1465]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient"}}},"github.com/benbjohnson/litestream/file.init":{"id":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.init","kind":"function","span":{"start":[22,1],"end":[24,2],"bytes":[242,331]},"signature":"github.com/benbjohnson/litestream/file.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"23:2":{"kind":"call","span":{"start":[23,2],"end":[23,74],"bytes":[257,329]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}}},"content_hash":"e962698493a721417236820987741a07fae6650a57f81bb5de664b58fc1300df"},"gs/replica_client.go":{"id":"can://go/litestream/gs/replica_client.go","kind":"module","span":{"start":[1,1],"end":[316,1],"bytes":[0,8672]},"package":"gs","source":"package gs\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"sync\"\n\t\"time\"\n\n\t\"cloud.google.com/go/storage\"\n\t\"github.com/superfly/ltx\"\n\t\"google.golang.org/api/iterator\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"gs\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"gs\"\n\n// MetadataKeyTimestamp is the metadata key for storing LTX file timestamps in GCS.\nconst MetadataKeyTimestamp = \"litestream-timestamp\"\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to Google Cloud Storage.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tclient *storage.Client // gs client\n\tbkt *storage.BucketHandle // gs bucket handle\n\tlogger *slog.Logger\n\n\t// GS bucket information\n\tBucket string\n\tPath string\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tif host == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for gs replica URL\")\n\t}\n\n\tclient := NewReplicaClient()\n\tclient.Bucket = host\n\tclient.Path = urlPath\n\treturn client, nil\n}\n\n// Type returns \"gs\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to GS. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) (err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.client != nil {\n\t\treturn nil\n\t}\n\n\tif c.client, err = storage.NewClient(ctx); err != nil {\n\t\treturn fmt.Errorf(\"failed to create GCS client (bucket: %s): %w\", c.Bucket, err)\n\t}\n\tc.bkt = c.client.Bucket(c.Bucket)\n\n\treturn nil\n}\n\n// DeleteAll deletes all LTX files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t// Iterate over every object and delete it.\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"LIST\").Inc()\n\tfor it := c.bkt.Objects(ctx, \u0026storage.Query{Prefix: c.Path + \"/\"}); ; {\n\t\tattrs, err := it.Next()\n\t\tif errors.Is(err, iterator.Done) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"failed to list objects in GCS bucket %s (path: %s): %w\", c.Bucket, c.Path, err)\n\t\t}\n\n\t\tif err := c.bkt.Object(attrs.Name).Delete(ctx); isNotExists(err) {\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"gs: cannot delete object %q: %w\", attrs.Name, err)\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\t// log.Printf(\"%s(%s): retainer: deleting\", r.db.Path(), r.Name())\n\n\treturn nil\n}\n\n// LTXFiles returns an iterator over all available LTX files for a level.\n// GCS always uses accurate timestamps from metadata since they're included in LIST operations at zero cost.\n// The useMetadata parameter is ignored.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tdir := litestream.LTXLevelDir(c.Path, level)\n\tquery := \u0026storage.Query{Prefix: dir + \"/\"}\n\tif seek != 0 {\n\t\tquery.StartOffset = query.Prefix + seek.String()\n\t}\n\n\treturn newLTXFileIterator(c.bkt.Objects(ctx, query), c, level), nil\n}\n\n// WriteLTXFile writes an LTX file from rd to a remote path.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn info, err\n\t}\n\n\tkey := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\tfullReader := io.MultiReader(\u0026buf, rd)\n\n\twriteCtx, cancel := context.WithCancel(ctx)\n\tdefer cancel()\n\tw := c.bkt.Object(key).NewWriter(writeCtx)\n\n\t// Store timestamp in GCS metadata for accurate timestamp retrieval\n\tw.Metadata = map[string]string{\n\t\tMetadataKeyTimestamp: timestamp.Format(time.RFC3339Nano),\n\t}\n\n\tn, err := io.Copy(w, fullReader)\n\tif err != nil {\n\t\tcancel()\n\t\treturn info, err\n\t} else if err := w.Close(); err != nil {\n\t\treturn info, err\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(n))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: n,\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// OpenLTXFile returns a reader for a given LTX file.\n// Returns os.ErrNotExist if no matching index/offset is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\t// In the GCS client, a length of -1 reads to EOF while 0 returns no data.\n\t// Callers pass size=0 to indicate \"entire object\" so translate that here.\n\t// See: https://pkg.go.dev/cloud.google.com/go/storage#ObjectHandle.NewRangeReader\n\tlength := size\n\tif length \u003c= 0 {\n\t\tlength = -1\n\t}\n\n\tr, err := c.bkt.Object(key).NewRangeReader(ctx, offset, length)\n\tif isNotExists(err) {\n\t\treturn nil, os.ErrNotExist\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Add(float64(r.Attrs.Size))\n\n\treturn r, nil\n}\n\n// DeleteLTXFiles deletes a set of LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, info := range a {\n\t\tkey := litestream.LTXFilePath(c.Path, info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"key\", key)\n\n\t\tif err := c.bkt.Object(key).Delete(ctx); err != nil \u0026\u0026 !isNotExists(err) {\n\t\t\treturn fmt.Errorf(\"gs: cannot delete ltx file %q: %w\", key, err)\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\ntype ltxFileIterator struct {\n\tit *storage.ObjectIterator\n\tclient *ReplicaClient\n\tlevel int\n\tinfo *ltx.FileInfo\n\terr error\n}\n\nfunc newLTXFileIterator(it *storage.ObjectIterator, client *ReplicaClient, level int) *ltxFileIterator {\n\treturn \u0026ltxFileIterator{\n\t\tit: it,\n\t\tclient: client,\n\t\tlevel: level,\n\t}\n}\n\nfunc (itr *ltxFileIterator) Close() (err error) {\n\treturn itr.err\n}\n\nfunc (itr *ltxFileIterator) Next() bool {\n\t// Exit if an error has already occurred.\n\tif itr.err != nil {\n\t\treturn false\n\t}\n\n\tfor {\n\t\t// Fetch next object.\n\t\tattrs, err := itr.it.Next()\n\t\tif errors.Is(err, iterator.Done) {\n\t\t\treturn false\n\t\t} else if err != nil {\n\t\t\titr.err = err\n\t\t\treturn false\n\t\t}\n\n\t\t// Parse index \u0026 offset, otherwise skip to the next object.\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(path.Base(attrs.Name))\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Always use accurate timestamp from metadata since it's zero-cost\n\t\t// GCS includes metadata in LIST operations, so no extra API call needed\n\t\tcreatedAt := attrs.Created.UTC()\n\t\tif attrs.Metadata != nil {\n\t\t\tif ts, ok := attrs.Metadata[MetadataKeyTimestamp]; ok {\n\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, ts); err == nil {\n\t\t\t\t\tcreatedAt = parsed\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Store current snapshot and return.\n\t\titr.info = \u0026ltx.FileInfo{\n\t\t\tLevel: itr.level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: attrs.Size,\n\t\t\tCreatedAt: createdAt,\n\t\t}\n\n\t\treturn true\n\t}\n}\n\nfunc (itr *ltxFileIterator) Err() error { return itr.err }\n\nfunc (itr *ltxFileIterator) Item() *ltx.FileInfo {\n\treturn itr.info\n}\n\nfunc isNotExists(err error) bool {\n\treturn errors.Is(err, storage.ErrObjectNotExist)\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[21,29]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[30,40]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[41,50]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[51,57]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[58,63]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[64,75]}},{"name":"url","path":"net/url","span":{"start":[10,1],"end":[10,11],"bytes":[76,86]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[87,92]}},{"name":"path","path":"path","span":{"start":[12,1],"end":[12,8],"bytes":[93,100]}},{"name":"sync","path":"sync","span":{"start":[13,1],"end":[13,8],"bytes":[101,108]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[109,116]}},{"name":"storage","path":"cloud.google.com/go/storage","span":{"start":[16,1],"end":[16,31],"bytes":[118,148]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[17,1],"end":[17,27],"bytes":[149,175]}},{"name":"iterator","path":"google.golang.org/api/iterator","span":{"start":[18,1],"end":[18,34],"bytes":[176,209]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[20,1],"end":[20,37],"bytes":[211,247]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[21,1],"end":[21,46],"bytes":[248,293]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient","kind":"struct","span":{"start":[37,1],"end":[46,2],"bytes":[745,964]},"callables":{"github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","kind":"method","span":{"start":[95,1],"end":[121,2],"bytes":[2266,3145]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[95,1],"end":[95,63],"bytes":[2266,2328]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"101:2":{"kind":"call","span":{"start":[101,2],"end":[101,78],"bytes":[2429,2505]},"callee":null},"102:12":{"kind":"call","span":{"start":[102,12],"end":[102,68],"bytes":[2523,2579]},"callee":null},"103:17":{"kind":"call","span":{"start":[103,17],"end":[103,26],"bytes":[2601,2610]},"callee":null},"104:6":{"kind":"call","span":{"start":[104,6],"end":[104,35],"bytes":[2616,2645]},"callee":null},"107:11":{"kind":"call","span":{"start":[107,11],"end":[107,102],"bytes":[2692,2783]},"callee":null},"110:13":{"kind":"call","span":{"start":[110,13],"end":[110,37],"bytes":[2801,2825]},"callee":null},"110:51":{"kind":"call","span":{"start":[110,51],"end":[110,67],"bytes":[2839,2855]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists"},"113:11":{"kind":"call","span":{"start":[113,11],"end":[113,73],"bytes":[2905,2967]},"callee":null},"115:3":{"kind":"call","span":{"start":[115,3],"end":[115,81],"bytes":[2974,3052]},"callee":null},"96:12":{"kind":"call","span":{"start":[96,12],"end":[96,23],"bytes":[2340,2351]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[222,1],"end":[239,2],"bytes":[6379,7002]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[222,1],"end":[222,87],"bytes":[6379,6465]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[222,1],"end":[222,87],"bytes":[6379,6465]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"223:12":{"kind":"call","span":{"start":[223,12],"end":[223,23],"bytes":[6477,6488]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"228:10":{"kind":"call","span":{"start":[228,10],"end":[228,80],"bytes":[6555,6625]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"230:3":{"kind":"call","span":{"start":[230,3],"end":[230,121],"bytes":[6629,6747]},"callee":null},"232:13":{"kind":"call","span":{"start":[232,13],"end":[232,30],"bytes":[6761,6778]},"callee":null},"232:59":{"kind":"call","span":{"start":[232,59],"end":[232,75],"bytes":[6807,6823]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists"},"233:11":{"kind":"call","span":{"start":[233,11],"end":[233,68],"bytes":[6836,6893]},"callee":null},"235:3":{"kind":"call","span":{"start":[235,3],"end":[235,81],"bytes":[6900,6978]},"callee":null}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.Init":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","kind":"method","span":{"start":[78,1],"end":[92,2],"bytes":[1898,2228]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[78,1],"end":[78,64],"bytes":[1898,1961]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"79:2":{"kind":"call","span":{"start":[79,2],"end":[79,13],"bytes":[1963,1974]},"callee":null},"80:8":{"kind":"call","span":{"start":[80,8],"end":[80,21],"bytes":[1982,1995]},"callee":null},"86:21":{"kind":"call","span":{"start":[86,21],"end":[86,43],"bytes":[2056,2078]},"callee":null},"87:10":{"kind":"call","span":{"start":[87,10],"end":[87,83],"bytes":[2102,2175]},"callee":null},"89:10":{"kind":"call","span":{"start":[89,10],"end":[89,35],"bytes":[2188,2213]},"callee":null}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","kind":"method","span":{"start":[126,1],"end":[138,2],"bytes":[3371,3787]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[126,1],"end":[126,126],"bytes":[3371,3496]}},{"name":"level","type":"int","span":{"start":[126,1],"end":[126,126],"bytes":[3371,3496]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[126,1],"end":[126,126],"bytes":[3371,3496]}},{"name":"useMetadata","type":"bool","span":{"start":[126,1],"end":[126,126],"bytes":[3371,3496]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"127:12":{"kind":"call","span":{"start":[127,12],"end":[127,23],"bytes":[3508,3519]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"131:9":{"kind":"call","span":{"start":[131,9],"end":[131,46],"bytes":[3564,3601]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"134:38":{"kind":"call","span":{"start":[134,38],"end":[134,51],"bytes":[3699,3712]},"callee":null},"137:28":{"kind":"call","span":{"start":[137,28],"end":[137,53],"bytes":[3744,3769]},"callee":null},"137:9":{"kind":"call","span":{"start":[137,9],"end":[137,64],"bytes":[3725,3780]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.newLTXFileIterator"}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[193,1],"end":[219,2],"bytes":[5412,6331]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"level","type":"int","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"offset","type":"int64","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"size","type":"int64","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"194:12":{"kind":"call","span":{"start":[194,12],"end":[194,23],"bytes":[5563,5574]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"198:9":{"kind":"call","span":{"start":[198,9],"end":[198,64],"bytes":[5619,5674]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"208:12":{"kind":"call","span":{"start":[208,12],"end":[208,29],"bytes":[5975,5992]},"callee":null},"209:5":{"kind":"call","span":{"start":[209,5],"end":[209,21],"bytes":[6033,6049]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists"},"215:2":{"kind":"call","span":{"start":[215,2],"end":[215,77],"bytes":[6128,6203]},"callee":null},"216:2":{"kind":"call","span":{"start":[216,2],"end":[216,77],"bytes":[6211,6286]},"callee":null},"216:82":{"kind":"call","span":{"start":[216,82],"end":[216,103],"bytes":[6291,6312]},"callee":null}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.SetLogger":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.SetLogger","kind":"method","span":{"start":[55,1],"end":[57,2],"bytes":[1153,1259]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[55,1],"end":[55,57],"bytes":[1153,1209]}}],"metrics":{"cyclomatic":1},"body":{"56:13":{"kind":"call","span":{"start":[56,13],"end":[56,48],"bytes":[1222,1257]},"callee":null}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.Type":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Type","kind":"method","span":{"start":[73,1],"end":[75,2],"bytes":[1757,1824]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[141,1],"end":[189,2],"bytes":[3850,5292]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}},{"name":"level","type":"int","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}},{"name":"rd","type":"io.Reader","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"142:12":{"kind":"call","span":{"start":[142,12],"end":[142,23],"bytes":[4005,4016]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"146:9":{"kind":"call","span":{"start":[146,9],"end":[146,64],"bytes":[4062,4117]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"150:15":{"kind":"call","span":{"start":[150,15],"end":[150,37],"bytes":[4228,4250]},"callee":null},"153:17":{"kind":"call","span":{"start":[153,17],"end":[153,42],"bytes":[4306,4331]},"callee":null},"155:15":{"kind":"call","span":{"start":[155,15],"end":[155,71],"bytes":[4363,4419]},"callee":null},"157:15":{"kind":"call","span":{"start":[157,15],"end":[157,44],"bytes":[4437,4466]},"callee":null},"160:16":{"kind":"call","span":{"start":[160,16],"end":[160,40],"bytes":[4535,4559]},"callee":null},"162:22":{"kind":"call","span":{"start":[162,22],"end":[162,45],"bytes":[4582,4605]},"callee":null},"163:8":{"kind":"call","span":{"start":[163,8],"end":[163,16],"bytes":[4613,4621]},"callee":null},"164:7":{"kind":"call","span":{"start":[164,7],"end":[164,24],"bytes":[4628,4645]},"callee":null},"168:25":{"kind":"call","span":{"start":[168,25],"end":[168,59],"bytes":[4793,4827]},"callee":null},"171:12":{"kind":"call","span":{"start":[171,12],"end":[171,34],"bytes":[4844,4866]},"callee":null},"173:3":{"kind":"call","span":{"start":[173,3],"end":[173,11],"bytes":[4886,4894]},"callee":null},"175:19":{"kind":"call","span":{"start":[175,19],"end":[175,28],"bytes":[4932,4941]},"callee":null},"179:2":{"kind":"call","span":{"start":[179,2],"end":[179,77],"bytes":[4980,5055]},"callee":null},"180:2":{"kind":"call","span":{"start":[180,2],"end":[180,77],"bytes":[5063,5138]},"callee":null},"180:82":{"kind":"call","span":{"start":[180,82],"end":[180,92],"bytes":[5143,5153]},"callee":null}}}},"fields":{"Bucket":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/Bucket","kind":"field","type":"string","span":{"start":[44,1],"end":[44,15],"bytes":[933,947]}},"Path":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[45,1],"end":[45,15],"bytes":[948,962]}},"bkt":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/bkt","kind":"field","type":"*cloud.google.com/go/storage.BucketHandle","span":{"start":[40,1],"end":[40,50],"bytes":[835,884]}},"client":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/client","kind":"field","type":"*cloud.google.com/go/storage.Client","span":{"start":[39,1],"end":[39,43],"bytes":[792,834]}},"logger":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[41,1],"end":[41,21],"bytes":[885,905]}},"mu":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[38,1],"end":[38,19],"bytes":[773,791]}}}},"ltxFileIterator":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator","kind":"struct","span":{"start":[241,1],"end":[247,2],"bytes":[7004,7138]},"callables":{"github.com/benbjohnson/litestream/gs.ltxFileIterator.Close":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Close","kind":"method","span":{"start":[257,1],"end":[259,2],"bytes":[7326,7393]},"signature":"github.com/benbjohnson/litestream/gs.ltxFileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/gs.ltxFileIterator.Err":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Err","kind":"method","span":{"start":[307,1],"end":[307,59],"bytes":[8454,8512]},"signature":"github.com/benbjohnson/litestream/gs.ltxFileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/gs.ltxFileIterator.Item":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Item","kind":"method","span":{"start":[309,1],"end":[311,2],"bytes":[8514,8583]},"signature":"github.com/benbjohnson/litestream/gs.ltxFileIterator.Item","parameters":[],"return_type":"*github.com/superfly/ltx.FileInfo","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/gs.ltxFileIterator.Next":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next","kind":"method","span":{"start":[261,1],"end":[305,2],"bytes":[7395,8452]},"signature":"github.com/benbjohnson/litestream/gs.ltxFileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":9},"body":{"269:17":{"kind":"call","span":{"start":[269,17],"end":[269,30],"bytes":[7567,7580]},"callee":null},"270:6":{"kind":"call","span":{"start":[270,6],"end":[270,35],"bytes":[7586,7615]},"callee":null},"278:28":{"kind":"call","span":{"start":[278,28],"end":[278,68],"bytes":[7786,7826]},"callee":null},"278:46":{"kind":"call","span":{"start":[278,46],"end":[278,67],"bytes":[7804,7825]},"callee":null},"285:16":{"kind":"call","span":{"start":[285,16],"end":[285,35],"bytes":[8022,8041]},"callee":null},"288:23":{"kind":"call","span":{"start":[288,23],"end":[288,55],"bytes":[8152,8184]},"callee":null}}}},"fields":{"client":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/client","kind":"field","type":"*github.com/benbjohnson/litestream/gs.ReplicaClient","span":{"start":[243,1],"end":[243,23],"bytes":[7066,7088]}},"err":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/err","kind":"field","type":"error","span":{"start":[246,1],"end":[246,14],"bytes":[7123,7136]}},"info":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/info","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[245,1],"end":[245,22],"bytes":[7101,7122]}},"it":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/it","kind":"field","type":"*cloud.google.com/go/storage.ObjectIterator","span":{"start":[242,1],"end":[242,32],"bytes":[7034,7065]}},"level":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/level","kind":"field","type":"int","span":{"start":[244,1],"end":[244,12],"bytes":[7089,7100]}}}}},"functions":{"github.com/benbjohnson/litestream/gs.NewReplicaClient":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","kind":"function","span":{"start":[49,1],"end":[53,2],"bytes":[1027,1151]},"signature":"github.com/benbjohnson/litestream/gs.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/gs.ReplicaClient","metrics":{"cyclomatic":1},"body":{"51:11":{"kind":"call","span":{"start":[51,11],"end":[51,25],"bytes":[1102,1116]},"callee":null}}},"github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL","kind":"function","span":{"start":[61,1],"end":[70,2],"bytes":[1397,1714]},"signature":"github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}},{"name":"host","type":"string","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}},{"name":"urlPath","type":"string","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}},{"name":"query","type":"net/url.Values","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"63:15":{"kind":"call","span":{"start":[63,15],"end":[63,63],"bytes":[1565,1613]},"callee":null},"66:12":{"kind":"call","span":{"start":[66,12],"end":[66,30],"bytes":[1629,1647]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient"}}},"github.com/benbjohnson/litestream/gs.init":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.init","kind":"function","span":{"start":[24,1],"end":[26,2],"bytes":[297,384]},"signature":"github.com/benbjohnson/litestream/gs.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"25:2":{"kind":"call","span":{"start":[25,2],"end":[25,72],"bytes":[312,382]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/gs.isNotExists":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","kind":"function","span":{"start":[313,1],"end":[315,2],"bytes":[8585,8671]},"signature":"github.com/benbjohnson/litestream/gs.isNotExists","parameters":[{"name":"err","type":"error","span":{"start":[313,1],"end":[313,35],"bytes":[8585,8619]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"314:9":{"kind":"call","span":{"start":[314,9],"end":[314,50],"bytes":[8628,8669]},"callee":null}}},"github.com/benbjohnson/litestream/gs.newLTXFileIterator":{"id":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.newLTXFileIterator","kind":"function","span":{"start":[249,1],"end":[255,2],"bytes":[7140,7324]},"signature":"github.com/benbjohnson/litestream/gs.newLTXFileIterator","parameters":[{"name":"it","type":"*cloud.google.com/go/storage.ObjectIterator","span":{"start":[249,1],"end":[249,105],"bytes":[7140,7244]}},{"name":"client","type":"*github.com/benbjohnson/litestream/gs.ReplicaClient","span":{"start":[249,1],"end":[249,105],"bytes":[7140,7244]}},{"name":"level","type":"int","span":{"start":[249,1],"end":[249,105],"bytes":[7140,7244]}}],"return_type":"*github.com/benbjohnson/litestream/gs.ltxFileIterator","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"1bc094d2a506f33e506545d5cebb40caf43ad4fec91331d27bbb588fdf9df78b"},"heartbeat.go":{"id":"can://go/litestream/heartbeat.go","kind":"module","span":{"start":[1,1],"end":[85,1],"bytes":[0,1575]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst (\n\tDefaultHeartbeatInterval = 5 * time.Minute\n\tDefaultHeartbeatTimeout = 30 * time.Second\n\tMinHeartbeatInterval = 1 * time.Minute\n)\n\ntype HeartbeatClient struct {\n\tmu sync.Mutex\n\thttpClient *http.Client\n\n\tURL string\n\tInterval time.Duration\n\tTimeout time.Duration\n\n\tlastPingAt time.Time\n}\n\nfunc NewHeartbeatClient(url string, interval time.Duration) *HeartbeatClient {\n\tif interval \u003c MinHeartbeatInterval {\n\t\tinterval = MinHeartbeatInterval\n\t}\n\n\ttimeout := DefaultHeartbeatTimeout\n\n\treturn \u0026HeartbeatClient{\n\t\tURL: url,\n\t\tInterval: interval,\n\t\tTimeout: timeout,\n\t\thttpClient: \u0026http.Client{\n\t\t\tTimeout: timeout,\n\t\t},\n\t}\n}\n\nfunc (c *HeartbeatClient) Ping(ctx context.Context) error {\n\tif c.URL == \"\" {\n\t\treturn nil\n\t}\n\n\treq, err := http.NewRequestWithContext(ctx, http.MethodGet, c.URL, nil)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create request: %w\", err)\n\t}\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"http request: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode \u003c 200 || resp.StatusCode \u003e= 300 {\n\t\treturn fmt.Errorf(\"unexpected status code: %d\", resp.StatusCode)\n\t}\n\n\treturn nil\n}\n\nfunc (c *HeartbeatClient) ShouldPing() bool {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\treturn time.Since(c.lastPingAt) \u003e= c.Interval\n}\n\nfunc (c *HeartbeatClient) LastPingAt() time.Time {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\treturn c.lastPingAt\n}\n\nfunc (c *HeartbeatClient) RecordPing() {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tc.lastPingAt = time.Now()\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"fmt","path":"fmt","span":{"start":[5,1],"end":[5,7],"bytes":[40,46]}},{"name":"http","path":"net/http","span":{"start":[6,1],"end":[6,12],"bytes":[47,58]}},{"name":"sync","path":"sync","span":{"start":[7,1],"end":[7,8],"bytes":[59,66]}},{"name":"time","path":"time","span":{"start":[8,1],"end":[8,8],"bytes":[67,74]}}],"types":{"HeartbeatClient":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient","kind":"struct","span":{"start":[17,1],"end":[26,2],"bytes":[222,390]},"callables":{"github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt","kind":"method","span":{"start":[74,1],"end":[78,2],"bytes":[1362,1469]},"signature":"github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt","parameters":[],"return_type":"time.Time","metrics":{"cyclomatic":1},"body":{"75:2":{"kind":"call","span":{"start":[75,2],"end":[75,13],"bytes":[1414,1425]},"callee":null},"76:8":{"kind":"call","span":{"start":[76,8],"end":[76,21],"bytes":[1433,1446]},"callee":null}}},"github.com/benbjohnson/litestream.HeartbeatClient.Ping":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping","kind":"method","span":{"start":[45,1],"end":[66,2],"bytes":[730,1230]},"signature":"github.com/benbjohnson/litestream.HeartbeatClient.Ping","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[45,1],"end":[45,60],"bytes":[730,789]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"50:14":{"kind":"call","span":{"start":[50,14],"end":[50,73],"bytes":[838,897]},"callee":null},"52:10":{"kind":"call","span":{"start":[52,10],"end":[52,47],"bytes":[924,961]},"callee":null},"55:15":{"kind":"call","span":{"start":[55,15],"end":[55,35],"bytes":[980,1000]},"callee":null},"57:10":{"kind":"call","span":{"start":[57,10],"end":[57,45],"bytes":[1027,1062]},"callee":null},"59:8":{"kind":"call","span":{"start":[59,8],"end":[59,25],"bytes":[1073,1090]},"callee":null},"62:10":{"kind":"call","span":{"start":[62,10],"end":[62,67],"bytes":[1155,1212]},"callee":null}}},"github.com/benbjohnson/litestream.HeartbeatClient.RecordPing":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","kind":"method","span":{"start":[80,1],"end":[84,2],"bytes":[1471,1574]},"signature":"github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","parameters":[],"metrics":{"cyclomatic":1},"body":{"81:2":{"kind":"call","span":{"start":[81,2],"end":[81,13],"bytes":[1513,1524]},"callee":null},"82:8":{"kind":"call","span":{"start":[82,8],"end":[82,21],"bytes":[1532,1545]},"callee":null},"83:17":{"kind":"call","span":{"start":[83,17],"end":[83,27],"bytes":[1562,1572]},"callee":null}}},"github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","kind":"method","span":{"start":[68,1],"end":[72,2],"bytes":[1232,1360]},"signature":"github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"69:2":{"kind":"call","span":{"start":[69,2],"end":[69,13],"bytes":[1279,1290]},"callee":null},"70:8":{"kind":"call","span":{"start":[70,8],"end":[70,21],"bytes":[1298,1311]},"callee":null},"71:9":{"kind":"call","span":{"start":[71,9],"end":[71,33],"bytes":[1320,1344]},"callee":null}}}},"fields":{"Interval":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/Interval","kind":"field","type":"time.Duration","span":{"start":[22,1],"end":[22,24],"bytes":[318,341]}},"Timeout":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/Timeout","kind":"field","type":"time.Duration","span":{"start":[23,1],"end":[23,24],"bytes":[342,365]}},"URL":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/URL","kind":"field","type":"string","span":{"start":[21,1],"end":[21,17],"bytes":[301,317]}},"httpClient":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/httpClient","kind":"field","type":"*net/http.Client","span":{"start":[19,1],"end":[19,25],"bytes":[275,299]}},"lastPingAt":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/lastPingAt","kind":"field","type":"time.Time","span":{"start":[25,1],"end":[25,22],"bytes":[367,388]}},"mu":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[18,1],"end":[18,23],"bytes":[252,274]}}}}},"functions":{"github.com/benbjohnson/litestream.NewHeartbeatClient":{"id":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.NewHeartbeatClient","kind":"function","span":{"start":[28,1],"end":[43,2],"bytes":[392,728]},"signature":"github.com/benbjohnson/litestream.NewHeartbeatClient","parameters":[{"name":"url","type":"string","span":{"start":[28,1],"end":[28,79],"bytes":[392,470]}},{"name":"interval","type":"time.Duration","span":{"start":[28,1],"end":[28,79],"bytes":[392,470]}}],"return_type":"*github.com/benbjohnson/litestream.HeartbeatClient","metrics":{"cyclomatic":2},"body":{}}},"content_hash":"ef90f2e79f1a8f89bd34a9cada9e3c399a410cf774b5c2b3233863dc7cbf2581"},"internal/hexdump.go":{"id":"can://go/litestream/internal/hexdump.go","kind":"module","span":{"start":[1,1],"end":[46,1],"bytes":[0,1259]},"package":"internal","source":"package internal\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n)\n\nfunc Hexdump(data []byte) string {\n\tprevRow := make([]byte, 16)\n\n\tvar buf bytes.Buffer\n\tvar dupWritten bool\n\tfor i := 0; i \u003c len(data); i += 16 {\n\t\trow := make([]byte, 16)\n\t\tcopy(row, data[i:])\n\n\t\t// Write out one line of asterisks to show that we just have duplicate rows.\n\t\tif i != 0 \u0026\u0026 i+16 \u003c len(data) \u0026\u0026 bytes.Equal(row, prevRow) {\n\t\t\tif !dupWritten {\n\t\t\t\tdupWritten = true\n\t\t\t\tfmt.Fprintln(\u0026buf, \"***\")\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Track previous row so we know when we have duplicates.\n\t\tcopy(prevRow, row)\n\t\tdupWritten = false\n\n\t\tfmt.Fprintf(\u0026buf, \"%08x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x |%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s|\\n\", i,\n\t\t\trow[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7],\n\t\t\trow[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15],\n\t\t\ttoChar(row[0]), toChar(row[1]), toChar(row[2]), toChar(row[3]), toChar(row[4]), toChar(row[5]), toChar(row[6]), toChar(row[7]),\n\t\t\ttoChar(row[8]), toChar(row[9]), toChar(row[10]), toChar(row[11]), toChar(row[12]), toChar(row[13]), toChar(row[14]), toChar(row[15]),\n\t\t)\n\t}\n\treturn buf.String()\n}\n\nfunc toChar(b byte) string {\n\tif b \u003c 32 || b \u003e 126 {\n\t\treturn \".\"\n\t}\n\treturn string(b)\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[27,35]}},{"name":"fmt","path":"fmt","span":{"start":[5,1],"end":[5,7],"bytes":[36,42]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/internal.Hexdump":{"id":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump","kind":"function","span":{"start":[8,1],"end":[38,2],"bytes":[46,1168]},"signature":"github.com/benbjohnson/litestream/internal.Hexdump","parameters":[{"name":"data","type":"[]byte","span":{"start":[8,1],"end":[8,35],"bytes":[46,80]}}],"return_type":"string","metrics":{"cyclomatic":4},"body":{"13:18":{"kind":"call","span":{"start":[13,18],"end":[13,27],"bytes":[171,180]},"callee":null},"14:10":{"kind":"call","span":{"start":[14,10],"end":[14,26],"bytes":[201,217]},"callee":null},"15:3":{"kind":"call","span":{"start":[15,3],"end":[15,22],"bytes":[220,239]},"callee":null},"18:23":{"kind":"call","span":{"start":[18,23],"end":[18,32],"bytes":[342,351]},"callee":null},"18:36":{"kind":"call","span":{"start":[18,36],"end":[18,61],"bytes":[355,380]},"callee":null},"21:5":{"kind":"call","span":{"start":[21,5],"end":[21,30],"bytes":[429,454]},"callee":null},"27:3":{"kind":"call","span":{"start":[27,3],"end":[27,21],"bytes":[539,557]},"callee":null},"30:3":{"kind":"call","span":{"start":[30,3],"end":[35,4],"bytes":[582,1142]},"callee":null},"33:100":{"kind":"call","span":{"start":[33,100],"end":[33,114],"bytes":[970,984]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:116":{"kind":"call","span":{"start":[33,116],"end":[33,130],"bytes":[986,1000]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:20":{"kind":"call","span":{"start":[33,20],"end":[33,34],"bytes":[890,904]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:36":{"kind":"call","span":{"start":[33,36],"end":[33,50],"bytes":[906,920]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:4":{"kind":"call","span":{"start":[33,4],"end":[33,18],"bytes":[874,888]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:52":{"kind":"call","span":{"start":[33,52],"end":[33,66],"bytes":[922,936]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:68":{"kind":"call","span":{"start":[33,68],"end":[33,82],"bytes":[938,952]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:84":{"kind":"call","span":{"start":[33,84],"end":[33,98],"bytes":[954,968]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:104":{"kind":"call","span":{"start":[34,104],"end":[34,119],"bytes":[1105,1120]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:121":{"kind":"call","span":{"start":[34,121],"end":[34,136],"bytes":[1122,1137]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:20":{"kind":"call","span":{"start":[34,20],"end":[34,34],"bytes":[1021,1035]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:36":{"kind":"call","span":{"start":[34,36],"end":[34,51],"bytes":[1037,1052]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:4":{"kind":"call","span":{"start":[34,4],"end":[34,18],"bytes":[1005,1019]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:53":{"kind":"call","span":{"start":[34,53],"end":[34,68],"bytes":[1054,1069]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:70":{"kind":"call","span":{"start":[34,70],"end":[34,85],"bytes":[1071,1086]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:87":{"kind":"call","span":{"start":[34,87],"end":[34,102],"bytes":[1088,1103]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"37:9":{"kind":"call","span":{"start":[37,9],"end":[37,21],"bytes":[1154,1166]},"callee":null},"9:13":{"kind":"call","span":{"start":[9,13],"end":[9,29],"bytes":[93,109]},"callee":null}}},"github.com/benbjohnson/litestream/internal.toChar":{"id":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar","kind":"function","span":{"start":[40,1],"end":[45,2],"bytes":[1170,1258]},"signature":"github.com/benbjohnson/litestream/internal.toChar","parameters":[{"name":"b","type":"byte","span":{"start":[40,1],"end":[40,29],"bytes":[1170,1198]}}],"return_type":"string","metrics":{"cyclomatic":2},"body":{"44:9":{"kind":"call","span":{"start":[44,9],"end":[44,18],"bytes":[1247,1256]},"callee":null}}}},"content_hash":"124cc6cc77df8fbcf11b7d27687a0e2fe0edb403fd28c849424522fb3f482bf6"},"internal/internal.go":{"id":"can://go/litestream/internal/internal.go","kind":"module","span":{"start":[1,1],"end":[178,1],"bytes":[0,4815]},"package":"internal","source":"package internal\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"syscall\"\n\n\t\"github.com/pierrec/lz4/v4\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/promauto\"\n)\n\n// ReadCloser wraps a reader to also attach a separate closer.\ntype ReadCloser struct {\n\tr io.Reader\n\tc io.Closer\n}\n\n// NewReadCloser returns a new instance of ReadCloser.\nfunc NewReadCloser(r io.Reader, c io.Closer) *ReadCloser {\n\treturn \u0026ReadCloser{r, c}\n}\n\n// Read reads bytes into the underlying reader.\nfunc (r *ReadCloser) Read(p []byte) (n int, err error) {\n\treturn r.r.Read(p)\n}\n\n// Close closes the reader (if implementing io.ReadCloser) and the Closer.\nfunc (r *ReadCloser) Close() error {\n\tif rc, ok := r.r.(io.Closer); ok {\n\t\tif err := rc.Close(); err != nil {\n\t\t\tr.c.Close()\n\t\t\treturn err\n\t\t}\n\t}\n\treturn r.c.Close()\n}\n\n// LZ4ReadCloser wraps an LZ4 reader with the underlying source for proper closing.\ntype LZ4ReadCloser struct {\n\t*lz4.Reader\n\tunderlying io.Closer\n}\n\nfunc (r *LZ4ReadCloser) Close() error {\n\treturn r.underlying.Close()\n}\n\n// NewLZ4Reader creates an LZ4 decompressing reader that wraps the source.\n// Closing the returned reader also closes the underlying source.\nfunc NewLZ4Reader(r io.ReadCloser) io.ReadCloser {\n\treturn \u0026LZ4ReadCloser{\n\t\tReader: lz4.NewReader(r),\n\t\tunderlying: r,\n\t}\n}\n\n// ReadCounter wraps an io.Reader and counts the total number of bytes read.\ntype ReadCounter struct {\n\tr io.Reader\n\tn int64\n}\n\n// NewReadCounter returns a new instance of ReadCounter that wraps r.\nfunc NewReadCounter(r io.Reader) *ReadCounter {\n\treturn \u0026ReadCounter{r: r}\n}\n\n// Read reads from the underlying reader into p and adds the bytes read to the counter.\nfunc (r *ReadCounter) Read(p []byte) (int, error) {\n\tn, err := r.r.Read(p)\n\tr.n += int64(n)\n\treturn n, err\n}\n\n// N returns the total number of bytes read.\nfunc (r *ReadCounter) N() int64 { return r.n }\n\n// CreateFile creates the file and matches the mode \u0026 uid/gid of fi.\nfunc CreateFile(filename string, fi os.FileInfo) (*os.File, error) {\n\tmode := os.FileMode(0600)\n\tif fi != nil {\n\t\tmode = fi.Mode()\n\t}\n\n\tf, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tuid, gid := Fileinfo(fi)\n\t_ = f.Chown(uid, gid)\n\treturn f, nil\n}\n\n// MkdirAll is a copy of os.MkdirAll() except that it attempts to set the\n// mode/uid/gid to match fi for each created directory.\nfunc MkdirAll(path string, fi os.FileInfo) error {\n\tuid, gid := Fileinfo(fi)\n\n\t// Fast path: if we can tell whether path is a directory or file, stop with success or error.\n\tdir, err := os.Stat(path)\n\tif err == nil {\n\t\tif dir.IsDir() {\n\t\t\treturn nil\n\t\t}\n\t\treturn \u0026os.PathError{Op: \"mkdir\", Path: path, Err: syscall.ENOTDIR}\n\t}\n\n\t// Slow path: make sure parent exists and then call Mkdir for path.\n\ti := len(path)\n\tfor i \u003e 0 \u0026\u0026 os.IsPathSeparator(path[i-1]) { // Skip trailing path separator.\n\t\ti--\n\t}\n\n\tj := i\n\tfor j \u003e 0 \u0026\u0026 !os.IsPathSeparator(path[j-1]) { // Scan backward over element.\n\t\tj--\n\t}\n\n\tif j \u003e 1 {\n\t\t// Create parent.\n\t\terr = MkdirAll(fixRootDirectory(path[:j-1]), fi)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Parent now exists; invoke Mkdir and use its result.\n\tmode := os.FileMode(0700)\n\tif fi != nil {\n\t\tmode = fi.Mode()\n\t}\n\terr = os.Mkdir(path, mode)\n\tif err != nil {\n\t\t// Handle arguments like \"foo/.\" by\n\t\t// double-checking that directory doesn't exist.\n\t\tdir, err1 := os.Lstat(path)\n\t\tif err1 == nil \u0026\u0026 dir.IsDir() {\n\t\t\t_ = os.Chown(path, uid, gid)\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\t_ = os.Chown(path, uid, gid)\n\treturn nil\n}\n\n// Shared replica metrics.\nvar (\n\tOperationTotalCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_replica_operation_total\",\n\t\tHelp: \"The number of replica operations performed\",\n\t}, []string{\"replica_type\", \"operation\"})\n\n\tOperationBytesCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_replica_operation_bytes\",\n\t\tHelp: \"The number of bytes used by replica operations\",\n\t}, []string{\"replica_type\", \"operation\"})\n\n\tOperationDurationHistogramVec = promauto.NewHistogramVec(prometheus.HistogramOpts{\n\t\tName: \"litestream_replica_operation_duration_seconds\",\n\t\tHelp: \"Duration of replica operations by type and operation\",\n\t\tBuckets: []float64{0.01, 0.05, 0.1, 0.5, 1, 5, 10, 30, 60},\n\t}, []string{\"replica_type\", \"operation\"})\n\n\tOperationErrorCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_replica_operation_errors_total\",\n\t\tHelp: \"Number of replica operation errors by type, operation, and error code\",\n\t}, []string{\"replica_type\", \"operation\", \"code\"})\n\n\tL0RetentionGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_l0_retention_files_total\",\n\t\tHelp: \"Number of L0 files by status during retention enforcement\",\n\t}, []string{\"db\", \"status\"})\n)\n","imports":[{"name":"io","path":"io","span":{"start":[4,1],"end":[4,6],"bytes":[27,32]}},{"name":"os","path":"os","span":{"start":[5,1],"end":[5,6],"bytes":[33,38]}},{"name":"syscall","path":"syscall","span":{"start":[6,1],"end":[6,11],"bytes":[39,49]}},{"name":"v4","path":"github.com/pierrec/lz4/v4","span":{"start":[8,1],"end":[8,29],"bytes":[51,79]}},{"name":"prometheus","path":"github.com/prometheus/client_golang/prometheus","span":{"start":[9,1],"end":[9,50],"bytes":[80,129]}},{"name":"promauto","path":"github.com/prometheus/client_golang/prometheus/promauto","span":{"start":[10,1],"end":[10,59],"bytes":[130,188]}}],"types":{"LZ4ReadCloser":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser","kind":"struct","span":{"start":[41,1],"end":[44,2],"bytes":[908,972]},"base_types":["*github.com/pierrec/lz4/v4.Reader"],"callables":{"github.com/benbjohnson/litestream/internal.LZ4ReadCloser.Close":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser/github.com/benbjohnson/litestream/internal.LZ4ReadCloser.Close","kind":"method","span":{"start":[46,1],"end":[48,2],"bytes":[974,1044]},"signature":"github.com/benbjohnson/litestream/internal.LZ4ReadCloser.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"47:9":{"kind":"call","span":{"start":[47,9],"end":[47,29],"bytes":[1022,1042]},"callee":null}}}},"fields":{"*github.com/pierrec/lz4/v4.Reader":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser/*github.com/pierrec/lz4/v4.Reader","kind":"field","type":"*github.com/pierrec/lz4/v4.Reader","span":{"start":[42,1],"end":[42,13],"bytes":[936,948]}},"underlying":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser/underlying","kind":"field","type":"io.Closer","span":{"start":[43,1],"end":[43,22],"bytes":[949,970]}}}},"ReadCloser":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser","kind":"struct","span":{"start":[14,1],"end":[17,2],"bytes":[255,307]},"callables":{"github.com/benbjohnson/litestream/internal.ReadCloser.Close":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Close","kind":"method","span":{"start":[30,1],"end":[38,2],"bytes":[655,822]},"signature":"github.com/benbjohnson/litestream/internal.ReadCloser.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"32:13":{"kind":"call","span":{"start":[32,13],"end":[32,23],"bytes":[740,750]},"callee":null},"33:4":{"kind":"call","span":{"start":[33,4],"end":[33,15],"bytes":[768,779]},"callee":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"37:9":{"kind":"call","span":{"start":[37,9],"end":[37,20],"bytes":[809,820]},"callee":null}}},"github.com/benbjohnson/litestream/internal.ReadCloser.Read":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Read","kind":"method","span":{"start":[25,1],"end":[27,2],"bytes":[500,578]},"signature":"github.com/benbjohnson/litestream/internal.ReadCloser.Read","parameters":[{"name":"p","type":"[]byte","span":{"start":[25,1],"end":[25,57],"bytes":[500,556]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"26:9":{"kind":"call","span":{"start":[26,9],"end":[26,20],"bytes":[565,576]},"callee":null}}}},"fields":{"c":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/c","kind":"field","type":"io.Closer","span":{"start":[16,1],"end":[16,13],"bytes":[293,305]}},"r":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/r","kind":"field","type":"io.Reader","span":{"start":[15,1],"end":[15,13],"bytes":[280,292]}}}},"ReadCounter":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter","kind":"struct","span":{"start":[60,1],"end":[63,2],"bytes":[1394,1443]},"callables":{"github.com/benbjohnson/litestream/internal.ReadCounter.N":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N","kind":"method","span":{"start":[78,1],"end":[78,47],"bytes":[1836,1882]},"signature":"github.com/benbjohnson/litestream/internal.ReadCounter.N","parameters":[],"return_type":"int64","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/internal.ReadCounter.Read":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.Read","kind":"method","span":{"start":[71,1],"end":[75,2],"bytes":[1681,1789]},"signature":"github.com/benbjohnson/litestream/internal.ReadCounter.Read","parameters":[{"name":"p","type":"[]byte","span":{"start":[71,1],"end":[71,52],"bytes":[1681,1732]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"72:12":{"kind":"call","span":{"start":[72,12],"end":[72,23],"bytes":[1744,1755]},"callee":null},"73:9":{"kind":"call","span":{"start":[73,9],"end":[73,17],"bytes":[1764,1772]},"callee":null}}}},"fields":{"n":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/n","kind":"field","type":"int64","span":{"start":[62,1],"end":[62,9],"bytes":[1433,1441]}},"r":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/r","kind":"field","type":"io.Reader","span":{"start":[61,1],"end":[61,13],"bytes":[1420,1432]}}}}},"functions":{"github.com/benbjohnson/litestream/internal.CreateFile":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","kind":"function","span":{"start":[81,1],"end":[95,2],"bytes":[1953,2265]},"signature":"github.com/benbjohnson/litestream/internal.CreateFile","parameters":[{"name":"filename","type":"string","span":{"start":[81,1],"end":[81,69],"bytes":[1953,2021]}},{"name":"fi","type":"os.FileInfo","span":{"start":[81,1],"end":[81,69],"bytes":[1953,2021]}}],"return_type":"(*os.File, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"82:10":{"kind":"call","span":{"start":[82,10],"end":[82,27],"bytes":[2031,2048]},"callee":null},"84:10":{"kind":"call","span":{"start":[84,10],"end":[84,19],"bytes":[2074,2083]},"callee":null},"87:12":{"kind":"call","span":{"start":[87,12],"end":[87,73],"bytes":[2099,2160]},"callee":null},"92:14":{"kind":"call","span":{"start":[92,14],"end":[92,26],"bytes":[2213,2225]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo"},"93:6":{"kind":"call","span":{"start":[93,6],"end":[93,23],"bytes":[2231,2248]},"callee":null}}},"github.com/benbjohnson/litestream/internal.MkdirAll":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","kind":"function","span":{"start":[99,1],"end":[148,2],"bytes":[2397,3546]},"signature":"github.com/benbjohnson/litestream/internal.MkdirAll","parameters":[{"name":"path","type":"string","span":{"start":[99,1],"end":[99,51],"bytes":[2397,2447]}},{"name":"fi","type":"os.FileInfo","span":{"start":[99,1],"end":[99,51],"bytes":[2397,2447]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"100:14":{"kind":"call","span":{"start":[100,14],"end":[100,26],"bytes":[2461,2473]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo"},"103:14":{"kind":"call","span":{"start":[103,14],"end":[103,27],"bytes":[2583,2596]},"callee":null},"105:6":{"kind":"call","span":{"start":[105,6],"end":[105,17],"bytes":[2619,2630]},"callee":null},"112:7":{"kind":"call","span":{"start":[112,7],"end":[112,16],"bytes":[2800,2809]},"callee":null},"113:15":{"kind":"call","span":{"start":[113,15],"end":[113,44],"bytes":[2824,2853]},"callee":null},"118:16":{"kind":"call","span":{"start":[118,16],"end":[118,45],"bytes":[2922,2951]},"callee":null},"124:18":{"kind":"call","span":{"start":[124,18],"end":[124,46],"bytes":[3044,3072]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.fixRootDirectory"},"124:9":{"kind":"call","span":{"start":[124,9],"end":[124,51],"bytes":[3035,3077]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"131:10":{"kind":"call","span":{"start":[131,10],"end":[131,27],"bytes":[3183,3200]},"callee":null},"133:10":{"kind":"call","span":{"start":[133,10],"end":[133,19],"bytes":[3226,3235]},"callee":null},"135:8":{"kind":"call","span":{"start":[135,8],"end":[135,28],"bytes":[3246,3266]},"callee":null},"139:16":{"kind":"call","span":{"start":[139,16],"end":[139,30],"bytes":[3388,3402]},"callee":null},"140:21":{"kind":"call","span":{"start":[140,21],"end":[140,32],"bytes":[3423,3434]},"callee":null},"141:8":{"kind":"call","span":{"start":[141,8],"end":[141,32],"bytes":[3444,3468]},"callee":null},"146:6":{"kind":"call","span":{"start":[146,6],"end":[146,30],"bytes":[3508,3532]},"callee":null}}},"github.com/benbjohnson/litestream/internal.NewLZ4Reader":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","kind":"function","span":{"start":[52,1],"end":[57,2],"bytes":[1187,1315]},"signature":"github.com/benbjohnson/litestream/internal.NewLZ4Reader","parameters":[{"name":"r","type":"io.ReadCloser","span":{"start":[52,1],"end":[52,51],"bytes":[1187,1237]}}],"return_type":"io.ReadCloser","metrics":{"cyclomatic":1},"body":{"54:15":{"kind":"call","span":{"start":[54,15],"end":[54,31],"bytes":[1276,1292]},"callee":null}}},"github.com/benbjohnson/litestream/internal.NewReadCloser":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCloser","kind":"function","span":{"start":[20,1],"end":[22,2],"bytes":[364,450]},"signature":"github.com/benbjohnson/litestream/internal.NewReadCloser","parameters":[{"name":"r","type":"io.Reader","span":{"start":[20,1],"end":[20,59],"bytes":[364,422]}},{"name":"c","type":"io.Closer","span":{"start":[20,1],"end":[20,59],"bytes":[364,422]}}],"return_type":"*github.com/benbjohnson/litestream/internal.ReadCloser","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/internal.NewReadCounter":{"id":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","kind":"function","span":{"start":[66,1],"end":[68,2],"bytes":[1515,1591]},"signature":"github.com/benbjohnson/litestream/internal.NewReadCounter","parameters":[{"name":"r","type":"io.Reader","span":{"start":[66,1],"end":[66,48],"bytes":[1515,1562]}}],"return_type":"*github.com/benbjohnson/litestream/internal.ReadCounter","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"1dbef4f2385d3ead118aea4ee0553279841074b2fe2988a4c16fe625415de1b5"},"internal/internal_unix.go":{"id":"can://go/litestream/internal/internal_unix.go","kind":"module","span":{"start":[1,1],"end":[39,1],"bytes":[0,771]},"package":"internal","source":"//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris\n// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris\n\npackage internal\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\n// Fileinfo returns syscall fields from a FileInfo object.\nfunc Fileinfo(fi os.FileInfo) (uid, gid int) {\n\tif fi == nil {\n\t\treturn -1, -1\n\t}\n\tstat, ok := fi.Sys().(*syscall.Stat_t)\n\tif !ok {\n\t\treturn -1, -1\n\t}\n\treturn int(stat.Uid), int(stat.Gid)\n}\n\nfunc fixRootDirectory(p string) string {\n\treturn p\n}\n\n// FsyncDir syncs a directory so a preceding rename within it is durable.\nfunc FsyncDir(path string) error {\n\tdir, err := os.Open(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := dir.Sync(); err != nil {\n\t\t_ = dir.Close()\n\t\treturn err\n\t}\n\treturn dir.Close()\n}\n","imports":[{"name":"os","path":"os","span":{"start":[7,1],"end":[7,6],"bytes":[186,191]}},{"name":"syscall","path":"syscall","span":{"start":[8,1],"end":[8,11],"bytes":[192,202]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/internal.Fileinfo":{"id":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","kind":"function","span":{"start":[12,1],"end":[21,2],"bytes":[265,454]},"signature":"github.com/benbjohnson/litestream/internal.Fileinfo","parameters":[{"name":"fi","type":"os.FileInfo","span":{"start":[12,1],"end":[12,47],"bytes":[265,311]}}],"return_type":"(int, int)","metrics":{"cyclomatic":3},"body":{"16:14":{"kind":"call","span":{"start":[16,14],"end":[16,22],"bytes":[360,368]},"callee":null},"20:24":{"kind":"call","span":{"start":[20,24],"end":[20,37],"bytes":[439,452]},"callee":null},"20:9":{"kind":"call","span":{"start":[20,9],"end":[20,22],"bytes":[424,437]},"callee":null}}},"github.com/benbjohnson/litestream/internal.FsyncDir":{"id":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","kind":"function","span":{"start":[28,1],"end":[38,2],"bytes":[584,770]},"signature":"github.com/benbjohnson/litestream/internal.FsyncDir","parameters":[{"name":"path","type":"string","span":{"start":[28,1],"end":[28,35],"bytes":[584,618]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"29:14":{"kind":"call","span":{"start":[29,14],"end":[29,27],"bytes":[632,645]},"callee":null},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,22],"bytes":[690,700]},"callee":null},"34:7":{"kind":"call","span":{"start":[34,7],"end":[34,18],"bytes":[721,732]},"callee":null},"37:9":{"kind":"call","span":{"start":[37,9],"end":[37,20],"bytes":[757,768]},"callee":null}}},"github.com/benbjohnson/litestream/internal.fixRootDirectory":{"id":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.fixRootDirectory","kind":"function","span":{"start":[23,1],"end":[25,2],"bytes":[456,508]},"signature":"github.com/benbjohnson/litestream/internal.fixRootDirectory","parameters":[{"name":"p","type":"string","span":{"start":[23,1],"end":[23,41],"bytes":[456,496]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"cd90a0b1e0c7f49f8dd99c8818b37ffa3b4d7f8edf3215f0394eda7a0b6c8905"},"internal/limit_read_closer.go":{"id":"can://go/litestream/internal/limit_read_closer.go","kind":"module","span":{"start":[1,1],"end":[30,1],"bytes":[0,558]},"package":"internal","source":"package internal\n\nimport \"io\"\n\n// Copied from the io package to implement io.Closer.\nfunc LimitReadCloser(r io.ReadCloser, n int64) io.ReadCloser {\n\treturn \u0026LimitedReadCloser{r, n}\n}\n\ntype LimitedReadCloser struct {\n\tR io.ReadCloser // underlying reader\n\tN int64 // max bytes remaining\n}\n\nfunc (l *LimitedReadCloser) Close() error {\n\treturn l.R.Close()\n}\n\nfunc (l *LimitedReadCloser) Read(p []byte) (n int, err error) {\n\tif l.N \u003c= 0 {\n\t\treturn 0, io.EOF\n\t}\n\tif int64(len(p)) \u003e l.N {\n\t\tp = p[0:l.N]\n\t}\n\tn, err = l.R.Read(p)\n\tl.N -= int64(n)\n\treturn\n}\n","imports":[{"name":"io","path":"io","span":{"start":[3,1],"end":[3,12],"bytes":[18,29]}}],"types":{"LimitedReadCloser":{"id":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser","kind":"struct","span":{"start":[10,1],"end":[13,2],"bytes":[184,295]},"callables":{"github.com/benbjohnson/litestream/internal.LimitedReadCloser.Close":{"id":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Close","kind":"method","span":{"start":[15,1],"end":[17,2],"bytes":[297,362]},"signature":"github.com/benbjohnson/litestream/internal.LimitedReadCloser.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"16:9":{"kind":"call","span":{"start":[16,9],"end":[16,20],"bytes":[349,360]},"callee":null}}},"github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read":{"id":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read","kind":"method","span":{"start":[19,1],"end":[29,2],"bytes":[364,557]},"signature":"github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read","parameters":[{"name":"p","type":"[]byte","span":{"start":[19,1],"end":[19,64],"bytes":[364,427]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"23:11":{"kind":"call","span":{"start":[23,11],"end":[23,17],"bytes":[475,481]},"callee":null},"23:5":{"kind":"call","span":{"start":[23,5],"end":[23,18],"bytes":[469,482]},"callee":null},"26:11":{"kind":"call","span":{"start":[26,11],"end":[26,22],"bytes":[519,530]},"callee":null},"27:9":{"kind":"call","span":{"start":[27,9],"end":[27,17],"bytes":[539,547]},"callee":null}}}},"fields":{"N":{"id":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/N","kind":"field","type":"int64","span":{"start":[12,1],"end":[12,40],"bytes":[254,293]}},"R":{"id":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/R","kind":"field","type":"io.ReadCloser","span":{"start":[11,1],"end":[11,38],"bytes":[216,253]}}}}},"functions":{"github.com/benbjohnson/litestream/internal.LimitReadCloser":{"id":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","kind":"function","span":{"start":[6,1],"end":[8,2],"bytes":[85,182]},"signature":"github.com/benbjohnson/litestream/internal.LimitReadCloser","parameters":[{"name":"r","type":"io.ReadCloser","span":{"start":[6,1],"end":[6,63],"bytes":[85,147]}},{"name":"n","type":"int64","span":{"start":[6,1],"end":[6,63],"bytes":[85,147]}}],"return_type":"io.ReadCloser","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"c02d22d6d9369a280aca33bc4e0a77f1ee533201289cb691fc16d304732b75d7"},"internal/lock_unix.go":{"id":"can://go/litestream/internal/lock_unix.go","kind":"module","span":{"start":[1,1],"end":[51,1],"bytes":[0,1085]},"package":"internal","source":"//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris\n\npackage internal\n\nimport (\n\t\"os\"\n\n\t\"golang.org/x/sys/unix\"\n)\n\nconst (\n\tsqlitePendingByte = 0x40000000\n\tsqliteSharedFirst = sqlitePendingByte + 2\n\tsqliteSharedSize = 510\n)\n\nfunc LockFileExclusive(f *os.File) error {\n\tfd := int(f.Fd())\n\n\tif err := setFcntlLock(fd, unix.F_WRLCK, sqlitePendingByte, 1); err != nil {\n\t\treturn err\n\t}\n\n\tif err := setFcntlLock(fd, unix.F_WRLCK, sqliteSharedFirst, sqliteSharedSize); err != nil {\n\t\t_ = setFcntlLock(fd, unix.F_UNLCK, sqlitePendingByte, 1)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc UnlockFile(f *os.File) error {\n\tfd := int(f.Fd())\n\terr1 := setFcntlLock(fd, unix.F_UNLCK, sqliteSharedFirst, sqliteSharedSize)\n\terr2 := setFcntlLock(fd, unix.F_UNLCK, sqlitePendingByte, 1)\n\tif err1 != nil {\n\t\treturn err1\n\t}\n\treturn err2\n}\n\nfunc setFcntlLock(fd int, lockType int16, start int64, length int64) error {\n\tflock := unix.Flock_t{\n\t\tType: lockType,\n\t\tWhence: 0,\n\t\tStart: start,\n\t\tLen: length,\n\t}\n\treturn unix.FcntlFlock(uintptr(fd), unix.F_SETLKW, \u0026flock)\n}\n","imports":[{"name":"os","path":"os","span":{"start":[6,1],"end":[6,6],"bytes":[118,123]}},{"name":"unix","path":"golang.org/x/sys/unix","span":{"start":[8,1],"end":[8,25],"bytes":[125,149]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/internal.LockFileExclusive":{"id":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive","kind":"function","span":{"start":[17,1],"end":[30,2],"bytes":[264,604]},"signature":"github.com/benbjohnson/litestream/internal.LockFileExclusive","parameters":[{"name":"f","type":"*os.File","span":{"start":[17,1],"end":[17,43],"bytes":[264,306]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"18:12":{"kind":"call","span":{"start":[18,12],"end":[18,18],"bytes":[318,324]},"callee":null},"18:8":{"kind":"call","span":{"start":[18,8],"end":[18,19],"bytes":[314,325]},"callee":null},"20:12":{"kind":"call","span":{"start":[20,12],"end":[20,64],"bytes":[338,390]},"callee":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"},"24:12":{"kind":"call","span":{"start":[24,12],"end":[24,79],"bytes":[433,500]},"callee":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"},"25:7":{"kind":"call","span":{"start":[25,7],"end":[25,59],"bytes":[521,573]},"callee":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"}}},"github.com/benbjohnson/litestream/internal.UnlockFile":{"id":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile","kind":"function","span":{"start":[32,1],"end":[40,2],"bytes":[606,849]},"signature":"github.com/benbjohnson/litestream/internal.UnlockFile","parameters":[{"name":"f","type":"*os.File","span":{"start":[32,1],"end":[32,36],"bytes":[606,641]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,18],"bytes":[653,659]},"callee":null},"33:8":{"kind":"call","span":{"start":[33,8],"end":[33,19],"bytes":[649,660]},"callee":null},"34:10":{"kind":"call","span":{"start":[34,10],"end":[34,77],"bytes":[670,737]},"callee":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"},"35:10":{"kind":"call","span":{"start":[35,10],"end":[35,62],"bytes":[747,799]},"callee":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"}}},"github.com/benbjohnson/litestream/internal.setFcntlLock":{"id":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock","kind":"function","span":{"start":[42,1],"end":[50,2],"bytes":[851,1084]},"signature":"github.com/benbjohnson/litestream/internal.setFcntlLock","parameters":[{"name":"fd","type":"int","span":{"start":[42,1],"end":[42,77],"bytes":[851,927]}},{"name":"lockType","type":"int16","span":{"start":[42,1],"end":[42,77],"bytes":[851,927]}},{"name":"start","type":"int64","span":{"start":[42,1],"end":[42,77],"bytes":[851,927]}},{"name":"length","type":"int64","span":{"start":[42,1],"end":[42,77],"bytes":[851,927]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"49:25":{"kind":"call","span":{"start":[49,25],"end":[49,36],"bytes":[1047,1058]},"callee":null},"49:9":{"kind":"call","span":{"start":[49,9],"end":[49,60],"bytes":[1031,1082]},"callee":null}}}},"content_hash":"9d2a4e0444c4721b2c9695b88a883848ac89a7d4f28181ccc72c75ab9e76f491"},"internal/log.go":{"id":"can://go/litestream/internal/log.go","kind":"module","span":{"start":[1,1],"end":[125,1],"bytes":[0,2737]},"package":"internal","source":"package internal\n\nimport (\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path\"\n\t\"runtime/debug\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/lmittmann/tint\"\n\t\"github.com/mattn/go-isatty\"\n)\n\nvar modulePrefix string\nvar moduleLastSegment string\n\nfunc init() {\n\tif info, ok := debug.ReadBuildInfo(); ok \u0026\u0026 info.Main.Path != \"\" {\n\t\tmodulePrefix = info.Main.Path + \"/\"\n\t\tmoduleLastSegment = path.Base(info.Main.Path)\n\t}\n}\n\nconst LevelTrace = slog.LevelDebug - 4\n\n// LoggingConfig configures logging.\ntype LoggingConfig struct {\n\tLevel string `yaml:\"level\"`\n\tType string `yaml:\"type\"`\n\tStderr bool `yaml:\"stderr\"`\n\tSource bool `yaml:\"source\"`\n}\n\nfunc InitLog(w io.Writer, level, typ string, addSource bool) {\n\tlogOptions := slog.HandlerOptions{\n\t\tLevel: slog.LevelInfo,\n\t\tAddSource: addSource,\n\t\tReplaceAttr: ReplaceAttr,\n\t}\n\n\t// Read log level from environment, if available.\n\tif v := os.Getenv(\"LOG_LEVEL\"); v != \"\" {\n\t\tlevel = v\n\t}\n\n\tswitch strings.ToUpper(level) {\n\tcase \"TRACE\":\n\t\tlogOptions.Level = LevelTrace\n\tcase \"DEBUG\":\n\t\tlogOptions.Level = slog.LevelDebug\n\tcase \"INFO\":\n\t\tlogOptions.Level = slog.LevelInfo\n\tcase \"WARN\", \"WARNING\":\n\t\tlogOptions.Level = slog.LevelWarn\n\tcase \"ERROR\":\n\t\tlogOptions.Level = slog.LevelError\n\t}\n\n\tvar logHandler slog.Handler\n\tswitch typ {\n\tcase \"json\":\n\t\tlogHandler = slog.NewJSONHandler(w, \u0026logOptions)\n\tcase \"pretty\":\n\t\tnoColor := true\n\t\tif f, ok := w.(*os.File); ok {\n\t\t\tnoColor = !isatty.IsTerminal(f.Fd()) \u0026\u0026 !isatty.IsCygwinTerminal(f.Fd())\n\t\t}\n\t\tlogHandler = tint.NewHandler(w, \u0026tint.Options{\n\t\t\tLevel: logOptions.Level,\n\t\t\tAddSource: addSource,\n\t\t\tTimeFormat: time.TimeOnly,\n\t\t\tNoColor: noColor,\n\t\t\tReplaceAttr: ReplaceAttr,\n\t\t})\n\tcase \"text\", \"\":\n\t\tlogHandler = slog.NewTextHandler(w, \u0026logOptions)\n\t}\n\n\t// Set global default logger.\n\tslog.SetDefault(slog.New(logHandler))\n}\n\nfunc CleanSourcePath(src *slog.Source) {\n\tif modulePrefix == \"\" {\n\t\treturn\n\t}\n\n\tif idx := strings.Index(src.File, modulePrefix); idx \u003e= 0 {\n\t\tsrc.File = src.File[idx+len(modulePrefix):]\n\t\treturn\n\t}\n\n\tmoduleName := strings.TrimSuffix(modulePrefix, \"/\")\n\tif idx := strings.Index(src.File, moduleName+\"@\"); idx \u003e= 0 {\n\t\trest := src.File[idx+len(moduleName):]\n\t\tif slashIdx := strings.Index(rest, \"/\"); slashIdx \u003e= 0 {\n\t\t\tsrc.File = rest[slashIdx+1:]\n\t\t}\n\t\treturn\n\t}\n\n\tif moduleLastSegment != \"\" {\n\t\tsep := \"/\" + moduleLastSegment + \"/\"\n\t\tif idx := strings.LastIndex(src.File, sep); idx \u003e= 0 {\n\t\t\tsrc.File = src.File[idx+len(sep):]\n\t\t}\n\t}\n}\n\nfunc ReplaceAttr(groups []string, a slog.Attr) slog.Attr {\n\tif a.Key == slog.LevelKey \u0026\u0026 a.Value.Any() == LevelTrace {\n\t\ta.Value = slog.StringValue(\"TRACE\")\n\t}\n\n\tif a.Key == slog.SourceKey {\n\t\tif src, ok := a.Value.Any().(*slog.Source); ok {\n\t\t\tCleanSourcePath(src)\n\t\t}\n\t}\n\n\treturn a\n}\n","imports":[{"name":"io","path":"io","span":{"start":[4,1],"end":[4,6],"bytes":[27,32]}},{"name":"slog","path":"log/slog","span":{"start":[5,1],"end":[5,12],"bytes":[33,44]}},{"name":"os","path":"os","span":{"start":[6,1],"end":[6,6],"bytes":[45,50]}},{"name":"path","path":"path","span":{"start":[7,1],"end":[7,8],"bytes":[51,58]}},{"name":"debug","path":"runtime/debug","span":{"start":[8,1],"end":[8,17],"bytes":[59,75]}},{"name":"strings","path":"strings","span":{"start":[9,1],"end":[9,11],"bytes":[76,86]}},{"name":"time","path":"time","span":{"start":[10,1],"end":[10,8],"bytes":[87,94]}},{"name":"tint","path":"github.com/lmittmann/tint","span":{"start":[12,1],"end":[12,29],"bytes":[96,124]}},{"name":"go-isatty","path":"github.com/mattn/go-isatty","span":{"start":[13,1],"end":[13,30],"bytes":[125,154]}}],"types":{"LoggingConfig":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig","kind":"struct","span":{"start":[29,1],"end":[34,2],"bytes":[463,613]},"callables":{},"fields":{"Level":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig/Level","kind":"field","type":"string","span":{"start":[30,1],"end":[30,30],"bytes":[491,520]}},"Source":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig/Source","kind":"field","type":"bool","span":{"start":[33,1],"end":[33,31],"bytes":[581,611]}},"Stderr":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig/Stderr","kind":"field","type":"bool","span":{"start":[32,1],"end":[32,31],"bytes":[550,580]}},"Type":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig/Type","kind":"field","type":"string","span":{"start":[31,1],"end":[31,29],"bytes":[521,549]}}}}},"functions":{"github.com/benbjohnson/litestream/internal.CleanSourcePath":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath","kind":"function","span":{"start":[85,1],"end":[110,2],"bytes":[1813,2449]},"signature":"github.com/benbjohnson/litestream/internal.CleanSourcePath","parameters":[{"name":"src","type":"*log/slog.Source","span":{"start":[85,1],"end":[85,41],"bytes":[1813,1853]}}],"metrics":{"cyclomatic":7},"body":{"106:13":{"kind":"call","span":{"start":[106,13],"end":[106,45],"bytes":[2358,2390]},"callee":null},"107:28":{"kind":"call","span":{"start":[107,28],"end":[107,36],"bytes":[2430,2438]},"callee":null},"90:12":{"kind":"call","span":{"start":[90,12],"end":[90,49],"bytes":[1903,1940]},"callee":null},"91:27":{"kind":"call","span":{"start":[91,27],"end":[91,44],"bytes":[1979,1996]},"callee":null},"95:16":{"kind":"call","span":{"start":[95,16],"end":[95,53],"bytes":[2027,2064]},"callee":null},"96:12":{"kind":"call","span":{"start":[96,12],"end":[96,51],"bytes":[2076,2115]},"callee":null},"97:24":{"kind":"call","span":{"start":[97,24],"end":[97,39],"bytes":[2151,2166]},"callee":null},"98:18":{"kind":"call","span":{"start":[98,18],"end":[98,42],"bytes":[2186,2210]},"callee":null}}},"github.com/benbjohnson/litestream/internal.InitLog":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","kind":"function","span":{"start":[36,1],"end":[83,2],"bytes":[615,1811]},"signature":"github.com/benbjohnson/litestream/internal.InitLog","parameters":[{"name":"w","type":"io.Writer","span":{"start":[36,1],"end":[36,63],"bytes":[615,677]}},{"name":"level","type":"string","span":{"start":[36,1],"end":[36,63],"bytes":[615,677]}},{"name":"typ","type":"string","span":{"start":[36,1],"end":[36,63],"bytes":[615,677]}},{"name":"addSource","type":"bool","span":{"start":[36,1],"end":[36,63],"bytes":[615,677]}}],"metrics":{"cyclomatic":13},"body":{"44:10":{"kind":"call","span":{"start":[44,10],"end":[44,32],"bytes":[863,885]},"callee":null},"48:9":{"kind":"call","span":{"start":[48,9],"end":[48,31],"bytes":[921,943]},"callee":null},"64:16":{"kind":"call","span":{"start":[64,16],"end":[64,51],"bytes":[1284,1319]},"callee":null},"68:15":{"kind":"call","span":{"start":[68,15],"end":[68,40],"bytes":[1401,1426]},"callee":null},"68:33":{"kind":"call","span":{"start":[68,33],"end":[68,39],"bytes":[1419,1425]},"callee":null},"68:45":{"kind":"call","span":{"start":[68,45],"end":[68,76],"bytes":[1431,1462]},"callee":null},"68:69":{"kind":"call","span":{"start":[68,69],"end":[68,75],"bytes":[1455,1461]},"callee":null},"70:16":{"kind":"call","span":{"start":[70,16],"end":[76,5],"bytes":[1482,1666]},"callee":null},"78:16":{"kind":"call","span":{"start":[78,16],"end":[78,51],"bytes":[1700,1735]},"callee":null},"82:18":{"kind":"call","span":{"start":[82,18],"end":[82,38],"bytes":[1788,1808]},"callee":null},"82:2":{"kind":"call","span":{"start":[82,2],"end":[82,39],"bytes":[1772,1809]},"callee":null}}},"github.com/benbjohnson/litestream/internal.ReplaceAttr":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr","kind":"function","span":{"start":[112,1],"end":[124,2],"bytes":[2451,2736]},"signature":"github.com/benbjohnson/litestream/internal.ReplaceAttr","parameters":[{"name":"groups","type":"[]string","span":{"start":[112,1],"end":[112,59],"bytes":[2451,2509]}},{"name":"a","type":"log/slog.Attr","span":{"start":[112,1],"end":[112,59],"bytes":[2451,2509]}}],"return_type":"log/slog.Attr","metrics":{"cyclomatic":4},"body":{"113:31":{"kind":"call","span":{"start":[113,31],"end":[113,44],"bytes":[2540,2553]},"callee":null},"114:13":{"kind":"call","span":{"start":[114,13],"end":[114,38],"bytes":[2582,2607]},"callee":null},"118:17":{"kind":"call","span":{"start":[118,17],"end":[118,30],"bytes":[2658,2671]},"callee":null},"119:4":{"kind":"call","span":{"start":[119,4],"end":[119,24],"bytes":[2696,2716]},"callee":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath"}}},"github.com/benbjohnson/litestream/internal.init":{"id":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.init","kind":"function","span":{"start":[19,1],"end":[24,2],"bytes":[212,384]},"signature":"github.com/benbjohnson/litestream/internal.init","parameters":[],"metrics":{"cyclomatic":2},"body":{"20:17":{"kind":"call","span":{"start":[20,17],"end":[20,38],"bytes":[242,263]},"callee":null},"22:23":{"kind":"call","span":{"start":[22,23],"end":[22,48],"bytes":[354,379]},"callee":null}}}},"content_hash":"c9c5547d3de71f196df17f3249b69dfca8c99670203b2b6ef1b287535b67e95a"},"internal/resumable_reader.go":{"id":"can://go/litestream/internal/resumable_reader.go","kind":"module","span":{"start":[1,1],"end":[311,1],"bytes":[0,10457]},"package":"internal","source":"package internal\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/superfly/ltx\"\n)\n\ntype LTXFileOpener interface {\n\tOpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error)\n}\n\n// resumableReader wraps an io.ReadCloser from a remote storage backend with\n// automatic reconnection on read errors.\n//\n// During restore, the LTX compactor opens all LTX file streams upfront, then\n// processes pages in page-number order. Incremental LTX files that only contain\n// high-numbered pages may have their S3/storage streams sit idle for minutes\n// while the compactor works through lower-numbered pages from the snapshot.\n// Storage providers (S3, Tigris, etc.) may close these idle connections,\n// causing \"unexpected EOF\" errors.\n//\n// This reader detects two failure modes:\n// 1. Non-EOF errors (connection reset, timeout) - the stream broke mid-transfer.\n// 2. Premature EOF - the server closed the connection cleanly, but we haven't\n// read all bytes yet (detected by comparing offset against known file size).\n//\n// On failure, it closes the dead stream and reopens from the current byte\n// offset using the storage backend's range request support (the offset parameter\n// of OpenLTXFile). Callers like io.ReadFull see a seamless byte stream because\n// partial reads are returned without error, prompting the caller to request\n// remaining bytes on the next Read call.\ntype ResumableReader struct {\n\tctx context.Context\n\tclient LTXFileOpener\n\tlevel int\n\tminTXID ltx.TXID\n\tmaxTXID ltx.TXID\n\tsize int64 // expected total file size from FileInfo; 0 means unknown\n\toffset int64\n\tretryN int\n\terr error\n\tlogger *slog.Logger\n\n\t// mu guards rc and closed. Close may be called from a different goroutine\n\t// than Read: Compactor.Compact closes its source readers when it returns\n\t// while its compaction goroutine may still be reading them. Once closed is\n\t// set, Read must not reopen the stream or it would leak the new connection.\n\tmu sync.Mutex\n\trc io.ReadCloser\n\tcancel context.CancelFunc\n\tclosed bool\n}\n\n// NewResumableReader creates a ResumableReader. Primarily exposed for testing.\nfunc NewResumableReader(ctx context.Context, client LTXFileOpener, level int, minTXID, maxTXID ltx.TXID, size int64, rc io.ReadCloser, logger *slog.Logger) *ResumableReader {\n\treturn \u0026ResumableReader{\n\t\tctx: ctx,\n\t\tclient: client,\n\t\tlevel: level,\n\t\tminTXID: minTXID,\n\t\tmaxTXID: maxTXID,\n\t\tsize: size,\n\t\trc: rc,\n\t\tlogger: logger,\n\t}\n}\n\nconst resumableReaderMaxRetries = 3\n\n// resumableReaderBackoff is the base delay between retry attempts, doubling\n// per attempt. Zero-delay retries land every attempt inside the same provider\n// throttle window (e.g. Tigris 408 load shedding), guaranteeing exhaustion.\nconst resumableReaderBackoff = 250 * time.Millisecond\n\n// resumableReaderStallTimeout bounds a single Read of an open stream. Nothing\n// else does: the S3 client sets no ResponseHeaderTimeout and no read deadline on\n// the response body, and TCP keepalive does not fire against a peer that is\n// alive but simply sending nothing. It is a var rather than a const only so\n// tests can shorten it.\nvar resumableReaderStallTimeout = 30 * time.Second\n\n// ErrReadStalled reports a read that produced nothing for\n// resumableReaderStallTimeout and had its stream cancelled to force a reconnect.\nvar ErrReadStalled = errors.New(\"ltx stream read stalled\")\n\nfunc (r *ResumableReader) Read(p []byte) (int, error) {\n\tfor {\n\t\trc, cancel, err := r.stream()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tif r.err != nil {\n\t\t\treturn 0, r.err\n\t\t}\n\n\t\t// Reopen the stream from the current offset if the previous\n\t\t// connection was closed (the stream is nil after a retry).\n\t\tif rc == nil {\n\t\t\tstreamCtx, streamCancel := context.WithCancel(r.ctx)\n\t\t\tnewRC, err := r.client.OpenLTXFile(streamCtx, r.level, r.minTXID, r.maxTXID, r.offset, 0)\n\t\t\tif err != nil {\n\t\t\t\tstreamCancel()\n\t\t\t\tif errors.Is(err, os.ErrNotExist) || errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {\n\t\t\t\t\treturn 0, fmt.Errorf(\"reopen ltx file at offset %d: %w\", r.offset, err)\n\t\t\t\t}\n\t\t\t\tif ctxErr := r.ctx.Err(); ctxErr != nil {\n\t\t\t\t\tr.err = fmt.Errorf(\"reopen ltx file at offset %d: %v: %w\", r.offset, err, ctxErr)\n\t\t\t\t\treturn 0, r.err\n\t\t\t\t}\n\t\t\t\tif retryErr := r.retry(fmt.Errorf(\"reopen ltx file at offset %d: %w\", r.offset, err)); retryErr != nil {\n\t\t\t\t\treturn 0, retryErr\n\t\t\t\t}\n\t\t\t\tr.logger.Debug(\"reopen ltx file failed, retrying\",\n\t\t\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\t\t\"offset\", r.offset, \"error\", err, \"attempt\", r.retryN)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif !r.setStream(newRC, streamCancel) {\n\t\t\t\t// Closed while the stream was being reopened.\n\t\t\t\tstreamCancel()\n\t\t\t\t_ = newRC.Close()\n\t\t\t\treturn 0, os.ErrClosed\n\t\t\t}\n\t\t\trc, cancel = newRC, streamCancel\n\t\t}\n\n\t\tn, err := r.readStream(rc, cancel, p)\n\t\tr.offset += int64(n)\n\n\t\tif err == nil {\n\t\t\tif n \u003e 0 \u0026\u0026 n == len(p) {\n\t\t\t\tr.retryN = 0\n\t\t\t}\n\t\t\treturn n, nil\n\t\t}\n\n\t\tif err == io.EOF {\n\t\t\t// Distinguish legitimate EOF (fully read) from premature EOF\n\t\t\t// (server closed idle connection). When the file size is known\n\t\t\t// and we haven't read it all, treat as a connection drop.\n\t\t\tif r.size \u003e 0 \u0026\u0026 r.offset \u003c r.size {\n\t\t\t\tr.logger.Debug(\"premature EOF on ltx file, reconnecting\",\n\t\t\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\t\t\"offset\", r.offset, \"size\", r.size, \"attempt\", r.retryN+1)\n\t\t\t\tr.dropStream()\n\t\t\t\tif retryErr := r.retry(io.ErrUnexpectedEOF); retryErr != nil {\n\t\t\t\t\treturn n, retryErr\n\t\t\t\t}\n\t\t\t\tif n \u003e 0 {\n\t\t\t\t\t// Return the bytes we did get. The caller (e.g. io.ReadFull)\n\t\t\t\t\t// will call Read again, which will trigger the reopen above.\n\t\t\t\t\treturn n, nil\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn n, io.EOF\n\t\t}\n\n\t\t// Non-EOF error (connection reset, timeout, etc.). Close the dead\n\t\t// stream so the next iteration reopens from the current offset.\n\t\tr.logger.Debug(\"read error on ltx file, reconnecting\",\n\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\"error\", err, \"offset\", r.offset, \"attempt\", r.retryN+1)\n\t\tr.dropStream()\n\t\tif retryErr := r.retry(err); retryErr != nil {\n\t\t\treturn n, retryErr\n\t\t}\n\t\tif n \u003e 0 {\n\t\t\treturn n, nil\n\t\t}\n\t}\n}\n\n// readStream reads from the current stream under a stall timeout. A read that\n// produces nothing before the timeout expires has its stream's request context\n// cancelled, which unblocks the read with an error and sends the caller down the\n// reconnect path that already handles a dropped connection.\n//\n// Cancellation rather than Close: net/http's (*body).Read holds the body mutex\n// for the duration of the network read and (*body).Close wants that same mutex,\n// so a watchdog calling Close would queue behind the very read it is trying to\n// interrupt. Only the request context reaches a parked read.\nfunc (r *ResumableReader) readStream(rc io.ReadCloser, cancel context.CancelFunc, p []byte) (int, error) {\n\t// Captured per stream: by the time the timer fires, r.cancel may already\n\t// belong to a healthy replacement, and cancelling that one would be a\n\t// self-inflicted drop.\n\ttimeout, offset := resumableReaderStallTimeout, r.offset\n\tif cancel == nil || timeout \u003c= 0 {\n\t\treturn rc.Read(p)\n\t}\n\n\tvar stalled atomic.Bool\n\ttimer := time.AfterFunc(timeout, func() {\n\t\tstalled.Store(true)\n\t\tr.logger.Debug(\"ltx file read stalled, cancelling stream\",\n\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\"offset\", offset, \"timeout\", timeout)\n\t\tcancel()\n\t})\n\tdefer timer.Stop()\n\n\tn, err := rc.Read(p)\n\tif err != nil \u0026\u0026 stalled.Load() {\n\t\t// %v, not %w: the underlying error is context.Canceled, and a stall is\n\t\t// retryable where a cancelled parent context is terminal. Letting\n\t\t// context.Canceled into the chain invites an errors.Is check above to\n\t\t// abandon a restore that only needed to reconnect.\n\t\terr = fmt.Errorf(\"%w after %s: %v\", ErrReadStalled, timeout, err)\n\t}\n\treturn n, err\n}\n\n// Close closes the current underlying stream, if any, and marks the reader as\n// closed. Closing is permanent: subsequent reads fail with os.ErrClosed rather\n// than reopening the remote stream, which would leak the new connection.\nfunc (r *ResumableReader) Close() error {\n\tr.mu.Lock()\n\tif r.closed {\n\t\tr.mu.Unlock()\n\t\treturn nil\n\t}\n\tr.closed = true\n\trc, cancel := r.rc, r.cancel\n\tr.rc, r.cancel = nil, nil\n\tr.mu.Unlock()\n\n\tif cancel != nil {\n\t\tcancel()\n\t}\n\tif rc != nil {\n\t\treturn rc.Close()\n\t}\n\treturn nil\n}\n\n// stream returns the current underlying stream, or nil if the next read should\n// reopen it. Returns os.ErrClosed if the reader has been closed.\nfunc (r *ResumableReader) stream() (io.ReadCloser, context.CancelFunc, error) {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tif r.closed {\n\t\treturn nil, nil, os.ErrClosed\n\t}\n\treturn r.rc, r.cancel, nil\n}\n\n// setStream installs a newly reopened stream. It reports false if the reader\n// was closed while the stream was being opened, in which case the caller must\n// close the new stream itself.\nfunc (r *ResumableReader) setStream(rc io.ReadCloser, cancel context.CancelFunc) bool {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tif r.closed {\n\t\treturn false\n\t}\n\tr.rc, r.cancel = rc, cancel\n\treturn true\n}\n\n// dropStream closes and clears the current stream after a read failure so the\n// next read reopens from the current offset. The stream is already being\n// discarded, so a close error should not stop recovery. Log it only to aid\n// debugging.\nfunc (r *ResumableReader) dropStream() {\n\tr.mu.Lock()\n\trc, cancel := r.rc, r.cancel\n\tr.rc, r.cancel = nil, nil\n\tr.mu.Unlock()\n\n\tif cancel != nil {\n\t\tcancel()\n\t}\n\tif rc == nil {\n\t\treturn\n\t}\n\tif err := rc.Close(); err != nil {\n\t\tr.logger.Debug(\"close ltx file\",\n\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\"offset\", r.offset, \"error\", err)\n\t}\n}\n\nfunc (r *ResumableReader) retry(err error) error {\n\tr.retryN++\n\tif r.retryN \u003e resumableReaderMaxRetries {\n\t\tr.err = fmt.Errorf(\"max retries exceeded reading ltx file (level=%d, min=%s, max=%s, offset=%d): %w\",\n\t\t\tr.level, r.minTXID, r.maxTXID, r.offset, err)\n\t\treturn r.err\n\t}\n\n\t// Wait before the caller reopens. Retrying with no delay lands every\n\t// attempt inside the same provider throttle window, so the attempts are\n\t// spent without the provider ever getting a chance to recover.\n\tselect {\n\tcase \u003c-r.ctx.Done():\n\t\tr.err = r.ctx.Err()\n\t\treturn r.err\n\tcase \u003c-time.After(resumableReaderBackoff \u003c\u003c (r.retryN - 1)):\n\t}\n\treturn nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[27,37]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[38,47]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[48,54]}},{"name":"io","path":"io","span":{"start":[7,1],"end":[7,6],"bytes":[55,60]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[61,72]}},{"name":"os","path":"os","span":{"start":[9,1],"end":[9,6],"bytes":[73,78]}},{"name":"sync","path":"sync","span":{"start":[10,1],"end":[10,8],"bytes":[79,86]}},{"name":"atomic","path":"sync/atomic","span":{"start":[11,1],"end":[11,15],"bytes":[87,101]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[102,109]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[14,1],"end":[14,27],"bytes":[111,137]}}],"types":{"LTXFileOpener":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.LTXFileOpener","kind":"interface","span":{"start":[17,1],"end":[19,2],"bytes":[141,288]},"callables":{"github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.LTXFileOpener/github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile","kind":"method","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]},"signature":"github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"level","type":"int","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"offset","type":"int64","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"size","type":"int64","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"body":{}}}},"ResumableReader":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader","kind":"struct","span":{"start":[41,1],"end":[61,2],"bytes":[1485,2140]},"callables":{"github.com/benbjohnson/litestream/internal.ResumableReader.Close":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close","kind":"method","span":{"start":[225,1],"end":[243,2],"bytes":[8208,8486]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"226:2":{"kind":"call","span":{"start":[226,2],"end":[226,13],"bytes":[8251,8262]},"callee":null},"228:3":{"kind":"call","span":{"start":[228,3],"end":[228,16],"bytes":[8280,8293]},"callee":null},"234:2":{"kind":"call","span":{"start":[234,2],"end":[234,15],"bytes":[8385,8398]},"callee":null},"237:3":{"kind":"call","span":{"start":[237,3],"end":[237,11],"bytes":[8422,8430]},"callee":null},"240:10":{"kind":"call","span":{"start":[240,10],"end":[240,20],"bytes":[8459,8469]},"callee":null}}},"github.com/benbjohnson/litestream/internal.ResumableReader.Read":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","kind":"method","span":{"start":[95,1],"end":[181,2],"bytes":[3491,6267]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.Read","parameters":[{"name":"p","type":"[]byte","span":{"start":[95,1],"end":[95,56],"bytes":[3491,3546]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":18},"body":{"108:31":{"kind":"call","span":{"start":[108,31],"end":[108,56],"bytes":[3841,3866]},"callee":null},"109:18":{"kind":"call","span":{"start":[109,18],"end":[109,93],"bytes":[3884,3959]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.LTXFileOpener/github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile"},"111:5":{"kind":"call","span":{"start":[111,5],"end":[111,19],"bytes":[3983,3997]},"callee":null},"112:42":{"kind":"call","span":{"start":[112,42],"end":[112,74],"bytes":[4039,4071]},"callee":null},"112:78":{"kind":"call","span":{"start":[112,78],"end":[112,118],"bytes":[4075,4115]},"callee":null},"112:8":{"kind":"call","span":{"start":[112,8],"end":[112,38],"bytes":[4005,4035]},"callee":null},"113:16":{"kind":"call","span":{"start":[113,16],"end":[113,77],"bytes":[4133,4194]},"callee":null},"115:18":{"kind":"call","span":{"start":[115,18],"end":[115,29],"bytes":[4218,4229]},"callee":null},"116:14":{"kind":"call","span":{"start":[116,14],"end":[116,87],"bytes":[4260,4333]},"callee":null},"119:20":{"kind":"call","span":{"start":[119,20],"end":[119,90],"bytes":[4380,4450]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry"},"119:28":{"kind":"call","span":{"start":[119,28],"end":[119,89],"bytes":[4388,4449]},"callee":null},"122:5":{"kind":"call","span":{"start":[122,5],"end":[124,60],"bytes":[4504,4673]},"callee":null},"127:8":{"kind":"call","span":{"start":[127,8],"end":[127,40],"bytes":[4699,4731]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream"},"129:5":{"kind":"call","span":{"start":[129,5],"end":[129,19],"bytes":[4789,4803]},"callee":null},"130:9":{"kind":"call","span":{"start":[130,9],"end":[130,22],"bytes":[4812,4825]},"callee":null},"136:13":{"kind":"call","span":{"start":[136,13],"end":[136,40],"bytes":[4911,4938]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream"},"137:15":{"kind":"call","span":{"start":[137,15],"end":[137,23],"bytes":[4953,4961]},"callee":null},"140:21":{"kind":"call","span":{"start":[140,21],"end":[140,27],"bytes":[5001,5007]},"callee":null},"151:5":{"kind":"call","span":{"start":[151,5],"end":[153,64],"bytes":[5313,5493]},"callee":null},"154:5":{"kind":"call","span":{"start":[154,5],"end":[154,19],"bytes":[5498,5512]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream"},"155:20":{"kind":"call","span":{"start":[155,20],"end":[155,48],"bytes":[5532,5560]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry"},"170:3":{"kind":"call","span":{"start":[170,3],"end":[172,60],"bytes":[5965,6136]},"callee":null},"173:3":{"kind":"call","span":{"start":[173,3],"end":[173,17],"bytes":[6139,6153]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream"},"174:18":{"kind":"call","span":{"start":[174,18],"end":[174,30],"bytes":[6171,6183]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry"},"97:22":{"kind":"call","span":{"start":[97,22],"end":[97,32],"bytes":[3575,3585]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream"}}},"github.com/benbjohnson/litestream/internal.ResumableReader.dropStream":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","kind":"method","span":{"start":[273,1],"end":[290,2],"bytes":[9461,9819]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","parameters":[],"metrics":{"cyclomatic":4},"body":{"274:2":{"kind":"call","span":{"start":[274,2],"end":[274,13],"bytes":[9503,9514]},"callee":null},"277:2":{"kind":"call","span":{"start":[277,2],"end":[277,15],"bytes":[9573,9586]},"callee":null},"280:3":{"kind":"call","span":{"start":[280,3],"end":[280,11],"bytes":[9610,9618]},"callee":null},"285:12":{"kind":"call","span":{"start":[285,12],"end":[285,22],"bytes":[9661,9671]},"callee":null},"286:3":{"kind":"call","span":{"start":[286,3],"end":[288,37],"bytes":[9688,9814]},"callee":null}}},"github.com/benbjohnson/litestream/internal.ResumableReader.readStream":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","kind":"method","span":{"start":[192,1],"end":[220,2],"bytes":[6877,7973]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.readStream","parameters":[{"name":"rc","type":"io.ReadCloser","span":{"start":[192,1],"end":[192,107],"bytes":[6877,6983]}},{"name":"cancel","type":"context.CancelFunc","span":{"start":[192,1],"end":[192,107],"bytes":[6877,6983]}},{"name":"p","type":"[]byte","span":{"start":[192,1],"end":[192,107],"bytes":[6877,6983]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"198:10":{"kind":"call","span":{"start":[198,10],"end":[198,20],"bytes":[7259,7269]},"callee":null},"202:11":{"kind":"call","span":{"start":[202,11],"end":[208,4],"bytes":[7309,7537]},"callee":null},"209:8":{"kind":"call","span":{"start":[209,8],"end":[209,20],"bytes":[7545,7557]},"callee":null},"211:12":{"kind":"call","span":{"start":[211,12],"end":[211,22],"bytes":[7570,7580]},"callee":null},"212:19":{"kind":"call","span":{"start":[212,19],"end":[212,33],"bytes":[7599,7613]},"callee":null},"217:9":{"kind":"call","span":{"start":[217,9],"end":[217,68],"bytes":[7894,7953]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream/github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1","kind":"function","span":{"start":[202,1],"end":[208,4],"bytes":[7299,7537]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1","parameters":[],"body":{"203:3":{"kind":"call","span":{"start":[203,3],"end":[203,22],"bytes":[7344,7363]},"callee":null},"204:3":{"kind":"call","span":{"start":[204,3],"end":[206,41],"bytes":[7366,7522]},"callee":null},"207:3":{"kind":"call","span":{"start":[207,3],"end":[207,11],"bytes":[7525,7533]},"callee":null}}}}},"github.com/benbjohnson/litestream/internal.ResumableReader.retry":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry","kind":"method","span":{"start":[292,1],"end":[310,2],"bytes":[9821,10456]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.retry","parameters":[{"name":"err","type":"error","span":{"start":[292,1],"end":[292,51],"bytes":[9821,9871]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"295:11":{"kind":"call","span":{"start":[295,11],"end":[296,49],"bytes":[9937,10079]},"callee":null},"304:9":{"kind":"call","span":{"start":[304,9],"end":[304,21],"bytes":[10327,10339]},"callee":null},"305:11":{"kind":"call","span":{"start":[305,11],"end":[305,22],"bytes":[10351,10362]},"callee":null},"307:9":{"kind":"call","span":{"start":[307,9],"end":[307,61],"bytes":[10386,10438]},"callee":null}}},"github.com/benbjohnson/litestream/internal.ResumableReader.setStream":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream","kind":"method","span":{"start":[259,1],"end":[267,2],"bytes":[9018,9216]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.setStream","parameters":[{"name":"rc","type":"io.ReadCloser","span":{"start":[259,1],"end":[259,88],"bytes":[9018,9105]}},{"name":"cancel","type":"context.CancelFunc","span":{"start":[259,1],"end":[259,88],"bytes":[9018,9105]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"260:2":{"kind":"call","span":{"start":[260,2],"end":[260,13],"bytes":[9107,9118]},"callee":null},"261:8":{"kind":"call","span":{"start":[261,8],"end":[261,21],"bytes":[9126,9139]},"callee":null}}},"github.com/benbjohnson/litestream/internal.ResumableReader.stream":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream","kind":"method","span":{"start":[247,1],"end":[254,2],"bytes":[8634,8827]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.stream","parameters":[],"return_type":"(io.ReadCloser, context.CancelFunc, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"248:2":{"kind":"call","span":{"start":[248,2],"end":[248,13],"bytes":[8715,8726]},"callee":null},"249:8":{"kind":"call","span":{"start":[249,8],"end":[249,21],"bytes":[8734,8747]},"callee":null}}}},"fields":{"cancel":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[59,1],"end":[59,27],"bytes":[2099,2125]}},"client":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/client","kind":"field","type":"github.com/benbjohnson/litestream/internal.LTXFileOpener","span":{"start":[43,1],"end":[43,23],"bytes":[1540,1562]}},"closed":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/closed","kind":"field","type":"bool","span":{"start":[60,1],"end":[60,13],"bytes":[2126,2138]}},"ctx":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/ctx","kind":"field","type":"context.Context","span":{"start":[42,1],"end":[42,25],"bytes":[1515,1539]}},"err":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/err","kind":"field","type":"error","span":{"start":[50,1],"end":[50,15],"bytes":[1714,1728]}},"level":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/level","kind":"field","type":"int","span":{"start":[44,1],"end":[44,13],"bytes":[1563,1575]}},"logger":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[51,1],"end":[51,22],"bytes":[1729,1750]}},"maxTXID":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/maxTXID","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[46,1],"end":[46,18],"bytes":[1594,1611]}},"minTXID":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/minTXID","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[45,1],"end":[45,18],"bytes":[1576,1593]}},"mu":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/mu","kind":"field","type":"sync.Mutex","span":{"start":[57,1],"end":[57,19],"bytes":[2058,2076]}},"offset":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/offset","kind":"field","type":"int64","span":{"start":[48,1],"end":[48,15],"bytes":[1686,1700]}},"rc":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/rc","kind":"field","type":"io.ReadCloser","span":{"start":[58,1],"end":[58,22],"bytes":[2077,2098]}},"retryN":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/retryN","kind":"field","type":"int","span":{"start":[49,1],"end":[49,13],"bytes":[1701,1713]}},"size":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/size","kind":"field","type":"int64","span":{"start":[47,1],"end":[47,74],"bytes":[1612,1685]}}}}},"functions":{"github.com/benbjohnson/litestream/internal.NewResumableReader":{"id":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader","kind":"function","span":{"start":[64,1],"end":[75,2],"bytes":[2222,2571]},"signature":"github.com/benbjohnson/litestream/internal.NewResumableReader","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"client","type":"github.com/benbjohnson/litestream/internal.LTXFileOpener","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"level","type":"int","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"size","type":"int64","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"rc","type":"io.ReadCloser","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}}],"return_type":"*github.com/benbjohnson/litestream/internal.ResumableReader","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"fa33ef78e5f66fb580013297d9d6f83b89578cdc31f5c6f77ab5322525ad28aa"},"internal/testingutil/testingutil.go":{"id":"can://go/litestream/internal/testingutil/testingutil.go","kind":"module","span":{"start":[1,1],"end":[525,1],"bytes":[0,16630]},"package":"testingutil","source":"package testingutil\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"math/rand/v2\"\n\t\"net\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\tsftpserver \"github.com/pkg/sftp\"\n\t\"golang.org/x/crypto/ssh\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/abs\"\n\t\"github.com/benbjohnson/litestream/file\"\n\t\"github.com/benbjohnson/litestream/gs\"\n\t\"github.com/benbjohnson/litestream/internal\"\n\t\"github.com/benbjohnson/litestream/nats\"\n\t\"github.com/benbjohnson/litestream/oss\"\n\t\"github.com/benbjohnson/litestream/s3\"\n\t\"github.com/benbjohnson/litestream/sftp\"\n\t\"github.com/benbjohnson/litestream/webdav\"\n)\n\nconst (\n\tdefaultTigrisEndpoint = \"https://fly.storage.tigris.dev\"\n\tdefaultTigrisRegion = \"auto\"\n\tdefaultTigrisBucket = \"litestream-dev\"\n\tdefaultTigrisPathRoot = \"integration-tests\"\n)\n\nvar (\n\t// Enables integration tests.\n\tintegration = flag.Bool(\"integration\", false, \"\")\n\t// Enables specific types of replicas to be tested.\n\treplicaClientTypes = flag.String(\"replica-clients\", \"file\", \"\")\n\t// Sets the log level for the tests.\n\tlogLevel = flag.String(\"log.level\", \"debug\", \"\")\n)\n\n// S3 settings\nvar (\n\t// Replica client settings\n\ts3AccessKeyID = flag.String(\"s3-access-key-id\", os.Getenv(\"LITESTREAM_S3_ACCESS_KEY_ID\"), \"\")\n\ts3SecretAccessKey = flag.String(\"s3-secret-access-key\", os.Getenv(\"LITESTREAM_S3_SECRET_ACCESS_KEY\"), \"\")\n\ts3Region = flag.String(\"s3-region\", os.Getenv(\"LITESTREAM_S3_REGION\"), \"\")\n\ts3Bucket = flag.String(\"s3-bucket\", os.Getenv(\"LITESTREAM_S3_BUCKET\"), \"\")\n\ts3Path = flag.String(\"s3-path\", os.Getenv(\"LITESTREAM_S3_PATH\"), \"\")\n\ts3Endpoint = flag.String(\"s3-endpoint\", os.Getenv(\"LITESTREAM_S3_ENDPOINT\"), \"\")\n\ts3ForcePathStyle = flag.Bool(\"s3-force-path-style\", os.Getenv(\"LITESTREAM_S3_FORCE_PATH_STYLE\") == \"true\", \"\")\n\ts3SkipVerify = flag.Bool(\"s3-skip-verify\", os.Getenv(\"LITESTREAM_S3_SKIP_VERIFY\") == \"true\", \"\")\n)\n\n// Tigris settings (S3-compatible)\nvar (\n\ttigrisAccessKeyID = flag.String(\"tigris-access-key-id\", os.Getenv(\"LITESTREAM_TIGRIS_ACCESS_KEY_ID\"), \"\")\n\ttigrisSecretAccessKey = flag.String(\"tigris-secret-access-key\", os.Getenv(\"LITESTREAM_TIGRIS_SECRET_ACCESS_KEY\"), \"\")\n)\n\n// Cloudflare R2 settings (S3-compatible)\nvar (\n\tr2AccessKeyID = flag.String(\"r2-access-key-id\", os.Getenv(\"LITESTREAM_R2_ACCESS_KEY_ID\"), \"\")\n\tr2SecretAccessKey = flag.String(\"r2-secret-access-key\", os.Getenv(\"LITESTREAM_R2_SECRET_ACCESS_KEY\"), \"\")\n\tr2Endpoint = flag.String(\"r2-endpoint\", os.Getenv(\"LITESTREAM_R2_ENDPOINT\"), \"\")\n\tr2Bucket = flag.String(\"r2-bucket\", os.Getenv(\"LITESTREAM_R2_BUCKET\"), \"\")\n)\n\n// Backblaze B2 settings (S3-compatible)\nvar (\n\tb2KeyID = flag.String(\"b2-key-id\", os.Getenv(\"LITESTREAM_B2_KEY_ID\"), \"\")\n\tb2ApplicationKey = flag.String(\"b2-application-key\", os.Getenv(\"LITESTREAM_B2_APPLICATION_KEY\"), \"\")\n\tb2Endpoint = flag.String(\"b2-endpoint\", os.Getenv(\"LITESTREAM_B2_ENDPOINT\"), \"\")\n\tb2Bucket = flag.String(\"b2-bucket\", os.Getenv(\"LITESTREAM_B2_BUCKET\"), \"\")\n)\n\n// Google cloud storage settings\nvar (\n\tgsBucket = flag.String(\"gs-bucket\", os.Getenv(\"LITESTREAM_GS_BUCKET\"), \"\")\n\tgsPath = flag.String(\"gs-path\", os.Getenv(\"LITESTREAM_GS_PATH\"), \"\")\n)\n\n// Azure blob storage settings\nvar (\n\tabsAccountName = flag.String(\"abs-account-name\", os.Getenv(\"LITESTREAM_ABS_ACCOUNT_NAME\"), \"\")\n\tabsAccountKey = flag.String(\"abs-account-key\", os.Getenv(\"LITESTREAM_ABS_ACCOUNT_KEY\"), \"\")\n\tabsSASToken = flag.String(\"abs-sas-token\", os.Getenv(\"LITESTREAM_ABS_SAS_TOKEN\"), \"\")\n\tabsBucket = flag.String(\"abs-bucket\", os.Getenv(\"LITESTREAM_ABS_BUCKET\"), \"\")\n\tabsPath = flag.String(\"abs-path\", os.Getenv(\"LITESTREAM_ABS_PATH\"), \"\")\n)\n\n// SFTP settings\nvar (\n\tsftpHost = flag.String(\"sftp-host\", os.Getenv(\"LITESTREAM_SFTP_HOST\"), \"\")\n\tsftpUser = flag.String(\"sftp-user\", os.Getenv(\"LITESTREAM_SFTP_USER\"), \"\")\n\tsftpPassword = flag.String(\"sftp-password\", os.Getenv(\"LITESTREAM_SFTP_PASSWORD\"), \"\")\n\tsftpKeyPath = flag.String(\"sftp-key-path\", os.Getenv(\"LITESTREAM_SFTP_KEY_PATH\"), \"\")\n\tsftpPath = flag.String(\"sftp-path\", os.Getenv(\"LITESTREAM_SFTP_PATH\"), \"\")\n)\n\n// WebDAV settings\nvar (\n\twebdavURL = flag.String(\"webdav-url\", os.Getenv(\"LITESTREAM_WEBDAV_URL\"), \"\")\n\twebdavUsername = flag.String(\"webdav-username\", os.Getenv(\"LITESTREAM_WEBDAV_USERNAME\"), \"\")\n\twebdavPassword = flag.String(\"webdav-password\", os.Getenv(\"LITESTREAM_WEBDAV_PASSWORD\"), \"\")\n\twebdavPath = flag.String(\"webdav-path\", os.Getenv(\"LITESTREAM_WEBDAV_PATH\"), \"\")\n)\n\n// NATS settings\nvar (\n\tnatsURL = flag.String(\"nats-url\", os.Getenv(\"LITESTREAM_NATS_URL\"), \"\")\n\tnatsBucket = flag.String(\"nats-bucket\", os.Getenv(\"LITESTREAM_NATS_BUCKET\"), \"\")\n\tnatsCreds = flag.String(\"nats-creds\", os.Getenv(\"LITESTREAM_NATS_CREDS\"), \"\")\n\tnatsUsername = flag.String(\"nats-username\", os.Getenv(\"LITESTREAM_NATS_USERNAME\"), \"\")\n\tnatsPassword = flag.String(\"nats-password\", os.Getenv(\"LITESTREAM_NATS_PASSWORD\"), \"\")\n)\n\n// Alibaba Cloud OSS settings\nvar (\n\tossAccessKeyID = flag.String(\"oss-access-key-id\", os.Getenv(\"LITESTREAM_OSS_ACCESS_KEY_ID\"), \"\")\n\tossAccessKeySecret = flag.String(\"oss-access-key-secret\", os.Getenv(\"LITESTREAM_OSS_ACCESS_KEY_SECRET\"), \"\")\n\tossRegion = flag.String(\"oss-region\", os.Getenv(\"LITESTREAM_OSS_REGION\"), \"\")\n\tossBucket = flag.String(\"oss-bucket\", os.Getenv(\"LITESTREAM_OSS_BUCKET\"), \"\")\n\tossPath = flag.String(\"oss-path\", os.Getenv(\"LITESTREAM_OSS_PATH\"), \"\")\n\tossEndpoint = flag.String(\"oss-endpoint\", os.Getenv(\"LITESTREAM_OSS_ENDPOINT\"), \"\")\n)\n\nfunc Integration() bool {\n\treturn *integration\n}\n\nfunc ReplicaClientTypes() []string {\n\treturn strings.Split(*replicaClientTypes, \",\")\n}\n\nfunc NewDB(tb testing.TB, path string) *litestream.DB {\n\ttb.Helper()\n\ttb.Logf(\"db=%s\", path)\n\n\tlevel := slog.LevelDebug\n\tif strings.EqualFold(*logLevel, \"trace\") {\n\t\tlevel = internal.LevelTrace\n\t}\n\n\tdb := litestream.NewDB(path)\n\tdb.Logger = slog.New(slog.NewTextHandler(os.Stdout, \u0026slog.HandlerOptions{\n\t\tLevel: level,\n\t\tReplaceAttr: internal.ReplaceAttr,\n\t}))\n\treturn db\n}\n\n// MustOpenDBs returns a new instance of a DB \u0026 associated SQL DB.\nfunc MustOpenDBs(tb testing.TB) (*litestream.DB, *sql.DB) {\n\ttb.Helper()\n\tdb := MustOpenDB(tb)\n\treturn db, MustOpenSQLDB(tb, db.Path())\n}\n\n// MustCloseDBs closes db \u0026 sqldb and removes the parent directory.\nfunc MustCloseDBs(tb testing.TB, db *litestream.DB, sqldb *sql.DB) {\n\ttb.Helper()\n\tMustCloseDB(tb, db)\n\tMustCloseSQLDB(tb, sqldb)\n}\n\n// MustOpenDB returns a new instance of a DB.\nfunc MustOpenDB(tb testing.TB) *litestream.DB {\n\ttb.Helper()\n\tdir := tb.TempDir()\n\treturn MustOpenDBAt(tb, filepath.Join(dir, \"db\"))\n}\n\n// MustOpenDBAt returns a new instance of a DB for a given path.\nfunc MustOpenDBAt(tb testing.TB, path string) *litestream.DB {\n\ttb.Helper()\n\tdb := NewDB(tb, path)\n\tdb.MonitorInterval = 0 // disable background goroutine\n\tdb.ShutdownSyncTimeout = 0 // disable shutdown sync retry for faster tests\n\tdb.Replica = litestream.NewReplica(db)\n\tdb.Replica.Client = NewFileReplicaClient(tb)\n\tdb.Replica.MonitorEnabled = false // disable background goroutine\n\tif err := db.Open(); err != nil {\n\t\ttb.Fatal(err)\n\t}\n\treturn db\n}\n\n// MustCloseDB closes db and removes its parent directory.\nfunc MustCloseDB(tb testing.TB, db *litestream.DB) {\n\ttb.Helper()\n\tif err := db.Close(context.Background()); err != nil \u0026\u0026 !strings.Contains(err.Error(), `database is closed`) \u0026\u0026 !strings.Contains(err.Error(), `file already closed`) {\n\t\ttb.Fatal(err)\n\t} else if err := os.RemoveAll(filepath.Dir(db.Path())); err != nil {\n\t\ttb.Fatal(err)\n\t}\n}\n\n// MustOpenSQLDB returns a database/sql DB.\nfunc MustOpenSQLDB(tb testing.TB, path string) *sql.DB {\n\ttb.Helper()\n\td, err := sql.Open(\"sqlite\", path)\n\tif err != nil {\n\t\ttb.Fatal(err)\n\t} else if _, err := d.ExecContext(context.Background(), `PRAGMA journal_mode = wal;`); err != nil {\n\t\ttb.Fatal(err)\n\t} else if _, err := d.ExecContext(context.Background(), `PRAGMA busy_timeout = 5000;`); err != nil {\n\t\ttb.Fatal(err)\n\t}\n\treturn d\n}\n\n// MustCloseSQLDB closes a database/sql DB.\nfunc MustCloseSQLDB(tb testing.TB, d *sql.DB) {\n\ttb.Helper()\n\tif err := d.Close(); err != nil {\n\t\ttb.Fatal(err)\n\t}\n}\n\n// NewReplicaClient returns a new client for integration testing by type name.\nfunc NewReplicaClient(tb testing.TB, typ string) litestream.ReplicaClient {\n\ttb.Helper()\n\n\tswitch typ {\n\tcase file.ReplicaClientType:\n\t\treturn NewFileReplicaClient(tb)\n\tcase s3.ReplicaClientType:\n\t\treturn NewS3ReplicaClient(tb)\n\tcase gs.ReplicaClientType:\n\t\treturn NewGSReplicaClient(tb)\n\tcase abs.ReplicaClientType:\n\t\treturn NewABSReplicaClient(tb)\n\tcase sftp.ReplicaClientType:\n\t\treturn NewSFTPReplicaClient(tb)\n\tcase webdav.ReplicaClientType:\n\t\treturn NewWebDAVReplicaClient(tb)\n\tcase nats.ReplicaClientType:\n\t\treturn NewNATSReplicaClient(tb)\n\tcase oss.ReplicaClientType:\n\t\treturn NewOSSReplicaClient(tb)\n\tcase \"tigris\":\n\t\treturn NewTigrisReplicaClient(tb)\n\tcase \"r2\":\n\t\treturn NewR2ReplicaClient(tb)\n\tcase \"b2\":\n\t\treturn NewB2ReplicaClient(tb)\n\tdefault:\n\t\ttb.Fatalf(\"invalid replica client type: %q\", typ)\n\t\treturn nil\n\t}\n}\n\n// NewFileReplicaClient returns a new client for integration testing.\nfunc NewFileReplicaClient(tb testing.TB) *file.ReplicaClient {\n\ttb.Helper()\n\treturn file.NewReplicaClient(tb.TempDir())\n}\n\n// NewS3ReplicaClient returns a new client for integration testing.\nfunc NewS3ReplicaClient(tb testing.TB) *s3.ReplicaClient {\n\ttb.Helper()\n\n\tc := s3.NewReplicaClient()\n\tc.AccessKeyID = *s3AccessKeyID\n\tc.SecretAccessKey = *s3SecretAccessKey\n\tc.Region = *s3Region\n\tc.Bucket = *s3Bucket\n\tc.Path = path.Join(*s3Path, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = *s3Endpoint\n\tc.ForcePathStyle = *s3ForcePathStyle\n\tc.SkipVerify = *s3SkipVerify\n\treturn c\n}\n\n// NewTigrisReplicaClient returns an S3 client configured for Fly.io Tigris.\nfunc NewTigrisReplicaClient(tb testing.TB) *s3.ReplicaClient {\n\ttb.Helper()\n\n\tif *tigrisAccessKeyID == \"\" || *tigrisSecretAccessKey == \"\" {\n\t\ttb.Skip(\"tigris credentials not configured (set LITESTREAM_TIGRIS_ACCESS_KEY_ID/SECRET_ACCESS_KEY)\")\n\t}\n\n\tc := s3.NewReplicaClient()\n\tc.AccessKeyID = *tigrisAccessKeyID\n\tc.SecretAccessKey = *tigrisSecretAccessKey\n\tc.Region = defaultTigrisRegion\n\tc.Bucket = defaultTigrisBucket\n\tc.Path = path.Join(defaultTigrisPathRoot, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = defaultTigrisEndpoint\n\tc.ForcePathStyle = true\n\tc.RequireContentMD5 = false\n\treturn c\n}\n\n// NewR2ReplicaClient returns an S3 client configured for Cloudflare R2.\n// Skips the test if R2 credentials are not configured.\nfunc NewR2ReplicaClient(tb testing.TB) *s3.ReplicaClient {\n\ttb.Helper()\n\n\tif *r2AccessKeyID == \"\" || *r2SecretAccessKey == \"\" {\n\t\ttb.Skip(\"r2 credentials not configured (set LITESTREAM_R2_ACCESS_KEY_ID/SECRET_ACCESS_KEY)\")\n\t}\n\tif *r2Endpoint == \"\" {\n\t\ttb.Skip(\"r2 endpoint not configured (set LITESTREAM_R2_ENDPOINT)\")\n\t}\n\tif *r2Bucket == \"\" {\n\t\ttb.Skip(\"r2 bucket not configured (set LITESTREAM_R2_BUCKET)\")\n\t}\n\n\tc := s3.NewReplicaClient()\n\tc.AccessKeyID = *r2AccessKeyID\n\tc.SecretAccessKey = *r2SecretAccessKey\n\tc.Region = \"auto\"\n\tc.Bucket = *r2Bucket\n\tc.Path = path.Join(\"integration-tests\", fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = *r2Endpoint\n\tc.ForcePathStyle = true\n\tc.SignPayload = true\n\treturn c\n}\n\n// NewB2ReplicaClient returns a new Backblaze B2 client for integration testing.\n// B2 uses S3-compatible API with path-style URLs and signed payloads.\nfunc NewB2ReplicaClient(tb testing.TB) *s3.ReplicaClient {\n\ttb.Helper()\n\n\tif *b2KeyID == \"\" || *b2ApplicationKey == \"\" {\n\t\ttb.Skip(\"b2 credentials not configured (set LITESTREAM_B2_KEY_ID/APPLICATION_KEY)\")\n\t}\n\tif *b2Endpoint == \"\" {\n\t\ttb.Skip(\"b2 endpoint not configured (set LITESTREAM_B2_ENDPOINT)\")\n\t}\n\tif *b2Bucket == \"\" {\n\t\ttb.Skip(\"b2 bucket not configured (set LITESTREAM_B2_BUCKET)\")\n\t}\n\n\tc := s3.NewReplicaClient()\n\tc.AccessKeyID = *b2KeyID\n\tc.SecretAccessKey = *b2ApplicationKey\n\tc.Region = \"us-west-002\" // B2 uses region in endpoint format\n\tc.Bucket = *b2Bucket\n\tc.Path = path.Join(\"integration-tests\", fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = *b2Endpoint\n\tc.ForcePathStyle = true\n\tc.SignPayload = true\n\treturn c\n}\n\n// NewGSReplicaClient returns a new client for integration testing.\nfunc NewGSReplicaClient(tb testing.TB) *gs.ReplicaClient {\n\ttb.Helper()\n\n\t// Log basic diagnostic information for integration test troubleshooting\n\ttb.Logf(\"GCS Integration Test Setup:\")\n\tcredsSet := \"not set\"\n\tif os.Getenv(\"GOOGLE_APPLICATION_CREDENTIALS\") != \"\" {\n\t\tcredsSet = \"set\"\n\t}\n\ttb.Logf(\" GOOGLE_APPLICATION_CREDENTIALS: %s\", credsSet)\n\ttb.Logf(\" LITESTREAM_GS_BUCKET: %s\", *gsBucket)\n\ttb.Logf(\" LITESTREAM_GS_PATH: %s\", *gsPath)\n\n\tc := gs.NewReplicaClient()\n\tc.Bucket = *gsBucket\n\tc.Path = path.Join(*gsPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\n\t// Test basic connectivity\n\tctx := context.Background()\n\tif err := c.Init(ctx); err != nil {\n\t\ttb.Logf(\"GCS client initialization failed: %v\", err)\n\t\ttb.Logf(\"This may indicate credential or project issues\")\n\t\treturn c // Return anyway to let the actual test show the detailed error\n\t}\n\ttb.Logf(\"GCS client initialized successfully\")\n\n\treturn c\n}\n\n// NewABSReplicaClient returns a new client for integration testing.\nfunc NewABSReplicaClient(tb testing.TB) *abs.ReplicaClient {\n\ttb.Helper()\n\n\tc := abs.NewReplicaClient()\n\tc.AccountName = *absAccountName\n\tc.AccountKey = *absAccountKey\n\tc.SASToken = *absSASToken\n\tc.Bucket = *absBucket\n\tc.Path = path.Join(*absPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\treturn c\n}\n\n// NewSFTPReplicaClient returns a new client for integration testing.\nfunc NewSFTPReplicaClient(tb testing.TB) *sftp.ReplicaClient {\n\ttb.Helper()\n\n\tc := sftp.NewReplicaClient()\n\tc.Host = *sftpHost\n\tc.User = *sftpUser\n\tc.Password = *sftpPassword\n\tc.KeyPath = *sftpKeyPath\n\tc.Path = path.Join(*sftpPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\treturn c\n}\n\n// NewWebDAVReplicaClient returns a new client for integration testing.\nfunc NewWebDAVReplicaClient(tb testing.TB) *webdav.ReplicaClient {\n\ttb.Helper()\n\n\tc := webdav.NewReplicaClient()\n\tc.URL = *webdavURL\n\tc.Username = *webdavUsername\n\tc.Password = *webdavPassword\n\tc.Path = path.Join(*webdavPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\treturn c\n}\n\n// NewNATSReplicaClient returns a new client for integration testing.\nfunc NewNATSReplicaClient(tb testing.TB) *nats.ReplicaClient {\n\ttb.Helper()\n\n\tc := nats.NewReplicaClient()\n\tc.URL = *natsURL\n\tc.BucketName = *natsBucket\n\tc.Creds = *natsCreds\n\tc.Username = *natsUsername\n\tc.Password = *natsPassword\n\treturn c\n}\n\n// NewOSSReplicaClient returns a new client for integration testing.\nfunc NewOSSReplicaClient(tb testing.TB) *oss.ReplicaClient {\n\ttb.Helper()\n\n\tc := oss.NewReplicaClient()\n\tc.AccessKeyID = *ossAccessKeyID\n\tc.AccessKeySecret = *ossAccessKeySecret\n\tc.Region = *ossRegion\n\tc.Bucket = *ossBucket\n\tc.Path = path.Join(*ossPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = *ossEndpoint\n\treturn c\n}\n\n// MustDeleteAll deletes all objects under the client's path.\nfunc MustDeleteAll(tb testing.TB, c litestream.ReplicaClient) {\n\ttb.Helper()\n\n\tif err := c.DeleteAll(context.Background()); err != nil {\n\t\ttb.Fatalf(\"cannot delete all: %s\", err)\n\t}\n\n\tswitch c := c.(type) {\n\tcase *sftp.ReplicaClient:\n\t\tif err := c.Cleanup(context.Background()); err != nil {\n\t\t\ttb.Fatalf(\"cannot cleanup sftp: %s\", err)\n\t\t}\n\t}\n}\n\nfunc MockSFTPServer(t *testing.T, hostKey ssh.Signer) string {\n\tconfig := \u0026ssh.ServerConfig{NoClientAuth: true}\n\tconfig.AddHostKey(hostKey)\n\n\tlistener, err := net.Listen(\"tcp\", \"127.0.0.1:0\") // random available port\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tgo func() {\n\t\tfor {\n\t\t\tconn, err := listener.Accept()\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tgo func() {\n\t\t\t\t_, chans, reqs, err := ssh.NewServerConn(conn, config)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tgo ssh.DiscardRequests(reqs)\n\n\t\t\t\tfor ch := range chans {\n\t\t\t\t\tif ch.ChannelType() != \"session\" {\n\t\t\t\t\t\tch.Reject(ssh.UnknownChannelType, \"unsupported\")\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tchannel, requests, err := ch.Accept()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tgo func(in \u003c-chan *ssh.Request) {\n\t\t\t\t\t\tfor req := range in {\n\t\t\t\t\t\t\tif req.Type == \"subsystem\" \u0026\u0026 string(req.Payload[4:]) == \"sftp\" {\n\t\t\t\t\t\t\t\treq.Reply(true, nil)\n\n\t\t\t\t\t\t\t\tserver, err := sftpserver.NewServer(channel)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif err := server.Serve(); err != nil \u0026\u0026 err != io.EOF {\n\t\t\t\t\t\t\t\t\tt.Logf(\"SFTP server error: %v\", err)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treq.Reply(false, nil)\n\t\t\t\t\t\t}\n\t\t\t\t\t}(requests)\n\t\t\t\t}\n\t\t\t}()\n\t\t}\n\t}()\n\n\treturn listener.Addr().String()\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[30,40]}},{"name":"sql","path":"database/sql","span":{"start":[5,1],"end":[5,16],"bytes":[41,56]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[57,64]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[65,71]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[72,77]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[78,89]}},{"name":"v2","path":"math/rand/v2","span":{"start":[10,1],"end":[10,16],"bytes":[90,105]}},{"name":"net","path":"net","span":{"start":[11,1],"end":[11,7],"bytes":[106,112]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[113,118]}},{"name":"path","path":"path","span":{"start":[13,1],"end":[13,8],"bytes":[119,126]}},{"name":"filepath","path":"path/filepath","span":{"start":[14,1],"end":[14,17],"bytes":[127,143]}},{"name":"strings","path":"strings","span":{"start":[15,1],"end":[15,11],"bytes":[144,154]}},{"name":"testing","path":"testing","span":{"start":[16,1],"end":[16,11],"bytes":[155,165]}},{"name":"sftp","path":"github.com/pkg/sftp","alias":"sftpserver","span":{"start":[18,1],"end":[18,34],"bytes":[167,200]}},{"name":"ssh","path":"golang.org/x/crypto/ssh","span":{"start":[19,1],"end":[19,27],"bytes":[201,227]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[21,1],"end":[21,37],"bytes":[229,265]}},{"name":"abs","path":"github.com/benbjohnson/litestream/abs","span":{"start":[22,1],"end":[22,41],"bytes":[266,306]}},{"name":"file","path":"github.com/benbjohnson/litestream/file","span":{"start":[23,1],"end":[23,42],"bytes":[307,348]}},{"name":"gs","path":"github.com/benbjohnson/litestream/gs","span":{"start":[24,1],"end":[24,40],"bytes":[349,388]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[25,1],"end":[25,46],"bytes":[389,434]}},{"name":"nats","path":"github.com/benbjohnson/litestream/nats","span":{"start":[26,1],"end":[26,42],"bytes":[435,476]}},{"name":"oss","path":"github.com/benbjohnson/litestream/oss","span":{"start":[27,1],"end":[27,41],"bytes":[477,517]}},{"name":"s3","path":"github.com/benbjohnson/litestream/s3","span":{"start":[28,1],"end":[28,40],"bytes":[518,557]}},{"name":"sftp","path":"github.com/benbjohnson/litestream/sftp","span":{"start":[29,1],"end":[29,42],"bytes":[558,599]}},{"name":"webdav","path":"github.com/benbjohnson/litestream/webdav","span":{"start":[30,1],"end":[30,44],"bytes":[600,643]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/internal/testingutil.Integration":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.Integration","kind":"function","span":{"start":[135,1],"end":[137,2],"bytes":[5610,5658]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.Integration","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer","kind":"function","span":{"start":[468,1],"end":[524,2],"bytes":[15381,16629]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer","parameters":[{"name":"t","type":"*testing.T","span":{"start":[468,1],"end":[468,63],"bytes":[15381,15443]}},{"name":"hostKey","type":"golang.org/x/crypto/ssh.Signer","span":{"start":[468,1],"end":[468,63],"bytes":[15381,15443]}}],"return_type":"string","metrics":{"cyclomatic":12},"body":{"470:2":{"kind":"call","span":{"start":[470,2],"end":[470,28],"bytes":[15494,15520]},"callee":null},"472:19":{"kind":"call","span":{"start":[472,19],"end":[472,51],"bytes":[15540,15572]},"callee":null},"474:3":{"kind":"call","span":{"start":[474,3],"end":[474,15],"bytes":[15617,15629]},"callee":null},"477:5":{"kind":"call","span":{"start":[477,5],"end":[521,5],"bytes":[15638,16593]},"callee":null,"is_goroutine":true},"523:9":{"kind":"call","span":{"start":[523,9],"end":[523,24],"bytes":[16603,16618]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1","kind":"function","span":{"start":[477,1],"end":[521,5],"bytes":[15634,16593]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1","parameters":[],"body":{"479:17":{"kind":"call","span":{"start":[479,17],"end":[479,34],"bytes":[15671,15688]},"callee":null},"484:7":{"kind":"call","span":{"start":[484,7],"end":[519,7],"bytes":[15731,16584]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1","kind":"function","span":{"start":[484,1],"end":[519,7],"bytes":[15725,16584]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1","parameters":[],"body":{"485:28":{"kind":"call","span":{"start":[485,28],"end":[485,59],"bytes":[15767,15798]},"callee":null},"489:8":{"kind":"call","span":{"start":[489,8],"end":[489,33],"bytes":[15844,15869]},"callee":null,"is_goroutine":true},"492:9":{"kind":"call","span":{"start":[492,9],"end":[492,25],"bytes":[15907,15923]},"callee":null},"493:7":{"kind":"call","span":{"start":[493,7],"end":[493,55],"bytes":[15945,15993]},"callee":null},"496:32":{"kind":"call","span":{"start":[496,32],"end":[496,43],"bytes":[16047,16058]},"callee":null},"501:9":{"kind":"call","span":{"start":[501,9],"end":[517,17],"bytes":[16109,16571]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1","kind":"function","span":{"start":[501,1],"end":[517,17],"bytes":[16101,16571]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1","parameters":[{"name":"in","type":"\u003c-chan *golang.org/x/crypto/ssh.Request","span":{"start":[501,1],"end":[501,39],"bytes":[16101,16139]}}],"body":{"503:38":{"kind":"call","span":{"start":[503,38],"end":[503,61],"bytes":[16205,16228]},"callee":null},"504:9":{"kind":"call","span":{"start":[504,9],"end":[504,29],"bytes":[16249,16269]},"callee":null},"506:24":{"kind":"call","span":{"start":[506,24],"end":[506,53],"bytes":[16294,16323]},"callee":null},"510:19":{"kind":"call","span":{"start":[510,19],"end":[510,33],"bytes":[16392,16406]},"callee":null},"511:10":{"kind":"call","span":{"start":[511,10],"end":[511,46],"bytes":[16447,16483]},"callee":null},"515:8":{"kind":"call","span":{"start":[515,8],"end":[515,29],"bytes":[16525,16546]},"callee":null}}}}}}}}},"github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","kind":"function","span":{"start":[197,1],"end":[204,2],"bytes":[7298,7639]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[197,1],"end":[197,53],"bytes":[7298,7350]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[197,1],"end":[197,53],"bytes":[7298,7350]}}],"metrics":{"cyclomatic":3},"body":{"198:2":{"kind":"call","span":{"start":[198,2],"end":[198,13],"bytes":[7352,7363]},"callee":null},"199:115":{"kind":"call","span":{"start":[199,115],"end":[199,167],"bytes":[7478,7530]},"callee":null},"199:12":{"kind":"call","span":{"start":[199,12],"end":[199,42],"bytes":[7375,7405]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"199:132":{"kind":"call","span":{"start":[199,132],"end":[199,143],"bytes":[7495,7506]},"callee":null},"199:21":{"kind":"call","span":{"start":[199,21],"end":[199,41],"bytes":[7384,7404]},"callee":null},"199:59":{"kind":"call","span":{"start":[199,59],"end":[199,110],"bytes":[7422,7473]},"callee":null},"199:76":{"kind":"call","span":{"start":[199,76],"end":[199,87],"bytes":[7439,7450]},"callee":null},"200:3":{"kind":"call","span":{"start":[200,3],"end":[200,16],"bytes":[7535,7548]},"callee":null},"201:19":{"kind":"call","span":{"start":[201,19],"end":[201,56],"bytes":[7567,7604]},"callee":null},"201:32":{"kind":"call","span":{"start":[201,32],"end":[201,55],"bytes":[7580,7603]},"callee":null},"201:45":{"kind":"call","span":{"start":[201,45],"end":[201,54],"bytes":[7593,7602]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"202:3":{"kind":"call","span":{"start":[202,3],"end":[202,16],"bytes":[7621,7634]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","kind":"function","span":{"start":[168,1],"end":[172,2],"bytes":[6403,6534]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[168,1],"end":[168,69],"bytes":[6403,6471]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[168,1],"end":[168,69],"bytes":[6403,6471]}},{"name":"sqldb","type":"*database/sql.DB","span":{"start":[168,1],"end":[168,69],"bytes":[6403,6471]}}],"metrics":{"cyclomatic":1},"body":{"169:2":{"kind":"call","span":{"start":[169,2],"end":[169,13],"bytes":[6473,6484]},"callee":null},"170:2":{"kind":"call","span":{"start":[170,2],"end":[170,21],"bytes":[6486,6505]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB"},"171:2":{"kind":"call","span":{"start":[171,2],"end":[171,27],"bytes":[6507,6532]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","kind":"function","span":{"start":[221,1],"end":[226,2],"bytes":[8119,8235]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[221,1],"end":[221,48],"bytes":[8119,8166]}},{"name":"d","type":"*database/sql.DB","span":{"start":[221,1],"end":[221,48],"bytes":[8119,8166]}}],"metrics":{"cyclomatic":2},"body":{"222:2":{"kind":"call","span":{"start":[222,2],"end":[222,13],"bytes":[8168,8179]},"callee":null},"223:12":{"kind":"call","span":{"start":[223,12],"end":[223,21],"bytes":[8191,8200]},"callee":null},"224:3":{"kind":"call","span":{"start":[224,3],"end":[224,16],"bytes":[8217,8230]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","kind":"function","span":{"start":[453,1],"end":[466,2],"bytes":[15034,15379]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[453,1],"end":[453,64],"bytes":[15034,15097]}},{"name":"c","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[453,1],"end":[453,64],"bytes":[15034,15097]}}],"metrics":{"cyclomatic":5},"body":{"454:2":{"kind":"call","span":{"start":[454,2],"end":[454,13],"bytes":[15099,15110]},"callee":null},"456:12":{"kind":"call","span":{"start":[456,12],"end":[456,45],"bytes":[15123,15156]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteAll"},"456:24":{"kind":"call","span":{"start":[456,24],"end":[456,44],"bytes":[15135,15155]},"callee":null},"457:3":{"kind":"call","span":{"start":[457,3],"end":[457,42],"bytes":[15173,15212]},"callee":null},"462:13":{"kind":"call","span":{"start":[462,13],"end":[462,44],"bytes":[15280,15311]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup"},"462:23":{"kind":"call","span":{"start":[462,23],"end":[462,43],"bytes":[15290,15310]},"callee":null},"463:4":{"kind":"call","span":{"start":[463,4],"end":[463,45],"bytes":[15329,15370]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","kind":"function","span":{"start":[175,1],"end":[179,2],"bytes":[6582,6716]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[175,1],"end":[175,48],"bytes":[6582,6629]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":1},"body":{"176:2":{"kind":"call","span":{"start":[176,2],"end":[176,13],"bytes":[6631,6642]},"callee":null},"177:9":{"kind":"call","span":{"start":[177,9],"end":[177,21],"bytes":[6651,6663]},"callee":null},"178:26":{"kind":"call","span":{"start":[178,26],"end":[178,50],"bytes":[6689,6713]},"callee":null},"178:9":{"kind":"call","span":{"start":[178,9],"end":[178,51],"bytes":[6672,6714]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","kind":"function","span":{"start":[182,1],"end":[194,2],"bytes":[6783,7237]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[182,1],"end":[182,63],"bytes":[6783,6845]}},{"name":"path","type":"string","span":{"start":[182,1],"end":[182,63],"bytes":[6783,6845]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":2},"body":{"183:2":{"kind":"call","span":{"start":[183,2],"end":[183,13],"bytes":[6847,6858]},"callee":null},"184:8":{"kind":"call","span":{"start":[184,8],"end":[184,23],"bytes":[6866,6881]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB"},"187:15":{"kind":"call","span":{"start":[187,15],"end":[187,40],"bytes":[7032,7057]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica"},"188:22":{"kind":"call","span":{"start":[188,22],"end":[188,46],"bytes":[7079,7103]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient"},"190:12":{"kind":"call","span":{"start":[190,12],"end":[190,21],"bytes":[7182,7191]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open"},"191:3":{"kind":"call","span":{"start":[191,3],"end":[191,16],"bytes":[7208,7221]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","kind":"function","span":{"start":[161,1],"end":[165,2],"bytes":[6196,6333]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[161,1],"end":[161,60],"bytes":[6196,6255]}}],"return_type":"(*github.com/benbjohnson/litestream.DB, *database/sql.DB)","metrics":{"cyclomatic":1},"body":{"162:2":{"kind":"call","span":{"start":[162,2],"end":[162,13],"bytes":[6257,6268]},"callee":null},"163:8":{"kind":"call","span":{"start":[163,8],"end":[163,22],"bytes":[6276,6290]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB"},"164:13":{"kind":"call","span":{"start":[164,13],"end":[164,41],"bytes":[6303,6331]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB"},"164:31":{"kind":"call","span":{"start":[164,31],"end":[164,40],"bytes":[6321,6330]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","kind":"function","span":{"start":[207,1],"end":[218,2],"bytes":[7685,8073]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[207,1],"end":[207,57],"bytes":[7685,7741]}},{"name":"path","type":"string","span":{"start":[207,1],"end":[207,57],"bytes":[7685,7741]}}],"return_type":"*database/sql.DB","metrics":{"cyclomatic":4},"body":{"208:2":{"kind":"call","span":{"start":[208,2],"end":[208,13],"bytes":[7743,7754]},"callee":null},"209:12":{"kind":"call","span":{"start":[209,12],"end":[209,36],"bytes":[7766,7790]},"callee":null},"211:3":{"kind":"call","span":{"start":[211,3],"end":[211,16],"bytes":[7810,7823]},"callee":null},"212:22":{"kind":"call","span":{"start":[212,22],"end":[212,87],"bytes":[7845,7910]},"callee":null},"212:36":{"kind":"call","span":{"start":[212,36],"end":[212,56],"bytes":[7859,7879]},"callee":null},"213:3":{"kind":"call","span":{"start":[213,3],"end":[213,16],"bytes":[7927,7940]},"callee":null},"214:22":{"kind":"call","span":{"start":[214,22],"end":[214,88],"bytes":[7962,8028]},"callee":null},"214:36":{"kind":"call","span":{"start":[214,36],"end":[214,56],"bytes":[7976,7996]},"callee":null},"215:3":{"kind":"call","span":{"start":[215,3],"end":[215,16],"bytes":[8045,8058]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","kind":"function","span":{"start":[388,1],"end":[398,2],"bytes":[13260,13556]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[388,1],"end":[388,61],"bytes":[13260,13320]}}],"return_type":"*github.com/benbjohnson/litestream/abs.ReplicaClient","metrics":{"cyclomatic":1},"body":{"389:2":{"kind":"call","span":{"start":[389,2],"end":[389,13],"bytes":[13322,13333]},"callee":null},"391:7":{"kind":"call","span":{"start":[391,7],"end":[391,29],"bytes":[13341,13363]},"callee":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient"},"396:11":{"kind":"call","span":{"start":[396,11],"end":[396,67],"bytes":[13488,13544]},"callee":null},"396:31":{"kind":"call","span":{"start":[396,31],"end":[396,66],"bytes":[13508,13543]},"callee":null},"396:52":{"kind":"call","span":{"start":[396,52],"end":[396,65],"bytes":[13529,13542]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","kind":"function","span":{"start":[332,1],"end":[355,2],"bytes":[11474,12211]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[332,1],"end":[332,59],"bytes":[11474,11532]}}],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":4},"body":{"333:2":{"kind":"call","span":{"start":[333,2],"end":[333,13],"bytes":[11534,11545]},"callee":null},"336:3":{"kind":"call","span":{"start":[336,3],"end":[336,86],"bytes":[11597,11680]},"callee":null},"339:3":{"kind":"call","span":{"start":[339,3],"end":[339,69],"bytes":[11710,11776]},"callee":null},"342:3":{"kind":"call","span":{"start":[342,3],"end":[342,65],"bytes":[11804,11866]},"callee":null},"345:7":{"kind":"call","span":{"start":[345,7],"end":[345,28],"bytes":[11877,11898]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"350:11":{"kind":"call","span":{"start":[350,11],"end":[350,78],"bytes":[12059,12126]},"callee":null},"350:42":{"kind":"call","span":{"start":[350,42],"end":[350,77],"bytes":[12090,12125]},"callee":null},"350:63":{"kind":"call","span":{"start":[350,63],"end":[350,76],"bytes":[12111,12124]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewDB":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","kind":"function","span":{"start":[143,1],"end":[158,2],"bytes":[5748,6127]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[143,1],"end":[143,56],"bytes":[5748,5803]}},{"name":"path","type":"string","span":{"start":[143,1],"end":[143,56],"bytes":[5748,5803]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":2},"body":{"144:2":{"kind":"call","span":{"start":[144,2],"end":[144,13],"bytes":[5805,5816]},"callee":null},"145:2":{"kind":"call","span":{"start":[145,2],"end":[145,24],"bytes":[5818,5840]},"callee":null},"148:5":{"kind":"call","span":{"start":[148,5],"end":[148,42],"bytes":[5872,5909]},"callee":null},"152:8":{"kind":"call","span":{"start":[152,8],"end":[152,30],"bytes":[5953,5975]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB"},"153:14":{"kind":"call","span":{"start":[153,14],"end":[156,5],"bytes":[5989,6114]},"callee":null},"153:23":{"kind":"call","span":{"start":[153,23],"end":[156,4],"bytes":[5998,6113]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","kind":"function","span":{"start":[262,1],"end":[265,2],"bytes":[9215,9336]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[262,1],"end":[262,63],"bytes":[9215,9277]}}],"return_type":"*github.com/benbjohnson/litestream/file.ReplicaClient","metrics":{"cyclomatic":1},"body":{"263:2":{"kind":"call","span":{"start":[263,2],"end":[263,13],"bytes":[9279,9290]},"callee":null},"264:31":{"kind":"call","span":{"start":[264,31],"end":[264,43],"bytes":[9321,9333]},"callee":null},"264:9":{"kind":"call","span":{"start":[264,9],"end":[264,44],"bytes":[9299,9334]},"callee":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","kind":"function","span":{"start":[358,1],"end":[385,2],"bytes":[12281,13189]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[358,1],"end":[358,59],"bytes":[12281,12339]}}],"return_type":"*github.com/benbjohnson/litestream/gs.ReplicaClient","metrics":{"cyclomatic":3},"body":{"359:2":{"kind":"call","span":{"start":[359,2],"end":[359,13],"bytes":[12341,12352]},"callee":null},"362:2":{"kind":"call","span":{"start":[362,2],"end":[362,40],"bytes":[12429,12467]},"callee":null},"364:5":{"kind":"call","span":{"start":[364,5],"end":[364,48],"bytes":[12495,12538]},"callee":null},"367:2":{"kind":"call","span":{"start":[367,2],"end":[367,59],"bytes":[12570,12627]},"callee":null},"368:2":{"kind":"call","span":{"start":[368,2],"end":[368,50],"bytes":[12629,12677]},"callee":null},"369:2":{"kind":"call","span":{"start":[369,2],"end":[369,46],"bytes":[12679,12723]},"callee":null},"371:7":{"kind":"call","span":{"start":[371,7],"end":[371,28],"bytes":[12731,12752]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient"},"373:11":{"kind":"call","span":{"start":[373,11],"end":[373,66],"bytes":[12785,12840]},"callee":null},"373:30":{"kind":"call","span":{"start":[373,30],"end":[373,65],"bytes":[12804,12839]},"callee":null},"373:51":{"kind":"call","span":{"start":[373,51],"end":[373,64],"bytes":[12825,12838]},"callee":null},"376:9":{"kind":"call","span":{"start":[376,9],"end":[376,29],"bytes":[12878,12898]},"callee":null},"377:12":{"kind":"call","span":{"start":[377,12],"end":[377,23],"bytes":[12910,12921]},"callee":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"378:3":{"kind":"call","span":{"start":[378,3],"end":[378,55],"bytes":[12938,12990]},"callee":null},"379:3":{"kind":"call","span":{"start":[379,3],"end":[379,60],"bytes":[12993,13050]},"callee":null},"382:2":{"kind":"call","span":{"start":[382,2],"end":[382,48],"bytes":[13130,13176]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","kind":"function","span":{"start":[426,1],"end":[436,2],"bytes":[14328,14570]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[426,1],"end":[426,63],"bytes":[14328,14390]}}],"return_type":"*github.com/benbjohnson/litestream/nats.ReplicaClient","metrics":{"cyclomatic":1},"body":{"427:2":{"kind":"call","span":{"start":[427,2],"end":[427,13],"bytes":[14392,14403]},"callee":null},"429:7":{"kind":"call","span":{"start":[429,7],"end":[429,30],"bytes":[14411,14434]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","kind":"function","span":{"start":[439,1],"end":[450,2],"bytes":[14641,14970]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[439,1],"end":[439,61],"bytes":[14641,14701]}}],"return_type":"*github.com/benbjohnson/litestream/oss.ReplicaClient","metrics":{"cyclomatic":1},"body":{"440:2":{"kind":"call","span":{"start":[440,2],"end":[440,13],"bytes":[14703,14714]},"callee":null},"442:7":{"kind":"call","span":{"start":[442,7],"end":[442,29],"bytes":[14722,14744]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient"},"447:11":{"kind":"call","span":{"start":[447,11],"end":[447,67],"bytes":[14875,14931]},"callee":null},"447:31":{"kind":"call","span":{"start":[447,31],"end":[447,66],"bytes":[14895,14930]},"callee":null},"447:52":{"kind":"call","span":{"start":[447,52],"end":[447,65],"bytes":[14916,14929]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","kind":"function","span":{"start":[305,1],"end":[328,2],"bytes":[10604,11320]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[305,1],"end":[305,59],"bytes":[10604,10662]}}],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":4},"body":{"306:2":{"kind":"call","span":{"start":[306,2],"end":[306,13],"bytes":[10664,10675]},"callee":null},"309:3":{"kind":"call","span":{"start":[309,3],"end":[309,95],"bytes":[10734,10826]},"callee":null},"312:3":{"kind":"call","span":{"start":[312,3],"end":[312,69],"bytes":[10856,10922]},"callee":null},"315:3":{"kind":"call","span":{"start":[315,3],"end":[315,65],"bytes":[10950,11012]},"callee":null},"318:7":{"kind":"call","span":{"start":[318,7],"end":[318,28],"bytes":[11023,11044]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"323:11":{"kind":"call","span":{"start":[323,11],"end":[323,78],"bytes":[11168,11235]},"callee":null},"323:42":{"kind":"call","span":{"start":[323,42],"end":[323,77],"bytes":[11199,11234]},"callee":null},"323:63":{"kind":"call","span":{"start":[323,63],"end":[323,76],"bytes":[11220,11233]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","kind":"function","span":{"start":[229,1],"end":[259,2],"bytes":[8316,9143]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[229,1],"end":[229,76],"bytes":[8316,8391]}},{"name":"typ","type":"string","span":{"start":[229,1],"end":[229,76],"bytes":[8316,8391]}}],"return_type":"github.com/benbjohnson/litestream.ReplicaClient","metrics":{"cyclomatic":14},"body":{"230:2":{"kind":"call","span":{"start":[230,2],"end":[230,13],"bytes":[8393,8404]},"callee":null},"234:10":{"kind":"call","span":{"start":[234,10],"end":[234,34],"bytes":[8459,8483]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient"},"236:10":{"kind":"call","span":{"start":[236,10],"end":[236,32],"bytes":[8521,8543]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient"},"238:10":{"kind":"call","span":{"start":[238,10],"end":[238,32],"bytes":[8581,8603]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient"},"240:10":{"kind":"call","span":{"start":[240,10],"end":[240,33],"bytes":[8642,8665]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient"},"242:10":{"kind":"call","span":{"start":[242,10],"end":[242,34],"bytes":[8705,8729]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient"},"244:10":{"kind":"call","span":{"start":[244,10],"end":[244,36],"bytes":[8771,8797]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient"},"246:10":{"kind":"call","span":{"start":[246,10],"end":[246,34],"bytes":[8837,8861]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient"},"248:10":{"kind":"call","span":{"start":[248,10],"end":[248,33],"bytes":[8900,8923]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient"},"250:10":{"kind":"call","span":{"start":[250,10],"end":[250,36],"bytes":[8949,8975]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient"},"252:10":{"kind":"call","span":{"start":[252,10],"end":[252,32],"bytes":[8997,9019]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient"},"254:10":{"kind":"call","span":{"start":[254,10],"end":[254,32],"bytes":[9041,9063]},"callee":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient"},"256:3":{"kind":"call","span":{"start":[256,3],"end":[256,52],"bytes":[9076,9125]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","kind":"function","span":{"start":[268,1],"end":[281,2],"bytes":[9406,9794]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[268,1],"end":[268,59],"bytes":[9406,9464]}}],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":1},"body":{"269:2":{"kind":"call","span":{"start":[269,2],"end":[269,13],"bytes":[9466,9477]},"callee":null},"271:7":{"kind":"call","span":{"start":[271,7],"end":[271,28],"bytes":[9485,9506]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"276:11":{"kind":"call","span":{"start":[276,11],"end":[276,66],"bytes":[9633,9688]},"callee":null},"276:30":{"kind":"call","span":{"start":[276,30],"end":[276,65],"bytes":[9652,9687]},"callee":null},"276:51":{"kind":"call","span":{"start":[276,51],"end":[276,64],"bytes":[9673,9686]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","kind":"function","span":{"start":[401,1],"end":[411,2],"bytes":[13628,13908]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[401,1],"end":[401,63],"bytes":[13628,13690]}}],"return_type":"*github.com/benbjohnson/litestream/sftp.ReplicaClient","metrics":{"cyclomatic":1},"body":{"402:2":{"kind":"call","span":{"start":[402,2],"end":[402,13],"bytes":[13692,13703]},"callee":null},"404:7":{"kind":"call","span":{"start":[404,7],"end":[404,30],"bytes":[13711,13734]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient"},"409:11":{"kind":"call","span":{"start":[409,11],"end":[409,68],"bytes":[13839,13896]},"callee":null},"409:32":{"kind":"call","span":{"start":[409,32],"end":[409,67],"bytes":[13860,13895]},"callee":null},"409:53":{"kind":"call","span":{"start":[409,53],"end":[409,66],"bytes":[13881,13894]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","kind":"function","span":{"start":[284,1],"end":[301,2],"bytes":[9873,10473]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[284,1],"end":[284,63],"bytes":[9873,9935]}}],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":2},"body":{"285:2":{"kind":"call","span":{"start":[285,2],"end":[285,13],"bytes":[9937,9948]},"callee":null},"288:3":{"kind":"call","span":{"start":[288,3],"end":[288,103],"bytes":[10015,10115]},"callee":null},"291:7":{"kind":"call","span":{"start":[291,7],"end":[291,28],"bytes":[10126,10147]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"296:11":{"kind":"call","span":{"start":[296,11],"end":[296,80],"bytes":[10302,10371]},"callee":null},"296:44":{"kind":"call","span":{"start":[296,44],"end":[296,79],"bytes":[10335,10370]},"callee":null},"296:65":{"kind":"call","span":{"start":[296,65],"end":[296,78],"bytes":[10356,10369]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","kind":"function","span":{"start":[414,1],"end":[423,2],"bytes":[13982,14256]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[414,1],"end":[414,67],"bytes":[13982,14048]}}],"return_type":"*github.com/benbjohnson/litestream/webdav.ReplicaClient","metrics":{"cyclomatic":1},"body":{"415:2":{"kind":"call","span":{"start":[415,2],"end":[415,13],"bytes":[14050,14061]},"callee":null},"417:7":{"kind":"call","span":{"start":[417,7],"end":[417,32],"bytes":[14069,14094]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient"},"421:11":{"kind":"call","span":{"start":[421,11],"end":[421,70],"bytes":[14185,14244]},"callee":null},"421:34":{"kind":"call","span":{"start":[421,34],"end":[421,69],"bytes":[14208,14243]},"callee":null},"421:55":{"kind":"call","span":{"start":[421,55],"end":[421,68],"bytes":[14229,14242]},"callee":null}}},"github.com/benbjohnson/litestream/internal/testingutil.ReplicaClientTypes":{"id":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.ReplicaClientTypes","kind":"function","span":{"start":[139,1],"end":[141,2],"bytes":[5660,5746]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.ReplicaClientTypes","parameters":[],"return_type":"[]string","metrics":{"cyclomatic":1},"body":{"140:9":{"kind":"call","span":{"start":[140,9],"end":[140,48],"bytes":[5705,5744]},"callee":null}}}},"content_hash":"05ab44549f9219b4b32ffca96ff4acb54d6340b69512a42f2006aae45e5e2397"},"leaser.go":{"id":"can://go/litestream/leaser.go","kind":"module","span":{"start":[1,1],"end":[45,1],"bytes":[0,995]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n)\n\nvar ErrLeaseNotHeld = errors.New(\"lease not held\")\n\ntype LeaseExistsError struct {\n\tOwner string\n\tExpiresAt time.Time\n}\n\nfunc (e *LeaseExistsError) Error() string {\n\tif e.Owner != \"\" {\n\t\treturn fmt.Sprintf(\"lease already held by %s until %s\", e.Owner, e.ExpiresAt.Format(time.RFC3339))\n\t}\n\treturn fmt.Sprintf(\"lease already held until %s\", e.ExpiresAt.Format(time.RFC3339))\n}\n\ntype Leaser interface {\n\tType() string\n\tAcquireLease(ctx context.Context) (*Lease, error)\n\tRenewLease(ctx context.Context, lease *Lease) (*Lease, error)\n\tReleaseLease(ctx context.Context, lease *Lease) error\n}\n\ntype Lease struct {\n\tGeneration int64 `json:\"generation\"`\n\tExpiresAt time.Time `json:\"expires_at\"`\n\tOwner string `json:\"owner,omitempty\"`\n\tETag string `json:\"-\"`\n}\n\nfunc (l *Lease) IsExpired() bool {\n\treturn time.Now().After(l.ExpiresAt)\n}\n\nfunc (l *Lease) TTL() time.Duration {\n\treturn time.Until(l.ExpiresAt)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[40,49]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[50,56]}},{"name":"time","path":"time","span":{"start":[7,1],"end":[7,8],"bytes":[57,64]}}],"types":{"Lease":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease","kind":"struct","span":{"start":[31,1],"end":[36,2],"bytes":[660,845]},"callables":{"github.com/benbjohnson/litestream.Lease.IsExpired":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired","kind":"method","span":{"start":[38,1],"end":[40,2],"bytes":[847,921]},"signature":"github.com/benbjohnson/litestream.Lease.IsExpired","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"39:9":{"kind":"call","span":{"start":[39,9],"end":[39,19],"bytes":[890,900]},"callee":null}}},"github.com/benbjohnson/litestream.Lease.TTL":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.TTL","kind":"method","span":{"start":[42,1],"end":[44,2],"bytes":[923,994]},"signature":"github.com/benbjohnson/litestream.Lease.TTL","parameters":[],"return_type":"time.Duration","metrics":{"cyclomatic":1},"body":{"43:9":{"kind":"call","span":{"start":[43,9],"end":[43,32],"bytes":[969,992]},"callee":null}}}},"fields":{"ETag":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease/ETag","kind":"field","type":"string","span":{"start":[35,1],"end":[35,33],"bytes":[811,843]}},"ExpiresAt":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease/ExpiresAt","kind":"field","type":"time.Time","span":{"start":[33,1],"end":[33,42],"bytes":[722,763]}},"Generation":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease/Generation","kind":"field","type":"int64","span":{"start":[32,1],"end":[32,42],"bytes":[680,721]}},"Owner":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease/Owner","kind":"field","type":"string","span":{"start":[34,1],"end":[34,47],"bytes":[764,810]}}}},"LeaseExistsError":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError","kind":"struct","span":{"start":[12,1],"end":[15,2],"bytes":[120,191]},"callables":{"github.com/benbjohnson/litestream.LeaseExistsError.Error":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/github.com/benbjohnson/litestream.LeaseExistsError.Error","kind":"method","span":{"start":[17,1],"end":[22,2],"bytes":[193,447]},"signature":"github.com/benbjohnson/litestream.LeaseExistsError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"19:10":{"kind":"call","span":{"start":[19,10],"end":[19,101],"bytes":[266,357]},"callee":null},"19:68":{"kind":"call","span":{"start":[19,68],"end":[19,100],"bytes":[324,356]},"callee":null},"21:52":{"kind":"call","span":{"start":[21,52],"end":[21,84],"bytes":[412,444]},"callee":null},"21:9":{"kind":"call","span":{"start":[21,9],"end":[21,85],"bytes":[369,445]},"callee":null}}}},"fields":{"ExpiresAt":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/ExpiresAt","kind":"field","type":"time.Time","span":{"start":[14,1],"end":[14,21],"bytes":[169,189]}},"Owner":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/Owner","kind":"field","type":"string","span":{"start":[13,1],"end":[13,18],"bytes":[151,168]}}}},"Leaser":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Leaser","kind":"interface","span":{"start":[24,1],"end":[29,2],"bytes":[449,658]},"callables":{"github.com/benbjohnson/litestream.Leaser.AcquireLease":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Leaser/github.com/benbjohnson/litestream.Leaser.AcquireLease","kind":"method","span":{"start":[26,1],"end":[26,51],"bytes":[488,538]},"signature":"github.com/benbjohnson/litestream.Leaser.AcquireLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[26,1],"end":[26,51],"bytes":[488,538]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.Leaser.ReleaseLease":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Leaser/github.com/benbjohnson/litestream.Leaser.ReleaseLease","kind":"method","span":{"start":[28,1],"end":[28,55],"bytes":[602,656]},"signature":"github.com/benbjohnson/litestream.Leaser.ReleaseLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[28,1],"end":[28,55],"bytes":[602,656]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[28,1],"end":[28,55],"bytes":[602,656]}}],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.Leaser.RenewLease":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Leaser/github.com/benbjohnson/litestream.Leaser.RenewLease","kind":"method","span":{"start":[27,1],"end":[27,63],"bytes":[539,601]},"signature":"github.com/benbjohnson/litestream.Leaser.RenewLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[27,1],"end":[27,63],"bytes":[539,601]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[27,1],"end":[27,63],"bytes":[539,601]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.Leaser.Type":{"id":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Leaser/github.com/benbjohnson/litestream.Leaser.Type","kind":"method","span":{"start":[25,1],"end":[25,15],"bytes":[473,487]},"signature":"github.com/benbjohnson/litestream.Leaser.Type","parameters":[],"return_type":"string","body":{}}}}},"functions":{},"content_hash":"86026b64494febb4e5dd447ddebcb76377306ae30fe8d8dcb68428d9833e9b1a"},"litestream.go":{"id":"can://go/litestream/litestream.go","kind":"module","span":{"start":[1,1],"end":[214,1],"bytes":[0,6059]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/superfly/ltx\"\n\t_ \"modernc.org/sqlite\"\n)\n\n// Naming constants.\nconst (\n\tMetaDirSuffix = \"-litestream\"\n)\n\n// SQLite checkpoint modes.\nconst (\n\tCheckpointModePassive = \"PASSIVE\"\n\tCheckpointModeFull = \"FULL\"\n\tCheckpointModeRestart = \"RESTART\"\n\tCheckpointModeTruncate = \"TRUNCATE\"\n)\n\n// Litestream errors.\nvar (\n\tErrNoSnapshots = errors.New(\"no snapshots available\")\n\tErrChecksumMismatch = errors.New(\"invalid replica, checksum mismatch\")\n\tErrLTXCorrupted = errors.New(\"ltx file corrupted\")\n\tErrLTXMissing = errors.New(\"ltx file missing\")\n\tErrDiskFull = errors.New(\"disk full\")\n)\n\n// LTXError provides detailed context for LTX file errors with recovery hints.\ntype LTXError struct {\n\tOp string // Operation that failed (e.g., \"open\", \"read\", \"validate\")\n\tPath string // File path\n\tLevel int // LTX level (0 = L0, etc.)\n\tMinTXID uint64 // Minimum transaction ID\n\tMaxTXID uint64 // Maximum transaction ID\n\tErr error // Underlying error\n\tHint string // Recovery hint for users\n}\n\nfunc (e *LTXError) Error() string {\n\tif e.Path != \"\" {\n\t\treturn e.Op + \" ltx file \" + e.Path + \": \" + e.Err.Error()\n\t}\n\treturn e.Op + \" ltx file: \" + e.Err.Error()\n}\n\nfunc (e *LTXError) Unwrap() error { return e.Err }\n\n// IsAutoRecoverable reports whether the underlying error indicates local state\n// corruption that can be fixed by resetting and re-downloading from remote.\n// Returns false for transient OS errors (EMFILE, EIO, EACCES) that should be\n// retried with backoff instead.\nfunc (e *LTXError) IsAutoRecoverable() bool {\n\tif os.IsNotExist(e.Err) || errors.Is(e.Err, ErrLTXMissing) {\n\t\treturn true\n\t}\n\tif errors.Is(e.Err, ErrLTXCorrupted) || errors.Is(e.Err, ErrChecksumMismatch) {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// NewLTXError creates a new LTX error with appropriate hints based on the error type.\nfunc NewLTXError(op, path string, level int, minTXID, maxTXID uint64, err error) *LTXError {\n\tltxErr := \u0026LTXError{\n\t\tOp: op,\n\t\tPath: path,\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tErr: err,\n\t}\n\n\t// Set appropriate hint based on error type\n\tif os.IsNotExist(err) || errors.Is(err, ErrLTXMissing) {\n\t\tltxErr.Hint = \"LTX file is missing. This can happen after VACUUM, manual checkpoint, or state corruption. \" +\n\t\t\t\"Run 'litestream reset \u003cdb\u003e' or delete the .sqlite-litestream directory and restart.\"\n\t} else if errors.Is(err, ErrLTXCorrupted) || errors.Is(err, ErrChecksumMismatch) {\n\t\tltxErr.Hint = \"LTX file is corrupted. Delete the .sqlite-litestream directory and restart to recover from replica.\"\n\t}\n\n\treturn ltxErr\n}\n\n// isShutdownError reports whether err is a context error caused by ctx itself\n// being done. Context errors that occur while ctx is still live, such as a\n// replica client whose credentials are bound to a cancelled context, are real\n// failures and must not be silently ignored.\nfunc isShutdownError(ctx context.Context, err error) bool {\n\treturn ctx.Err() != nil \u0026\u0026 (errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded))\n}\n\n// SQLite WAL constants.\nconst (\n\tWALHeaderChecksumOffset = 24\n\tWALFrameHeaderChecksumOffset = 16\n)\n\nvar (\n\t// LogWriter is the destination writer for all logging.\n\tLogWriter = os.Stdout\n\n\t// LogFlags are the flags passed to log.New().\n\tLogFlags = 0\n)\n\n// Checksum computes a running SQLite checksum over a byte slice.\nfunc Checksum(bo binary.ByteOrder, s0, s1 uint32, b []byte) (uint32, uint32) {\n\tassert(len(b)%8 == 0, \"misaligned checksum byte slice\")\n\n\t// Iterate over 8-byte units and compute checksum.\n\tfor i := 0; i \u003c len(b); i += 8 {\n\t\ts0 += bo.Uint32(b[i:]) + s1\n\t\ts1 += bo.Uint32(b[i+4:]) + s0\n\t}\n\treturn s0, s1\n}\n\nconst (\n\t// WALHeaderSize is the size of the WAL header, in bytes.\n\tWALHeaderSize = 32\n\n\t// WALFrameHeaderSize is the size of the WAL frame header, in bytes.\n\tWALFrameHeaderSize = 24\n)\n\n// rollback rolls back tx. Ignores already-rolled-back errors.\nfunc rollback(tx *sql.Tx) error {\n\tif err := tx.Rollback(); err != nil \u0026\u0026 !strings.Contains(err.Error(), `transaction has already been committed or rolled back`) {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// readWALHeader returns the header read from a WAL file.\nfunc readWALHeader(filename string) ([]byte, error) {\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer f.Close()\n\n\tbuf := make([]byte, WALHeaderSize)\n\tn, err := io.ReadFull(f, buf)\n\treturn buf[:n], err\n}\n\n// readWALFileAt reads a slice from a file. Do not use this with database files\n// as it causes problems with non-OFD locks.\nfunc readWALFileAt(filename string, offset, n int64) ([]byte, error) {\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer f.Close()\n\n\tbuf := make([]byte, n)\n\tif n, err := f.ReadAt(buf, offset); err != nil {\n\t\treturn buf[:n], err\n\t} else if n \u003c len(buf) {\n\t\treturn buf[:n], io.ErrUnexpectedEOF\n\t}\n\treturn buf, nil\n}\n\n// removeTmpFiles recursively finds and removes .tmp files.\nfunc removeTmpFiles(root string) error {\n\treturn filepath.Walk(root, func(path string, info os.FileInfo, err error) error {\n\t\tswitch {\n\t\tcase err != nil:\n\t\t\treturn nil // skip errored files\n\t\tcase info.IsDir():\n\t\t\treturn nil // skip directories\n\t\tcase !strings.HasSuffix(path, \".tmp\"):\n\t\t\treturn nil // skip non-temp files\n\t\tdefault:\n\t\t\treturn os.Remove(path)\n\t\t}\n\t})\n}\n\n// LTXDir returns the path to an LTX directory.\nfunc LTXDir(root string) string {\n\treturn path.Join(root, \"ltx\")\n}\n\n// LTXLevelDir returns the path to an LTX level directory.\nfunc LTXLevelDir(root string, level int) string {\n\treturn path.Join(LTXDir(root), strconv.Itoa(level))\n}\n\n// LTXFilePath returns the path to a single LTX file.\nfunc LTXFilePath(root string, level int, minTXID, maxTXID ltx.TXID) string {\n\treturn path.Join(LTXLevelDir(root, level), ltx.FormatFilename(minTXID, maxTXID))\n}\n\nfunc assert(condition bool, message string) {\n\tif !condition {\n\t\tpanic(\"assertion failed: \" + message)\n\t}\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"sql","path":"database/sql","span":{"start":[5,1],"end":[5,16],"bytes":[40,55]}},{"name":"binary","path":"encoding/binary","span":{"start":[6,1],"end":[6,19],"bytes":[56,74]}},{"name":"errors","path":"errors","span":{"start":[7,1],"end":[7,10],"bytes":[75,84]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[85,90]}},{"name":"os","path":"os","span":{"start":[9,1],"end":[9,6],"bytes":[91,96]}},{"name":"path","path":"path","span":{"start":[10,1],"end":[10,8],"bytes":[97,104]}},{"name":"filepath","path":"path/filepath","span":{"start":[11,1],"end":[11,17],"bytes":[105,121]}},{"name":"strconv","path":"strconv","span":{"start":[12,1],"end":[12,11],"bytes":[122,132]}},{"name":"strings","path":"strings","span":{"start":[13,1],"end":[13,11],"bytes":[133,143]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[15,1],"end":[15,27],"bytes":[145,171]}},{"name":"sqlite","path":"modernc.org/sqlite","alias":"_","span":{"start":[16,1],"end":[16,24],"bytes":[172,195]}}],"types":{"LTXError":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError","kind":"struct","span":{"start":[42,1],"end":[50,2],"bytes":[842,1178]},"callables":{"github.com/benbjohnson/litestream.LTXError.Error":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.Error","kind":"method","span":{"start":[52,1],"end":[57,2],"bytes":[1180,1345]},"signature":"github.com/benbjohnson/litestream.LTXError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"54:48":{"kind":"call","span":{"start":[54,48],"end":[54,61],"bytes":[1282,1295]},"callee":null},"56:32":{"kind":"call","span":{"start":[56,32],"end":[56,45],"bytes":[1330,1343]},"callee":null}}},"github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable","kind":"method","span":{"start":[65,1],"end":[73,2],"bytes":[1667,1905]},"signature":"github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable","parameters":[],"return_type":"bool","metrics":{"cyclomatic":3},"body":{"66:29":{"kind":"call","span":{"start":[66,29],"end":[66,60],"bytes":[1741,1772]},"callee":null},"66:5":{"kind":"call","span":{"start":[66,5],"end":[66,25],"bytes":[1717,1737]},"callee":null},"69:42":{"kind":"call","span":{"start":[69,42],"end":[69,79],"bytes":[1833,1870]},"callee":null},"69:5":{"kind":"call","span":{"start":[69,5],"end":[69,38],"bytes":[1796,1829]},"callee":null}}},"github.com/benbjohnson/litestream.LTXError.Unwrap":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.Unwrap","kind":"method","span":{"start":[59,1],"end":[59,51],"bytes":[1347,1397]},"signature":"github.com/benbjohnson/litestream.LTXError.Unwrap","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"Err":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/Err","kind":"field","type":"error","span":{"start":[48,1],"end":[48,36],"bytes":[1098,1133]}},"Hint":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/Hint","kind":"field","type":"string","span":{"start":[49,1],"end":[49,43],"bytes":[1134,1176]}},"Level":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/Level","kind":"field","type":"int","span":{"start":[45,1],"end":[45,44],"bytes":[970,1013]}},"MaxTXID":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/MaxTXID","kind":"field","type":"uint64","span":{"start":[47,1],"end":[47,42],"bytes":[1056,1097]}},"MinTXID":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/MinTXID","kind":"field","type":"uint64","span":{"start":[46,1],"end":[46,42],"bytes":[1014,1055]}},"Op":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/Op","kind":"field","type":"string","span":{"start":[43,1],"end":[43,76],"bytes":[865,940]}},"Path":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/Path","kind":"field","type":"string","span":{"start":[44,1],"end":[44,29],"bytes":[941,969]}}}}},"functions":{"github.com/benbjohnson/litestream.Checksum":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.Checksum","kind":"function","span":{"start":[120,1],"end":[129,2],"bytes":[3521,3825]},"signature":"github.com/benbjohnson/litestream.Checksum","parameters":[{"name":"bo","type":"encoding/binary.ByteOrder","span":{"start":[120,1],"end":[120,79],"bytes":[3521,3599]}},{"name":"s0","type":"uint32","span":{"start":[120,1],"end":[120,79],"bytes":[3521,3599]}},{"name":"s1","type":"uint32","span":{"start":[120,1],"end":[120,79],"bytes":[3521,3599]}},{"name":"b","type":"[]byte","span":{"start":[120,1],"end":[120,79],"bytes":[3521,3599]}}],"return_type":"(uint32, uint32)","metrics":{"cyclomatic":2},"body":{"121:2":{"kind":"call","span":{"start":[121,2],"end":[121,57],"bytes":[3601,3656]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert"},"121:9":{"kind":"call","span":{"start":[121,9],"end":[121,15],"bytes":[3608,3614]},"callee":null},"124:18":{"kind":"call","span":{"start":[124,18],"end":[124,24],"bytes":[3727,3733]},"callee":null},"125:9":{"kind":"call","span":{"start":[125,9],"end":[125,25],"bytes":[3752,3768]},"callee":null},"126:9":{"kind":"call","span":{"start":[126,9],"end":[126,27],"bytes":[3782,3800]},"callee":null}}},"github.com/benbjohnson/litestream.LTXDir":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXDir","kind":"function","span":{"start":[195,1],"end":[197,2],"bytes":[5502,5568]},"signature":"github.com/benbjohnson/litestream.LTXDir","parameters":[{"name":"root","type":"string","span":{"start":[195,1],"end":[195,34],"bytes":[5502,5535]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"196:9":{"kind":"call","span":{"start":[196,9],"end":[196,31],"bytes":[5544,5566]},"callee":null}}},"github.com/benbjohnson/litestream.LTXFilePath":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","kind":"function","span":{"start":[205,1],"end":[207,2],"bytes":[5789,5949]},"signature":"github.com/benbjohnson/litestream.LTXFilePath","parameters":[{"name":"root","type":"string","span":{"start":[205,1],"end":[205,77],"bytes":[5789,5865]}},{"name":"level","type":"int","span":{"start":[205,1],"end":[205,77],"bytes":[5789,5865]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[205,1],"end":[205,77],"bytes":[5789,5865]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[205,1],"end":[205,77],"bytes":[5789,5865]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"206:19":{"kind":"call","span":{"start":[206,19],"end":[206,43],"bytes":[5884,5908]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"206:45":{"kind":"call","span":{"start":[206,45],"end":[206,81],"bytes":[5910,5946]},"callee":null},"206:9":{"kind":"call","span":{"start":[206,9],"end":[206,82],"bytes":[5874,5947]},"callee":null}}},"github.com/benbjohnson/litestream.LTXLevelDir":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","kind":"function","span":{"start":[200,1],"end":[202,2],"bytes":[5629,5733]},"signature":"github.com/benbjohnson/litestream.LTXLevelDir","parameters":[{"name":"root","type":"string","span":{"start":[200,1],"end":[200,50],"bytes":[5629,5678]}},{"name":"level","type":"int","span":{"start":[200,1],"end":[200,50],"bytes":[5629,5678]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"201:19":{"kind":"call","span":{"start":[201,19],"end":[201,31],"bytes":[5697,5709]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXDir"},"201:33":{"kind":"call","span":{"start":[201,33],"end":[201,52],"bytes":[5711,5730]},"callee":null},"201:9":{"kind":"call","span":{"start":[201,9],"end":[201,53],"bytes":[5687,5731]},"callee":null}}},"github.com/benbjohnson/litestream.NewLTXError":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError","kind":"function","span":{"start":[76,1],"end":[95,2],"bytes":[1994,2745]},"signature":"github.com/benbjohnson/litestream.NewLTXError","parameters":[{"name":"op","type":"string","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"path","type":"string","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"level","type":"int","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"minTXID","type":"uint64","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"maxTXID","type":"uint64","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"err","type":"error","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}}],"return_type":"*github.com/benbjohnson/litestream.LTXError","metrics":{"cyclomatic":3},"body":{"87:27":{"kind":"call","span":{"start":[87,27],"end":[87,56],"bytes":[2290,2319]},"callee":null},"87:5":{"kind":"call","span":{"start":[87,5],"end":[87,23],"bytes":[2268,2286]},"callee":null},"90:12":{"kind":"call","span":{"start":[90,12],"end":[90,43],"bytes":[2534,2565]},"callee":null},"90:47":{"kind":"call","span":{"start":[90,47],"end":[90,82],"bytes":[2569,2604]},"callee":null}}},"github.com/benbjohnson/litestream.assert":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert","kind":"function","span":{"start":[209,1],"end":[213,2],"bytes":[5951,6058]},"signature":"github.com/benbjohnson/litestream.assert","parameters":[{"name":"condition","type":"bool","span":{"start":[209,1],"end":[209,46],"bytes":[5951,5996]}},{"name":"message","type":"string","span":{"start":[209,1],"end":[209,46],"bytes":[5951,5996]}}],"metrics":{"cyclomatic":2},"body":{"211:3":{"kind":"call","span":{"start":[211,3],"end":[211,40],"bytes":[6016,6053]},"callee":null}}},"github.com/benbjohnson/litestream.isShutdownError":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError","kind":"function","span":{"start":[101,1],"end":[103,2],"bytes":[3027,3195]},"signature":"github.com/benbjohnson/litestream.isShutdownError","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[101,1],"end":[101,60],"bytes":[3027,3086]}},{"name":"err","type":"error","span":{"start":[101,1],"end":[101,60],"bytes":[3027,3086]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"102:30":{"kind":"call","span":{"start":[102,30],"end":[102,62],"bytes":[3116,3148]},"callee":null},"102:66":{"kind":"call","span":{"start":[102,66],"end":[102,106],"bytes":[3152,3192]},"callee":null},"102:9":{"kind":"call","span":{"start":[102,9],"end":[102,18],"bytes":[3095,3104]},"callee":null}}},"github.com/benbjohnson/litestream.readWALFileAt":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALFileAt","kind":"function","span":{"start":[162,1],"end":[176,2],"bytes":[4684,5021]},"signature":"github.com/benbjohnson/litestream.readWALFileAt","parameters":[{"name":"filename","type":"string","span":{"start":[162,1],"end":[162,71],"bytes":[4684,4754]}},{"name":"offset","type":"int64","span":{"start":[162,1],"end":[162,71],"bytes":[4684,4754]}},{"name":"n","type":"int64","span":{"start":[162,1],"end":[162,71],"bytes":[4684,4754]}}],"return_type":"([]byte, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"163:12":{"kind":"call","span":{"start":[163,12],"end":[163,29],"bytes":[4766,4783]},"callee":null},"167:8":{"kind":"call","span":{"start":[167,8],"end":[167,17],"bytes":[4829,4838]},"callee":null},"169:9":{"kind":"call","span":{"start":[169,9],"end":[169,24],"bytes":[4848,4863]},"callee":null},"170:15":{"kind":"call","span":{"start":[170,15],"end":[170,36],"bytes":[4878,4899]},"callee":null},"172:16":{"kind":"call","span":{"start":[172,16],"end":[172,24],"bytes":[4951,4959]},"callee":null}}},"github.com/benbjohnson/litestream.readWALHeader":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader","kind":"function","span":{"start":[148,1],"end":[158,2],"bytes":[4329,4557]},"signature":"github.com/benbjohnson/litestream.readWALHeader","parameters":[{"name":"filename","type":"string","span":{"start":[148,1],"end":[148,54],"bytes":[4329,4382]}}],"return_type":"([]byte, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"149:12":{"kind":"call","span":{"start":[149,12],"end":[149,29],"bytes":[4394,4411]},"callee":null},"153:8":{"kind":"call","span":{"start":[153,8],"end":[153,17],"bytes":[4457,4466]},"callee":null},"155:9":{"kind":"call","span":{"start":[155,9],"end":[155,36],"bytes":[4476,4503]},"callee":null},"156:12":{"kind":"call","span":{"start":[156,12],"end":[156,31],"bytes":[4515,4534]},"callee":null}}},"github.com/benbjohnson/litestream.removeTmpFiles":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles","kind":"function","span":{"start":[179,1],"end":[192,2],"bytes":[5083,5452]},"signature":"github.com/benbjohnson/litestream.removeTmpFiles","parameters":[{"name":"root","type":"string","span":{"start":[179,1],"end":[179,41],"bytes":[5083,5123]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"180:9":{"kind":"call","span":{"start":[180,9],"end":[191,4],"bytes":[5132,5450]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles/github.com/benbjohnson/litestream.removeTmpFiles.closure_1","kind":"function","span":{"start":[180,1],"end":[191,4],"bytes":[5124,5450]},"signature":"github.com/benbjohnson/litestream.removeTmpFiles.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[180,1],"end":[180,83],"bytes":[5124,5206]}},{"name":"info","type":"os.FileInfo","span":{"start":[180,1],"end":[180,83],"bytes":[5124,5206]}},{"name":"err","type":"error","span":{"start":[180,1],"end":[180,83],"bytes":[5124,5206]}}],"return_type":"error","error_channel":["error"],"body":{"184:8":{"kind":"call","span":{"start":[184,8],"end":[184,20],"bytes":[5280,5292]},"callee":null},"186:9":{"kind":"call","span":{"start":[186,9],"end":[186,40],"bytes":[5336,5367]},"callee":null},"189:11":{"kind":"call","span":{"start":[189,11],"end":[189,26],"bytes":[5427,5442]},"callee":null}}}}},"github.com/benbjohnson/litestream.rollback":{"id":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.rollback","kind":"function","span":{"start":[140,1],"end":[145,2],"bytes":[4076,4269]},"signature":"github.com/benbjohnson/litestream.rollback","parameters":[{"name":"tx","type":"*database/sql.Tx","span":{"start":[140,1],"end":[140,34],"bytes":[4076,4109]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"141:12":{"kind":"call","span":{"start":[141,12],"end":[141,25],"bytes":[4121,4134]},"callee":null},"141:42":{"kind":"call","span":{"start":[141,42],"end":[141,128],"bytes":[4151,4237]},"callee":null},"141:59":{"kind":"call","span":{"start":[141,59],"end":[141,70],"bytes":[4168,4179]},"callee":null}}}},"content_hash":"e4b652a8e8b83c18ff7d9f824a98e686528587ce7eba00d1a216bc5122e655b9"},"log.go":{"id":"can://go/litestream/log.go","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,265]},"package":"litestream","source":"package litestream\n\nconst (\n\tLogKeySystem = \"system\"\n\tLogKeySubsystem = \"subsystem\"\n\tLogKeyDB = \"db\"\n)\n\nconst (\n\tLogSystemStore = \"store\"\n\tLogSystemServer = \"server\"\n)\n\nconst (\n\tLogSubsystemCompactor = \"compactor\"\n\tLogSubsystemWALReader = \"wal-reader\"\n)\n","imports":[],"types":{},"functions":{},"content_hash":"65bf3b1e8a77873e7202c299afb7bb22108561e035ee8dcd82da238b625816d4"},"mock/replica_client.go":{"id":"can://go/litestream/mock/replica_client.go","kind":"module","span":{"start":[1,1],"end":[54,1],"bytes":[0,1796]},"package":"mock","source":"package mock\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\ntype ReplicaClient struct {\n\tInitFunc func(ctx context.Context) error\n\tDeleteAllFunc func(ctx context.Context) error\n\tLTXFilesFunc func(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error)\n\tOpenLTXFileFunc func(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error)\n\tWriteLTXFileFunc func(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error)\n\tDeleteLTXFilesFunc func(ctx context.Context, a []*ltx.FileInfo) error\n}\n\nfunc (c *ReplicaClient) Type() string { return \"mock\" }\n\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\tif c.InitFunc != nil {\n\t\treturn c.InitFunc(ctx)\n\t}\n\treturn nil\n}\n\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\treturn c.DeleteAllFunc(ctx)\n}\n\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\treturn c.LTXFilesFunc(ctx, level, seek, useMetadata)\n}\n\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\treturn c.OpenLTXFileFunc(ctx, level, minTXID, maxTXID, offset, size)\n}\n\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\treturn c.WriteLTXFileFunc(ctx, level, minTXID, maxTXID, r)\n}\n\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\treturn c.DeleteLTXFilesFunc(ctx, a)\n}\n\nfunc (c *ReplicaClient) SetLogger(_ *slog.Logger) {}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"io","path":"io","span":{"start":[5,1],"end":[5,6],"bytes":[34,39]}},{"name":"slog","path":"log/slog","span":{"start":[6,1],"end":[6,12],"bytes":[40,51]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[8,1],"end":[8,27],"bytes":[53,79]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[10,1],"end":[10,37],"bytes":[81,117]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient","kind":"struct","span":{"start":[15,1],"end":[22,2],"bytes":[177,744]},"callables":{"github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteAll":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteAll","kind":"method","span":{"start":[33,1],"end":[35,2],"bytes":[928,1021]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[33,1],"end":[33,63],"bytes":[928,990]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"34:9":{"kind":"call","span":{"start":[34,9],"end":[34,29],"bytes":[999,1019]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[49,1],"end":[51,2],"bytes":[1616,1741]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[49,1],"end":[49,87],"bytes":[1616,1702]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[49,1],"end":[49,87],"bytes":[1616,1702]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"50:9":{"kind":"call","span":{"start":[50,9],"end":[50,37],"bytes":[1711,1739]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.Init":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.Init","kind":"method","span":{"start":[26,1],"end":[31,2],"bytes":[803,926]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[26,1],"end":[26,58],"bytes":[803,860]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"28:10":{"kind":"call","span":{"start":[28,10],"end":[28,25],"bytes":[894,909]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.LTXFiles":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.LTXFiles","kind":"method","span":{"start":[37,1],"end":[39,2],"bytes":[1023,1204]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[37,1],"end":[37,126],"bytes":[1023,1148]}},{"name":"level","type":"int","span":{"start":[37,1],"end":[37,126],"bytes":[1023,1148]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[37,1],"end":[37,126],"bytes":[1023,1148]}},{"name":"useMetadata","type":"bool","span":{"start":[37,1],"end":[37,126],"bytes":[1023,1148]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"38:9":{"kind":"call","span":{"start":[38,9],"end":[38,54],"bytes":[1157,1202]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[41,1],"end":[43,2],"bytes":[1206,1417]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"level","type":"int","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"offset","type":"int64","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"size","type":"int64","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"42:9":{"kind":"call","span":{"start":[42,9],"end":[42,70],"bytes":[1354,1415]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.SetLogger":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.SetLogger","kind":"method","span":{"start":[53,1],"end":[53,53],"bytes":[1743,1795]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.SetLogger","parameters":[{"name":"_","type":"*log/slog.Logger","span":{"start":[53,1],"end":[53,53],"bytes":[1743,1795]}}],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/mock.ReplicaClient.Type":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.Type","kind":"method","span":{"start":[24,1],"end":[24,56],"bytes":[746,801]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/mock.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[45,1],"end":[47,2],"bytes":[1419,1614]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}},{"name":"level","type":"int","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}},{"name":"r","type":"io.Reader","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"46:9":{"kind":"call","span":{"start":[46,9],"end":[46,60],"bytes":[1561,1612]},"callee":null}}}},"fields":{"DeleteAllFunc":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/DeleteAllFunc","kind":"field","type":"func(ctx context.Context) error","span":{"start":[17,1],"end":[17,52],"bytes":[257,308]}},"DeleteLTXFilesFunc":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/DeleteLTXFilesFunc","kind":"field","type":"func(ctx context.Context, a []*github.com/superfly/ltx.FileInfo) error","span":{"start":[21,1],"end":[21,71],"bytes":[672,742]}},"InitFunc":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/InitFunc","kind":"field","type":"func(ctx context.Context) error","span":{"start":[16,1],"end":[16,52],"bytes":[205,256]}},"LTXFilesFunc":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/LTXFilesFunc","kind":"field","type":"func(ctx context.Context, level int, seek github.com/superfly/ltx.TXID, useMetadata bool) (github.com/superfly/ltx.FileIterator, error)","span":{"start":[18,1],"end":[18,116],"bytes":[309,424]}},"OpenLTXFileFunc":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/OpenLTXFileFunc","kind":"field","type":"func(ctx context.Context, level int, minTXID github.com/superfly/ltx.TXID, maxTXID github.com/superfly/ltx.TXID, offset int64, size int64) (io.ReadCloser, error)","span":{"start":[19,1],"end":[19,127],"bytes":[425,551]}},"WriteLTXFileFunc":{"id":"can://go/litestream/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/WriteLTXFileFunc","kind":"field","type":"func(ctx context.Context, level int, minTXID github.com/superfly/ltx.TXID, maxTXID github.com/superfly/ltx.TXID, r io.Reader) (*github.com/superfly/ltx.FileInfo, error)","span":{"start":[20,1],"end":[20,120],"bytes":[552,671]}}}}},"functions":{},"content_hash":"e4ae0946c515afc92b2b5c565860eb69a9495833baf931bf4947550cadb1926b"},"nats/replica_client.go":{"id":"can://go/litestream/nats/replica_client.go","kind":"module","span":{"start":[1,1],"end":[521,1],"bytes":[0,15428]},"package":"nats","source":"package nats\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"github.com/nats-io/nats.go/jetstream\"\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"nats\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"nats\"\n\n// HeaderKeyTimestamp is the header key for storing LTX file timestamps in NATS object headers.\nconst HeaderKeyTimestamp = \"Litestream-Timestamp\"\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to NATS JetStream Object Store.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tlogger *slog.Logger\n\n\t// NATS connection and JetStream context\n\tnc *nats.Conn\n\tjs jetstream.JetStream\n\tobjectStore jetstream.ObjectStore\n\n\t// Configuration\n\tURL string // NATS server URL\n\tBucketName string // Object store bucket name\n\tPath string // Base path for LTX files within the bucket\n\tJWT string // JWT token for authentication\n\tSeed string // Seed for JWT authentication\n\tCreds string // Credentials file path\n\tNKey string // NKey for authentication\n\tUsername string // Username for authentication\n\tPassword string // Password for authentication\n\tToken string // Token for authentication\n\tTLS bool // Enable TLS\n\tRootCAs []string // Root CA certificates\n\tClientCert string // Client certificate file path\n\tClientKey string // Client key file path\n\n\t// Note: Bucket configuration (replicas, storage, TTL, etc.) should be\n\t// managed externally via NATS CLI or API, not by Litestream\n\n\t// Connection options\n\tMaxReconnects int // Maximum reconnection attempts (-1 for unlimited)\n\tReconnectWait time.Duration // Wait time between reconnection attempts\n\tReconnectJitter time.Duration // Random jitter for reconnection\n\tTimeout time.Duration // Connection timeout\n\tPingInterval time.Duration // Ping interval\n\tMaxPingsOut int // Maximum number of pings without response\n\tReconnectBufSize int // Reconnection buffer size\n\tUserJWT func() (string, error) // JWT callback\n\tSigCB func([]byte) ([]byte, error) // Signature callback\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tMaxReconnects: -1, // Unlimited\n\t\tReconnectWait: 2 * time.Second,\n\t\tTimeout: 10 * time.Second,\n\t\tPingInterval: 2 * time.Minute,\n\t\tMaxPingsOut: 2,\n\t\tReconnectBufSize: 8 * 1024 * 1024, // 8MB\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: nats://[user:pass@]host[:port]/bucket\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\t// Reconstruct URL without bucket path\n\tif host != \"\" {\n\t\tclient.URL = fmt.Sprintf(\"nats://%s\", host)\n\t}\n\n\t// Extract credentials from userinfo if present\n\tif userinfo != nil {\n\t\tclient.Username = userinfo.Username()\n\t\tclient.Password, _ = userinfo.Password()\n\t}\n\n\t// Extract bucket name from path\n\tbucket := strings.Trim(urlPath, \"/\")\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for nats replica URL\")\n\t}\n\tclient.BucketName = bucket\n\n\treturn client, nil\n}\n\n// Type returns \"nats\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to NATS JetStream. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.objectStore != nil {\n\t\treturn nil\n\t}\n\n\tif c.nc == nil {\n\t\tif err := c.connect(ctx); err != nil {\n\t\t\treturn fmt.Errorf(\"nats: failed to connect: %w\", err)\n\t\t}\n\t}\n\n\tif err := c.initObjectStore(ctx); err != nil {\n\t\treturn fmt.Errorf(\"nats: failed to initialize object store: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// connect establishes a connection to NATS server with proper configuration.\nfunc (c *ReplicaClient) connect(_ context.Context) error {\n\turl := c.URL\n\tif url == \"\" {\n\t\turl = nats.DefaultURL\n\t}\n\n\tnc, err := nats.Connect(url, c.options()...)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to NATS server: %w\", err)\n\t}\n\n\tjs, err := jetstream.New(nc)\n\tif err != nil {\n\t\tnc.Close()\n\t\treturn fmt.Errorf(\"failed to create JetStream context: %w\", err)\n\t}\n\n\tc.nc = nc\n\tc.js = js\n\treturn nil\n}\n\nfunc (c *ReplicaClient) options() []nats.Option {\n\topts := []nats.Option{\n\t\tnats.MaxReconnects(c.MaxReconnects),\n\t\tnats.ReconnectWait(c.ReconnectWait),\n\t\tnats.ReconnectJitter(c.ReconnectJitter, c.ReconnectJitter*2),\n\t\tnats.Timeout(c.Timeout),\n\t\tnats.PingInterval(c.PingInterval),\n\t\tnats.MaxPingsOutstanding(c.MaxPingsOut),\n\t\tnats.ReconnectBufSize(c.ReconnectBufSize),\n\t}\n\n\t// Authentication options\n\tswitch {\n\tcase c.JWT != \"\" \u0026\u0026 c.Seed != \"\":\n\t\topts = append(opts, nats.UserJWTAndSeed(c.JWT, c.Seed))\n\tcase c.Creds != \"\":\n\t\topts = append(opts, nats.UserCredentials(c.Creds))\n\tcase c.NKey != \"\":\n\t\topts = append(opts, nats.Nkey(c.NKey, c.SigCB))\n\tcase c.Username != \"\" \u0026\u0026 c.Password != \"\":\n\t\topts = append(opts, nats.UserInfo(c.Username, c.Password))\n\tcase c.Token != \"\":\n\t\topts = append(opts, nats.Token(c.Token))\n\t}\n\t// JWT callback\n\tif c.UserJWT != nil {\n\t\topts = append(opts, nats.UserJWT(c.UserJWT, c.SigCB))\n\t}\n\n\t// TLS configuration\n\tif c.TLS {\n\t\topts = append(opts, nats.Secure())\n\t}\n\n\tif c.ClientCert != \"\" \u0026\u0026 c.ClientKey != \"\" {\n\t\topts = append(opts, nats.ClientCert(c.ClientCert, c.ClientKey))\n\t}\n\n\tif len(c.RootCAs) \u003e 0 {\n\t\topts = append(opts, nats.RootCAs(c.RootCAs...))\n\t}\n\n\treturn opts\n}\n\n// initObjectStore retrieves the existing object store bucket.\n// The bucket must be pre-created using the NATS CLI or API.\nfunc (c *ReplicaClient) initObjectStore(ctx context.Context) error {\n\tif c.BucketName == \"\" {\n\t\treturn fmt.Errorf(\"bucket name is required\")\n\t}\n\n\t// Get existing object store - do not auto-create\n\tobjectStore, err := c.js.ObjectStore(ctx, c.BucketName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to access object store bucket %q (bucket must be created beforehand): %w\", c.BucketName, err)\n\t}\n\n\tc.objectStore = objectStore\n\treturn nil\n}\n\n// Close closes the NATS connection.\nfunc (c *ReplicaClient) Close() error {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.nc != nil {\n\t\tc.nc.Close()\n\t\tc.nc = nil\n\t\tc.js = nil\n\t\tc.objectStore = nil\n\t}\n\treturn nil\n}\n\n// ltxPath returns the object path for an LTX file.\nfunc (c *ReplicaClient) ltxPath(level int, minTXID, maxTXID ltx.TXID) string {\n\treturn litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n}\n\n// parseLTXPath parses an LTX object path and returns level, minTXID, and maxTXID.\nfunc (c *ReplicaClient) parseLTXPath(objPath string) (level int, minTXID, maxTXID ltx.TXID, err error) {\n\t// Remove the base path prefix if present\n\tif c.Path != \"\" \u0026\u0026 strings.HasPrefix(objPath, c.Path+\"/\") {\n\t\tobjPath = strings.TrimPrefix(objPath, c.Path+\"/\")\n\t}\n\n\t// Expected format: \"ltx/\u003clevel\u003e/\u003cminTXID\u003e-\u003cmaxTXID\u003e.ltx\"\n\tparts := strings.Split(objPath, \"/\")\n\tif len(parts) \u003c 3 || parts[0] != \"ltx\" {\n\t\treturn 0, 0, 0, fmt.Errorf(\"invalid ltx path: %s\", objPath)\n\t}\n\n\t// Parse level\n\tif level, err = strconv.Atoi(parts[1]); err != nil {\n\t\treturn 0, 0, 0, fmt.Errorf(\"invalid level in path %s: %w\", objPath, err)\n\t}\n\n\t// Parse filename (minTXID-maxTXID.ltx)\n\tfilename := parts[2]\n\tminTXIDVal, maxTXIDVal, err := ltx.ParseFilename(filename)\n\tif err != nil {\n\t\treturn 0, 0, 0, fmt.Errorf(\"invalid filename in path %s: %w\", objPath, err)\n\t}\n\n\treturn level, minTXIDVal, maxTXIDVal, nil\n}\n\n// LTXFiles returns an iterator of all LTX files on the replica for a given level.\n// NATS always uses accurate timestamps from headers since they're included in LIST operations at zero cost.\n// The useMetadata parameter is ignored.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// List all objects in the store\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"LIST\").Inc()\n\tobjectList, err := c.objectStore.List(ctx)\n\tif err != nil {\n\t\t// NATS returns \"no objects found\" when bucket is empty, treat as empty list\n\t\tif strings.Contains(err.Error(), \"no objects found\") {\n\t\t\tobjectList = nil // Empty list\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"failed to list objects: %w\", err)\n\t\t}\n\t}\n\n\tprefix := litestream.LTXLevelDir(c.Path, level) + \"/\"\n\tfileInfos := make([]*ltx.FileInfo, 0, len(objectList))\n\n\tfor _, objInfo := range objectList {\n\t\t// Filter by level prefix\n\t\tif !strings.HasPrefix(objInfo.Name, prefix) {\n\t\t\tcontinue\n\t\t}\n\n\t\tfileLevel, minTXID, maxTXID, err := c.parseLTXPath(objInfo.Name)\n\t\tif err != nil {\n\t\t\tcontinue // Skip invalid paths\n\t\t}\n\n\t\tif fileLevel != level {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Apply seek filter\n\t\tif minTXID \u003c seek {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Always use accurate timestamp from headers since it's zero-cost\n\t\t// NATS includes headers in LIST operations, so no extra API call needed\n\t\tcreatedAt := objInfo.ModTime\n\t\tif objInfo.Headers != nil {\n\t\t\tif values, ok := objInfo.Headers[HeaderKeyTimestamp]; ok \u0026\u0026 len(values) \u003e 0 {\n\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, values[0]); err == nil {\n\t\t\t\t\tcreatedAt = parsed\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfileInfos = append(fileInfos, \u0026ltx.FileInfo{\n\t\t\tLevel: fileLevel,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: int64(objInfo.Size),\n\t\t\tCreatedAt: createdAt,\n\t\t})\n\t}\n\n\t// Sort by minTXID\n\tsort.Slice(fileInfos, func(i, j int) bool {\n\t\treturn fileInfos[i].MinTXID \u003c fileInfos[j].MinTXID\n\t})\n\n\treturn \u0026ltxFileIterator{files: fileInfos, index: -1}, nil\n}\n\n// OpenLTXFile returns a reader that contains an LTX file at a given TXID range.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tobjectPath := c.ltxPath(level, minTXID, maxTXID)\n\n\tobjectResult, err := c.objectStore.Get(ctx, objectPath)\n\tif err != nil {\n\t\tif isNotFoundError(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"failed to get object %s: %w\", objectPath, err)\n\t}\n\n\t// Record metrics\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\t// Note: We can't get the size from NATS object reader directly, so we skip bytes counter\n\n\t// If offset is non-zero then discard the beginning bytes.\n\tif offset \u003e 0 {\n\t\tif _, err := io.CopyN(io.Discard, objectResult, offset); err != nil {\n\t\t\tobjectResult.Close()\n\t\t\treturn nil, fmt.Errorf(\"failed to discard offset bytes: %w\", err)\n\t\t}\n\t}\n\n\t// If size is non-zero then limit the reader to the size.\n\tif size \u003e 0 {\n\t\treturn internal.LimitReadCloser(objectResult, size), nil\n\t}\n\n\treturn objectResult, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tobjectPath := c.ltxPath(level, minTXID, maxTXID)\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(r, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\trc := internal.NewReadCounter(io.MultiReader(\u0026buf, r))\n\n\t// Store timestamp in NATS object headers for accurate timestamp retrieval\n\tobjectInfo, err := c.objectStore.Put(ctx, jetstream.ObjectMeta{\n\t\tName: objectPath,\n\t\tHeaders: map[string][]string{\n\t\t\tHeaderKeyTimestamp: {timestamp.Format(time.RFC3339Nano)},\n\t\t},\n\t}, rc)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to put object %s: %w\", objectPath, err)\n\t}\n\n\t// Record metrics\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(objectInfo.Size))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: int64(objectInfo.Size),\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// DeleteLTXFiles deletes one or more LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, fileInfo := range a {\n\t\tobjectPath := c.ltxPath(fileInfo.Level, fileInfo.MinTXID, fileInfo.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", fileInfo.Level, \"minTXID\", fileInfo.MinTXID, \"maxTXID\", fileInfo.MaxTXID, \"path\", objectPath)\n\n\t\tif err := c.objectStore.Delete(ctx, objectPath); err != nil {\n\t\t\tif !isNotFoundError(err) {\n\t\t\t\treturn fmt.Errorf(\"failed to delete object %s: %w\", objectPath, err)\n\t\t\t}\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\n// DeleteAll deletes all files in the object store.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t// List all objects in the bucket\n\tobjectList, err := c.objectStore.List(ctx)\n\tif err != nil {\n\t\t// NATS returns \"no objects found\" when bucket is empty, treat as empty list\n\t\tif strings.Contains(err.Error(), \"no objects found\") {\n\t\t\tobjectList = nil // Empty list, nothing to delete\n\t\t} else {\n\t\t\treturn fmt.Errorf(\"failed to list all objects: %w\", err)\n\t\t}\n\t}\n\n\tfor _, objInfo := range objectList {\n\t\tif err := c.objectStore.Delete(ctx, objInfo.Name); err != nil {\n\t\t\tif !isNotFoundError(err) {\n\t\t\t\treturn fmt.Errorf(\"failed to delete object %s: %w\", objInfo.Name, err)\n\t\t\t}\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\n// isNotFoundError checks if the error is a \"not found\" error.\nfunc isNotFoundError(err error) bool {\n\treturn err != nil \u0026\u0026 (errors.Is(err, jetstream.ErrObjectNotFound) || strings.Contains(err.Error(), \"not found\"))\n}\n\n// ltxFileIterator implements ltx.FileIterator for NATS object store.\ntype ltxFileIterator struct {\n\tfiles []*ltx.FileInfo\n\tindex int\n\terr error\n}\n\n// Next advances the iterator to the next file.\nfunc (itr *ltxFileIterator) Next() bool {\n\titr.index++\n\treturn itr.index \u003c len(itr.files)\n}\n\n// Item returns the current file info.\nfunc (itr *ltxFileIterator) Item() *ltx.FileInfo {\n\tif itr.index \u003c 0 || itr.index \u003e= len(itr.files) {\n\t\treturn nil\n\t}\n\treturn itr.files[itr.index]\n}\n\n// Err returns any error that occurred during iteration.\nfunc (itr *ltxFileIterator) Err() error {\n\treturn itr.err\n}\n\n// Close closes the iterator and returns any error that occurred during iteration.\nfunc (itr *ltxFileIterator) Close() error {\n\treturn itr.err\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[43,52]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[53,59]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[60,65]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[66,77]}},{"name":"url","path":"net/url","span":{"start":[10,1],"end":[10,11],"bytes":[78,88]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[89,94]}},{"name":"sort","path":"sort","span":{"start":[12,1],"end":[12,8],"bytes":[95,102]}},{"name":"strconv","path":"strconv","span":{"start":[13,1],"end":[13,11],"bytes":[103,113]}},{"name":"strings","path":"strings","span":{"start":[14,1],"end":[14,11],"bytes":[114,124]}},{"name":"sync","path":"sync","span":{"start":[15,1],"end":[15,8],"bytes":[125,132]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[133,140]}},{"name":"nats.go","path":"github.com/nats-io/nats.go","span":{"start":[18,1],"end":[18,30],"bytes":[142,171]}},{"name":"jetstream","path":"github.com/nats-io/nats.go/jetstream","span":{"start":[19,1],"end":[19,40],"bytes":[172,211]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[20,1],"end":[20,27],"bytes":[212,238]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[22,1],"end":[22,37],"bytes":[240,276]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[23,1],"end":[23,46],"bytes":[277,322]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient","kind":"struct","span":{"start":[39,1],"end":[77,2],"bytes":[795,2563]},"callables":{"github.com/benbjohnson/litestream/nats.ReplicaClient.Close":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Close","kind":"method","span":{"start":[236,1],"end":[247,2],"bytes":[6815,6987]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"237:2":{"kind":"call","span":{"start":[237,2],"end":[237,13],"bytes":[6856,6867]},"callee":null},"238:8":{"kind":"call","span":{"start":[238,8],"end":[238,21],"bytes":[6875,6888]},"callee":null},"241:3":{"kind":"call","span":{"start":[241,3],"end":[241,15],"bytes":[6910,6922]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","kind":"method","span":{"start":[458,1],"end":[484,2],"bytes":[13661,14464]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[458,1],"end":[458,63],"bytes":[13661,13723]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"459:12":{"kind":"call","span":{"start":[459,12],"end":[459,23],"bytes":[13735,13746]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"464:21":{"kind":"call","span":{"start":[464,21],"end":[464,44],"bytes":[13833,13856]},"callee":null},"467:23":{"kind":"call","span":{"start":[467,23],"end":[467,34],"bytes":[13975,13986]},"callee":null},"467:6":{"kind":"call","span":{"start":[467,6],"end":[467,55],"bytes":[13958,14007]},"callee":null},"470:11":{"kind":"call","span":{"start":[470,11],"end":[470,60],"bytes":[14084,14133]},"callee":null},"475:13":{"kind":"call","span":{"start":[475,13],"end":[475,52],"bytes":[14192,14231]},"callee":null},"476:8":{"kind":"call","span":{"start":[476,8],"end":[476,28],"bytes":[14253,14273]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError"},"477:12":{"kind":"call","span":{"start":[477,12],"end":[477,75],"bytes":[14287,14350]},"callee":null},"480:3":{"kind":"call","span":{"start":[480,3],"end":[480,81],"bytes":[14362,14440]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[436,1],"end":[455,2],"bytes":[12935,13607]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[436,1],"end":[436,87],"bytes":[12935,13021]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[436,1],"end":[436,87],"bytes":[12935,13021]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"437:12":{"kind":"call","span":{"start":[437,12],"end":[437,23],"bytes":[13033,13044]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"442:17":{"kind":"call","span":{"start":[442,17],"end":[442,78],"bytes":[13122,13183]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath"},"444:3":{"kind":"call","span":{"start":[444,3],"end":[444,141],"bytes":[13187,13325]},"callee":null},"446:13":{"kind":"call","span":{"start":[446,13],"end":[446,50],"bytes":[13339,13376]},"callee":null},"447:8":{"kind":"call","span":{"start":[447,8],"end":[447,28],"bytes":[13398,13418]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError"},"448:12":{"kind":"call","span":{"start":[448,12],"end":[448,73],"bytes":[13432,13493]},"callee":null},"451:3":{"kind":"call","span":{"start":[451,3],"end":[451,81],"bytes":[13505,13583]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.Init":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","kind":"method","span":{"start":[129,1],"end":[148,2],"bytes":[4115,4513]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[129,1],"end":[129,58],"bytes":[4115,4172]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"130:2":{"kind":"call","span":{"start":[130,2],"end":[130,13],"bytes":[4174,4185]},"callee":null},"131:8":{"kind":"call","span":{"start":[131,8],"end":[131,21],"bytes":[4193,4206]},"callee":null},"138:13":{"kind":"call","span":{"start":[138,13],"end":[138,27],"bytes":[4282,4296]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect"},"139:11":{"kind":"call","span":{"start":[139,11],"end":[139,57],"bytes":[4321,4367]},"callee":null},"143:12":{"kind":"call","span":{"start":[143,12],"end":[143,34],"bytes":[4387,4409]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore"},"144:10":{"kind":"call","span":{"start":[144,10],"end":[144,72],"bytes":[4433,4495]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","kind":"method","span":{"start":[285,1],"end":[351,2],"bytes":[8390,10248]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[285,1],"end":[285,126],"bytes":[8390,8515]}},{"name":"level","type":"int","span":{"start":[285,1],"end":[285,126],"bytes":[8390,8515]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[285,1],"end":[285,126],"bytes":[8390,8515]}},{"name":"useMetadata","type":"bool","span":{"start":[285,1],"end":[285,126],"bytes":[8390,8515]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"286:12":{"kind":"call","span":{"start":[286,12],"end":[286,23],"bytes":[8527,8538]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"291:2":{"kind":"call","span":{"start":[291,2],"end":[291,78],"bytes":[8610,8686]},"callee":null},"292:21":{"kind":"call","span":{"start":[292,21],"end":[292,44],"bytes":[8713,8736]},"callee":null},"295:23":{"kind":"call","span":{"start":[295,23],"end":[295,34],"bytes":[8855,8866]},"callee":null},"295:6":{"kind":"call","span":{"start":[295,6],"end":[295,55],"bytes":[8838,8887]},"callee":null},"298:16":{"kind":"call","span":{"start":[298,16],"end":[298,61],"bytes":[8950,8995]},"callee":null},"302:12":{"kind":"call","span":{"start":[302,12],"end":[302,49],"bytes":[9015,9052]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"303:15":{"kind":"call","span":{"start":[303,15],"end":[303,56],"bytes":[9073,9114]},"callee":null},"303:40":{"kind":"call","span":{"start":[303,40],"end":[303,55],"bytes":[9098,9113]},"callee":null},"307:7":{"kind":"call","span":{"start":[307,7],"end":[307,46],"bytes":[9188,9227]},"callee":null},"311:39":{"kind":"call","span":{"start":[311,39],"end":[311,67],"bytes":[9285,9313]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath"},"329:64":{"kind":"call","span":{"start":[329,64],"end":[329,75],"bytes":[9744,9755]},"callee":null},"330:23":{"kind":"call","span":{"start":[330,23],"end":[330,62],"bytes":[9784,9823]},"callee":null},"336:15":{"kind":"call","span":{"start":[336,15],"end":[342,5],"bytes":[9892,10060]},"callee":null},"340:15":{"kind":"call","span":{"start":[340,15],"end":[340,34],"bytes":[10010,10029]},"callee":null},"346:2":{"kind":"call","span":{"start":[346,2],"end":[348,4],"bytes":[10086,10186]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles.closure_1","kind":"function","span":{"start":[346,1],"end":[348,4],"bytes":[10085,10186]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles.closure_1","parameters":[{"name":"i","type":"int","span":{"start":[346,1],"end":[346,45],"bytes":[10085,10129]}},{"name":"j","type":"int","span":{"start":[346,1],"end":[346,45],"bytes":[10085,10129]}}],"return_type":"bool","body":{}}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[354,1],"end":[387,2],"bytes":[10331,11402]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"level","type":"int","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"offset","type":"int64","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"size","type":"int64","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"355:12":{"kind":"call","span":{"start":[355,12],"end":[355,23],"bytes":[10482,10493]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"359:16":{"kind":"call","span":{"start":[359,16],"end":[359,50],"bytes":[10545,10579]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath"},"361:23":{"kind":"call","span":{"start":[361,23],"end":[361,57],"bytes":[10603,10637]},"callee":null},"363:6":{"kind":"call","span":{"start":[363,6],"end":[363,26],"bytes":[10660,10680]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError"},"366:15":{"kind":"call","span":{"start":[366,15],"end":[366,73],"bytes":[10731,10789]},"callee":null},"370:2":{"kind":"call","span":{"start":[370,2],"end":[370,77],"bytes":[10814,10889]},"callee":null},"375:16":{"kind":"call","span":{"start":[375,16],"end":[375,58],"bytes":[11080,11122]},"callee":null},"376:4":{"kind":"call","span":{"start":[376,4],"end":[376,24],"bytes":[11140,11160]},"callee":null},"377:16":{"kind":"call","span":{"start":[377,16],"end":[377,69],"bytes":[11176,11229]},"callee":null},"383:10":{"kind":"call","span":{"start":[383,10],"end":[383,54],"bytes":[11321,11365]},"callee":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser"}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.SetLogger":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.SetLogger","kind":"method","span":{"start":[92,1],"end":[94,2],"bytes":[2978,3084]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[92,1],"end":[92,57],"bytes":[2978,3034]}}],"metrics":{"cyclomatic":1},"body":{"93:13":{"kind":"call","span":{"start":[93,13],"end":[93,48],"bytes":[3047,3082]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.Type":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Type","kind":"method","span":{"start":[124,1],"end":[126,2],"bytes":[3962,4029]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[390,1],"end":[433,2],"bytes":[11455,12884]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}},{"name":"level","type":"int","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}},{"name":"r","type":"io.Reader","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"391:12":{"kind":"call","span":{"start":[391,12],"end":[391,23],"bytes":[11600,11611]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"395:16":{"kind":"call","span":{"start":[395,16],"end":[395,50],"bytes":[11663,11697]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath"},"399:15":{"kind":"call","span":{"start":[399,15],"end":[399,36],"bytes":[11808,11829]},"callee":null},"402:17":{"kind":"call","span":{"start":[402,17],"end":[402,42],"bytes":[11885,11910]},"callee":null},"404:15":{"kind":"call","span":{"start":[404,15],"end":[404,71],"bytes":[11942,11998]},"callee":null},"406:15":{"kind":"call","span":{"start":[406,15],"end":[406,44],"bytes":[12016,12045]},"callee":null},"409:32":{"kind":"call","span":{"start":[409,32],"end":[409,55],"bytes":[12130,12153]},"callee":null},"409:8":{"kind":"call","span":{"start":[409,8],"end":[409,56],"bytes":[12106,12154]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter"},"412:21":{"kind":"call","span":{"start":[412,21],"end":[417,8],"bytes":[12252,12422]},"callee":null},"415:25":{"kind":"call","span":{"start":[415,25],"end":[415,59],"bytes":[12373,12407]},"callee":null},"419:15":{"kind":"call","span":{"start":[419,15],"end":[419,73],"bytes":[12454,12512]},"callee":null},"423:2":{"kind":"call","span":{"start":[423,2],"end":[423,77],"bytes":[12537,12612]},"callee":null},"424:2":{"kind":"call","span":{"start":[424,2],"end":[424,77],"bytes":[12620,12695]},"callee":null},"424:82":{"kind":"call","span":{"start":[424,82],"end":[424,106],"bytes":[12700,12724]},"callee":null},"430:14":{"kind":"call","span":{"start":[430,14],"end":[430,36],"bytes":[12827,12849]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.connect":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect","kind":"method","span":{"start":[151,1],"end":[171,2],"bytes":[4593,5008]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.connect","parameters":[{"name":"_","type":"context.Context","span":{"start":[151,1],"end":[151,59],"bytes":[4593,4651]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"157:13":{"kind":"call","span":{"start":[157,13],"end":[157,46],"bytes":[4722,4755]},"callee":null},"157:31":{"kind":"call","span":{"start":[157,31],"end":[157,42],"bytes":[4740,4751]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options"},"159:10":{"kind":"call","span":{"start":[159,10],"end":[159,65],"bytes":[4782,4837]},"callee":null},"162:13":{"kind":"call","span":{"start":[162,13],"end":[162,30],"bytes":[4854,4871]},"callee":null},"164:3":{"kind":"call","span":{"start":[164,3],"end":[164,13],"bytes":[4891,4901]},"callee":null},"165:10":{"kind":"call","span":{"start":[165,10],"end":[165,67],"bytes":[4911,4968]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore","kind":"method","span":{"start":[220,1],"end":[233,2],"bytes":[6338,6776]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[220,1],"end":[220,69],"bytes":[6338,6406]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"222:10":{"kind":"call","span":{"start":[222,10],"end":[222,47],"bytes":[6441,6478]},"callee":null},"226:22":{"kind":"call","span":{"start":[226,22],"end":[226,57],"bytes":[6555,6590]},"callee":null},"228:10":{"kind":"call","span":{"start":[228,10],"end":[228,122],"bytes":[6617,6729]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","kind":"method","span":{"start":[250,1],"end":[252,2],"bytes":[7041,7185]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","parameters":[{"name":"level","type":"int","span":{"start":[250,1],"end":[250,79],"bytes":[7041,7119]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[250,1],"end":[250,79],"bytes":[7041,7119]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[250,1],"end":[250,79],"bytes":[7041,7119]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"251:9":{"kind":"call","span":{"start":[251,9],"end":[251,64],"bytes":[7128,7183]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.options":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options","kind":"method","span":{"start":[173,1],"end":[216,2],"bytes":[5010,6212]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.options","parameters":[],"return_type":"[]github.com/nats-io/nats.go.Option","metrics":{"cyclomatic":11},"body":{"175:3":{"kind":"call","span":{"start":[175,3],"end":[175,38],"bytes":[5086,5121]},"callee":null},"176:3":{"kind":"call","span":{"start":[176,3],"end":[176,38],"bytes":[5125,5160]},"callee":null},"177:3":{"kind":"call","span":{"start":[177,3],"end":[177,63],"bytes":[5164,5224]},"callee":null},"178:3":{"kind":"call","span":{"start":[178,3],"end":[178,26],"bytes":[5228,5251]},"callee":null},"179:3":{"kind":"call","span":{"start":[179,3],"end":[179,36],"bytes":[5255,5288]},"callee":null},"180:3":{"kind":"call","span":{"start":[180,3],"end":[180,42],"bytes":[5292,5331]},"callee":null},"181:3":{"kind":"call","span":{"start":[181,3],"end":[181,44],"bytes":[5335,5376]},"callee":null},"187:10":{"kind":"call","span":{"start":[187,10],"end":[187,58],"bytes":[5463,5511]},"callee":null},"187:23":{"kind":"call","span":{"start":[187,23],"end":[187,57],"bytes":[5476,5510]},"callee":null},"189:10":{"kind":"call","span":{"start":[189,10],"end":[189,53],"bytes":[5542,5585]},"callee":null},"189:23":{"kind":"call","span":{"start":[189,23],"end":[189,52],"bytes":[5555,5584]},"callee":null},"191:10":{"kind":"call","span":{"start":[191,10],"end":[191,50],"bytes":[5615,5655]},"callee":null},"191:23":{"kind":"call","span":{"start":[191,23],"end":[191,49],"bytes":[5628,5654]},"callee":null},"193:10":{"kind":"call","span":{"start":[193,10],"end":[193,61],"bytes":[5709,5760]},"callee":null},"193:23":{"kind":"call","span":{"start":[193,23],"end":[193,60],"bytes":[5722,5759]},"callee":null},"195:10":{"kind":"call","span":{"start":[195,10],"end":[195,43],"bytes":[5791,5824]},"callee":null},"195:23":{"kind":"call","span":{"start":[195,23],"end":[195,42],"bytes":[5804,5823]},"callee":null},"199:10":{"kind":"call","span":{"start":[199,10],"end":[199,56],"bytes":[5877,5923]},"callee":null},"199:23":{"kind":"call","span":{"start":[199,23],"end":[199,55],"bytes":[5890,5922]},"callee":null},"204:10":{"kind":"call","span":{"start":[204,10],"end":[204,37],"bytes":[5971,5998]},"callee":null},"204:23":{"kind":"call","span":{"start":[204,23],"end":[204,36],"bytes":[5984,5997]},"callee":null},"208:10":{"kind":"call","span":{"start":[208,10],"end":[208,66],"bytes":[6058,6114]},"callee":null},"208:23":{"kind":"call","span":{"start":[208,23],"end":[208,65],"bytes":[6071,6113]},"callee":null},"211:5":{"kind":"call","span":{"start":[211,5],"end":[211,19],"bytes":[6123,6137]},"callee":null},"212:10":{"kind":"call","span":{"start":[212,10],"end":[212,50],"bytes":[6153,6193]},"callee":null},"212:23":{"kind":"call","span":{"start":[212,23],"end":[212,49],"bytes":[6166,6192]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","kind":"method","span":{"start":[255,1],"end":[280,2],"bytes":[7270,8155]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","parameters":[{"name":"objPath","type":"string","span":{"start":[255,1],"end":[255,105],"bytes":[7270,7374]}}],"return_type":"(int, github.com/superfly/ltx.TXID, github.com/superfly/ltx.TXID, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"257:21":{"kind":"call","span":{"start":[257,21],"end":[257,59],"bytes":[7438,7476]},"callee":null},"258:13":{"kind":"call","span":{"start":[258,13],"end":[258,52],"bytes":[7491,7530]},"callee":null},"262:11":{"kind":"call","span":{"start":[262,11],"end":[262,38],"bytes":[7604,7631]},"callee":null},"263:5":{"kind":"call","span":{"start":[263,5],"end":[263,15],"bytes":[7636,7646]},"callee":null},"264:19":{"kind":"call","span":{"start":[264,19],"end":[264,62],"bytes":[7692,7735]},"callee":null},"268:18":{"kind":"call","span":{"start":[268,18],"end":[268,40],"bytes":[7773,7795]},"callee":null},"269:19":{"kind":"call","span":{"start":[269,19],"end":[269,75],"bytes":[7828,7884]},"callee":null},"274:33":{"kind":"call","span":{"start":[274,33],"end":[274,60],"bytes":[7984,8011]},"callee":null},"276:19":{"kind":"call","span":{"start":[276,19],"end":[276,78],"bytes":[8047,8106]},"callee":null}}}},"fields":{"BucketName":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/BucketName","kind":"field","type":"string","span":{"start":[50,1],"end":[50,49],"bytes":[1057,1105]}},"ClientCert":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ClientCert","kind":"field","type":"string","span":{"start":[61,1],"end":[61,53],"bytes":[1604,1656]}},"ClientKey":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ClientKey","kind":"field","type":"string","span":{"start":[62,1],"end":[62,45],"bytes":[1657,1701]}},"Creds":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Creds","kind":"field","type":"string","span":{"start":[54,1],"end":[54,46],"bytes":[1277,1322]}},"JWT":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/JWT","kind":"field","type":"string","span":{"start":[52,1],"end":[52,53],"bytes":[1172,1224]}},"MaxPingsOut":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/MaxPingsOut","kind":"field","type":"int","span":{"start":[73,1],"end":[73,91],"bytes":[2264,2354]}},"MaxReconnects":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/MaxReconnects","kind":"field","type":"int","span":{"start":[68,1],"end":[68,99],"bytes":[1861,1959]}},"NKey":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/NKey","kind":"field","type":"string","span":{"start":[55,1],"end":[55,48],"bytes":[1323,1370]}},"Password":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Password","kind":"field","type":"string","span":{"start":[57,1],"end":[57,52],"bytes":[1423,1474]}},"Path":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[51,1],"end":[51,66],"bytes":[1106,1171]}},"PingInterval":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/PingInterval","kind":"field","type":"time.Duration","span":{"start":[72,1],"end":[72,64],"bytes":[2200,2263]}},"ReconnectBufSize":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ReconnectBufSize","kind":"field","type":"int","span":{"start":[74,1],"end":[74,75],"bytes":[2355,2429]}},"ReconnectJitter":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ReconnectJitter","kind":"field","type":"time.Duration","span":{"start":[70,1],"end":[70,81],"bytes":[2050,2130]}},"ReconnectWait":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ReconnectWait","kind":"field","type":"time.Duration","span":{"start":[69,1],"end":[69,90],"bytes":[1960,2049]}},"RootCAs":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/RootCAs","kind":"field","type":"[]string","span":{"start":[60,1],"end":[60,45],"bytes":[1559,1603]}},"Seed":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Seed","kind":"field","type":"string","span":{"start":[53,1],"end":[53,52],"bytes":[1225,1276]}},"SigCB":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/SigCB","kind":"field","type":"func([]byte) ([]byte, error)","span":{"start":[76,1],"end":[76,69],"bytes":[2493,2561]}},"TLS":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/TLS","kind":"field","type":"bool","span":{"start":[59,1],"end":[59,35],"bytes":[1524,1558]}},"Timeout":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Timeout","kind":"field","type":"time.Duration","span":{"start":[71,1],"end":[71,69],"bytes":[2131,2199]}},"Token":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Token","kind":"field","type":"string","span":{"start":[58,1],"end":[58,49],"bytes":[1475,1523]}},"URL":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/URL","kind":"field","type":"string","span":{"start":[49,1],"end":[49,40],"bytes":[1017,1056]}},"UserJWT":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/UserJWT","kind":"field","type":"func() (string, error)","span":{"start":[75,1],"end":[75,63],"bytes":[2430,2492]}},"Username":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Username","kind":"field","type":"string","span":{"start":[56,1],"end":[56,52],"bytes":[1371,1422]}},"js":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/js","kind":"field","type":"github.com/nats-io/nats.go/jetstream.JetStream","span":{"start":[45,1],"end":[45,33],"bytes":[930,962]}},"logger":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[41,1],"end":[41,21],"bytes":[842,862]}},"mu":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[40,1],"end":[40,19],"bytes":[823,841]}},"nc":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/nc","kind":"field","type":"*github.com/nats-io/nats.go.Conn","span":{"start":[44,1],"end":[44,24],"bytes":[906,929]}},"objectStore":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/objectStore","kind":"field","type":"github.com/nats-io/nats.go/jetstream.ObjectStore","span":{"start":[46,1],"end":[46,35],"bytes":[963,997]}}}},"ltxFileIterator":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator","kind":"struct","span":{"start":[492,1],"end":[496,2],"bytes":[14755,14833]},"callables":{"github.com/benbjohnson/litestream/nats.ltxFileIterator.Close":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Close","kind":"method","span":{"start":[518,1],"end":[520,2],"bytes":[15366,15427]},"signature":"github.com/benbjohnson/litestream/nats.ltxFileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/nats.ltxFileIterator.Err":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Err","kind":"method","span":{"start":[513,1],"end":[515,2],"bytes":[15222,15281]},"signature":"github.com/benbjohnson/litestream/nats.ltxFileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/nats.ltxFileIterator.Item":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Item","kind":"method","span":{"start":[505,1],"end":[510,2],"bytes":[15015,15163]},"signature":"github.com/benbjohnson/litestream/nats.ltxFileIterator.Item","parameters":[],"return_type":"*github.com/superfly/ltx.FileInfo","metrics":{"cyclomatic":2},"body":{"506:35":{"kind":"call","span":{"start":[506,35],"end":[506,49],"bytes":[15100,15114]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ltxFileIterator.Next":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Next","kind":"method","span":{"start":[499,1],"end":[502,2],"bytes":[14883,14974]},"signature":"github.com/benbjohnson/litestream/nats.ltxFileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"501:21":{"kind":"call","span":{"start":[501,21],"end":[501,35],"bytes":[14958,14972]},"callee":null}}}},"fields":{"err":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/err","kind":"field","type":"error","span":{"start":[495,1],"end":[495,13],"bytes":[14819,14831]}},"files":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/files","kind":"field","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[493,1],"end":[493,23],"bytes":[14785,14807]}},"index":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/index","kind":"field","type":"int","span":{"start":[494,1],"end":[494,11],"bytes":[14808,14818]}}}}},"functions":{"github.com/benbjohnson/litestream/nats.NewReplicaClient":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","kind":"function","span":{"start":[80,1],"end":[90,2],"bytes":[2626,2976]},"signature":"github.com/benbjohnson/litestream/nats.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/nats.ReplicaClient","metrics":{"cyclomatic":1},"body":{"82:21":{"kind":"call","span":{"start":[82,21],"end":[82,35],"bytes":[2711,2725]},"callee":null}}},"github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","kind":"function","span":{"start":[99,1],"end":[121,2],"bytes":[3275,3917]},"signature":"github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}},{"name":"host","type":"string","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}},{"name":"urlPath","type":"string","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}},{"name":"query","type":"net/url.Values","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"100:12":{"kind":"call","span":{"start":[100,12],"end":[100,30],"bytes":[3423,3441]},"callee":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient"},"104:16":{"kind":"call","span":{"start":[104,16],"end":[104,46],"bytes":[3515,3545]},"callee":null},"109:21":{"kind":"call","span":{"start":[109,21],"end":[109,40],"bytes":[3641,3660]},"callee":null},"110:24":{"kind":"call","span":{"start":[110,24],"end":[110,43],"bytes":[3684,3703]},"callee":null},"114:12":{"kind":"call","span":{"start":[114,12],"end":[114,38],"bytes":[3753,3779]},"callee":null},"116:15":{"kind":"call","span":{"start":[116,15],"end":[116,65],"bytes":[3813,3863]},"callee":null}}},"github.com/benbjohnson/litestream/nats.init":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.init","kind":"function","span":{"start":[26,1],"end":[28,2],"bytes":[326,415]},"signature":"github.com/benbjohnson/litestream/nats.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"27:2":{"kind":"call","span":{"start":[27,2],"end":[27,74],"bytes":[341,413]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/nats.isNotFoundError":{"id":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","kind":"function","span":{"start":[487,1],"end":[489,2],"bytes":[14529,14683]},"signature":"github.com/benbjohnson/litestream/nats.isNotFoundError","parameters":[{"name":"err","type":"error","span":{"start":[487,1],"end":[487,39],"bytes":[14529,14567]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"488:24":{"kind":"call","span":{"start":[488,24],"end":[488,67],"bytes":[14591,14634]},"callee":null},"488:71":{"kind":"call","span":{"start":[488,71],"end":[488,113],"bytes":[14638,14680]},"callee":null},"488:88":{"kind":"call","span":{"start":[488,88],"end":[488,99],"bytes":[14655,14666]},"callee":null}}}},"content_hash":"f98e6196bb9a1f560d754c595e7899192c063306a4efe6165f2801aa222ba8ec"},"oss/replica_client.go":{"id":"can://go/litestream/oss/replica_client.go","kind":"module","span":{"start":[1,1],"end":[727,1],"bytes":[0,19595]},"package":"oss","source":"package oss\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss\"\n\t\"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/errgroup\"\n\t\"golang.org/x/sync/semaphore\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"oss\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"oss\"\n\n// MetadataKeyTimestamp is the metadata key for storing LTX file timestamps in OSS.\n// Note: OSS SDK automatically adds \"x-oss-meta-\" prefix when setting metadata.\nconst MetadataKeyTimestamp = \"litestream-timestamp\"\n\n// MaxKeys is the number of keys OSS can operate on per batch.\nconst MaxKeys = 1000\n\n// DefaultRegion is the region used if one is not specified.\nconst DefaultRegion = \"cn-hangzhou\"\n\n// DefaultMetadataConcurrency is the default number of concurrent HeadObject calls\n// for fetching accurate timestamps during timestamp-based restore.\nconst DefaultMetadataConcurrency = 50\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to Alibaba Cloud OSS.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tclient *oss.Client\n\tuploader *oss.Uploader\n\tlogger *slog.Logger\n\n\t// Alibaba Cloud authentication keys.\n\tAccessKeyID string\n\tAccessKeySecret string\n\n\t// OSS bucket information\n\tRegion string\n\tBucket string\n\tPath string\n\tEndpoint string\n\n\t// Upload configuration\n\tPartSize int64 // Part size for multipart uploads (default: 5MB)\n\tConcurrency int // Number of concurrent parts to upload (default: 3)\n\n\t// MetadataConcurrency controls parallel HeadObject calls for timestamp-based restore.\n\t// Higher values improve restore speed for large backup histories.\n\t// Default: 50\n\tMetadataConcurrency int\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: oss://bucket[.oss-region.aliyuncs.com]/path\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\tbucket, region, _ := ParseHost(host)\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for oss replica URL\")\n\t}\n\n\tclient.Bucket = bucket\n\tclient.Region = region\n\tclient.Path = urlPath\n\n\treturn client, nil\n}\n\n// Type returns \"oss\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to OSS. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) (err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.client != nil {\n\t\treturn nil\n\t}\n\n\t// Validate required configuration\n\tif c.Bucket == \"\" {\n\t\treturn fmt.Errorf(\"oss: bucket name is required\")\n\t}\n\n\t// Use default region if not specified\n\tregion := c.Region\n\tif region == \"\" {\n\t\tregion = DefaultRegion\n\t}\n\n\t// Build configuration\n\tcfg := oss.LoadDefaultConfig()\n\n\t// Configure credentials\n\tif c.AccessKeyID != \"\" \u0026\u0026 c.AccessKeySecret != \"\" {\n\t\tcfg = cfg.WithCredentialsProvider(\n\t\t\tcredentials.NewStaticCredentialsProvider(c.AccessKeyID, c.AccessKeySecret),\n\t\t)\n\t} else {\n\t\t// Use environment variable credentials provider\n\t\tcfg = cfg.WithCredentialsProvider(\n\t\t\tcredentials.NewEnvironmentVariableCredentialsProvider(),\n\t\t)\n\t}\n\n\t// Configure region\n\tcfg = cfg.WithRegion(region)\n\n\t// Configure custom endpoint if specified\n\tif c.Endpoint != \"\" {\n\t\tendpoint := c.Endpoint\n\t\t// Add scheme if not present\n\t\tif !strings.HasPrefix(endpoint, \"http://\") \u0026\u0026 !strings.HasPrefix(endpoint, \"https://\") {\n\t\t\tendpoint = \"https://\" + endpoint\n\t\t}\n\t\tcfg = cfg.WithEndpoint(endpoint)\n\t}\n\n\t// Create OSS client\n\tc.client = oss.NewClient(cfg)\n\n\t// Create uploader with configurable part size and concurrency\n\tuploaderOpts := []func(*oss.UploaderOptions){}\n\tif c.PartSize \u003e 0 {\n\t\tuploaderOpts = append(uploaderOpts, func(o *oss.UploaderOptions) {\n\t\t\to.PartSize = c.PartSize\n\t\t})\n\t}\n\tif c.Concurrency \u003e 0 {\n\t\tuploaderOpts = append(uploaderOpts, func(o *oss.UploaderOptions) {\n\t\t\to.ParallelNum = c.Concurrency\n\t\t})\n\t}\n\tc.uploader = c.client.NewUploader(uploaderOpts...)\n\n\treturn nil\n}\n\n// LTXFiles returns an iterator over all LTX files on the replica for the given level.\n// When useMetadata is true, fetches accurate timestamps from OSS metadata via HeadObject.\n// This uses parallel batched requests (controlled by MetadataConcurrency) to avoid hangs\n// with large backup histories (see issue #930).\n// When false, uses fast LastModified timestamps from LIST operation.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn newFileIterator(ctx, c, level, seek, useMetadata), nil\n}\n\n// OpenLTXFile returns a reader for an LTX file.\n// Returns os.ErrNotExist if no matching file is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Build the key from the file info\n\tfilename := ltx.FormatFilename(minTXID, maxTXID)\n\tkey := c.ltxPath(level, filename)\n\n\trequest := \u0026oss.GetObjectRequest{\n\t\tBucket: oss.Ptr(c.Bucket),\n\t\tKey: oss.Ptr(key),\n\t}\n\n\t// Set range header if offset is specified\n\tif size \u003e 0 {\n\t\trequest.RangeBehavior = oss.Ptr(\"standard\")\n\t\trequest.Range = oss.Ptr(fmt.Sprintf(\"bytes=%d-%d\", offset, offset+size-1))\n\t} else if offset \u003e 0 {\n\t\trequest.RangeBehavior = oss.Ptr(\"standard\")\n\t\trequest.Range = oss.Ptr(fmt.Sprintf(\"bytes=%d-\", offset))\n\t}\n\n\tresult, err := c.client.GetObject(ctx, request)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"oss: get object %s: %w\", key, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\n\treturn result.Body, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\n// Extracts timestamp from LTX header and stores it in OSS metadata to preserve original creation time.\n// Uses multipart upload for large files via the uploader.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(r, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\trc := internal.NewReadCounter(io.MultiReader(\u0026buf, r))\n\n\tfilename := ltx.FormatFilename(minTXID, maxTXID)\n\tkey := c.ltxPath(level, filename)\n\n\t// Store timestamp in OSS metadata for accurate timestamp retrieval\n\tmetadata := map[string]string{\n\t\tMetadataKeyTimestamp: timestamp.Format(time.RFC3339Nano),\n\t}\n\n\t// Use uploader for automatic multipart handling (files \u003e5GB)\n\tresult, err := c.uploader.UploadFrom(ctx, \u0026oss.PutObjectRequest{\n\t\tBucket: oss.Ptr(c.Bucket),\n\t\tKey: oss.Ptr(key),\n\t\tMetadata: metadata,\n\t}, rc)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"oss: upload to %s: %w\", key, err)\n\t}\n\n\t// Build file info from the uploaded file\n\tinfo := \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: rc.N(),\n\t\tCreatedAt: timestamp,\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(rc.N()))\n\n\t// ETag indicates successful upload\n\tif result.ETag == nil || *result.ETag == \"\" {\n\t\treturn nil, fmt.Errorf(\"oss: upload failed: no ETag returned\")\n\t}\n\n\treturn info, nil\n}\n\n// DeleteLTXFiles deletes one or more LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\n\t// Convert file infos to object identifiers\n\tobjects := make([]oss.DeleteObject, 0, len(a))\n\tfor _, info := range a {\n\t\tfilename := ltx.FormatFilename(info.MinTXID, info.MaxTXID)\n\t\tkey := c.ltxPath(info.Level, filename)\n\t\tobjects = append(objects, oss.DeleteObject{Key: oss.Ptr(key)})\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"key\", key)\n\t}\n\n\t// Delete in batches\n\tfor len(objects) \u003e 0 {\n\t\tn := min(len(objects), MaxKeys)\n\t\tbatch := objects[:n]\n\n\t\trequest := \u0026oss.DeleteMultipleObjectsRequest{\n\t\t\tBucket: oss.Ptr(c.Bucket),\n\t\t\tObjects: batch,\n\t\t}\n\n\t\tout, err := c.client.DeleteMultipleObjects(ctx, request)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"oss: delete batch of %d objects: %w\", n, err)\n\t\t} else if err := deleteResultError(batch, out); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\n\t\tobjects = objects[n:]\n\t}\n\n\treturn nil\n}\n\n// DeleteAll deletes all files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tvar objects []oss.DeleteObject\n\n\t// Create paginator for listing objects\n\tprefix := c.Path + \"/\"\n\tpaginator := c.client.NewListObjectsV2Paginator(\u0026oss.ListObjectsV2Request{\n\t\tBucket: oss.Ptr(c.Bucket),\n\t\tPrefix: oss.Ptr(prefix),\n\t})\n\n\t// Iterate through all pages\n\tfor paginator.HasNext() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"oss: list objects page: %w\", err)\n\t\t}\n\n\t\t// Collect object identifiers\n\t\tfor _, obj := range page.Contents {\n\t\t\tif obj.Key != nil {\n\t\t\t\tobjects = append(objects, oss.DeleteObject{Key: obj.Key})\n\t\t\t}\n\t\t}\n\t}\n\n\t// Delete all collected objects in batches\n\tfor len(objects) \u003e 0 {\n\t\tn := min(len(objects), MaxKeys)\n\t\tbatch := objects[:n]\n\n\t\trequest := \u0026oss.DeleteMultipleObjectsRequest{\n\t\t\tBucket: oss.Ptr(c.Bucket),\n\t\t\tObjects: batch,\n\t\t}\n\n\t\tout, err := c.client.DeleteMultipleObjects(ctx, request)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"oss: delete all batch of %d objects: %w\", n, err)\n\t\t} else if err := deleteResultError(batch, out); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjects = objects[n:]\n\t}\n\n\treturn nil\n}\n\n// ltxPath returns the full path to an LTX file.\nfunc (c *ReplicaClient) ltxPath(level int, filename string) string {\n\treturn c.Path + \"/\" + fmt.Sprintf(\"%04x/%s\", level, filename)\n}\n\n// fileIterator represents an iterator over LTX files in OSS.\ntype fileIterator struct {\n\tctx context.Context\n\tcancel context.CancelFunc\n\tclient *ReplicaClient\n\tlevel int\n\tseek ltx.TXID\n\n\tuseMetadata bool // When true, fetch accurate timestamps from metadata\n\tmetadataCache map[string]time.Time // key -\u003e timestamp cache for batch fetches\n\n\tpaginator *oss.ListObjectsV2Paginator\n\tpage *oss.ListObjectsV2Result\n\tpageIndex int\n\tinitialized bool\n\n\tclosed bool\n\terr error\n\tinfo *ltx.FileInfo\n}\n\nfunc newFileIterator(ctx context.Context, client *ReplicaClient, level int, seek ltx.TXID, useMetadata bool) *fileIterator {\n\tctx, cancel := context.WithCancel(ctx)\n\n\titr := \u0026fileIterator{\n\t\tctx: ctx,\n\t\tcancel: cancel,\n\t\tclient: client,\n\t\tlevel: level,\n\t\tseek: seek,\n\t\tuseMetadata: useMetadata,\n\t\tmetadataCache: make(map[string]time.Time),\n\t}\n\n\treturn itr\n}\n\n// fetchMetadataBatch fetches timestamps from OSS metadata for a batch of keys in parallel.\nfunc (itr *fileIterator) fetchMetadataBatch(keys []string) error {\n\tif len(keys) == 0 {\n\t\treturn nil\n\t}\n\n\t// Determine concurrency limit\n\tconcurrency := itr.client.MetadataConcurrency\n\tif concurrency \u003c= 0 {\n\t\tconcurrency = DefaultMetadataConcurrency\n\t}\n\n\t// Pre-allocate results map to avoid lock contention during writes\n\tresults := make(map[string]time.Time, len(keys))\n\tvar mu sync.Mutex\n\n\t// Use x/sync/semaphore for precise concurrency control with context support\n\tsem := semaphore.NewWeighted(int64(concurrency))\n\tg, ctx := errgroup.WithContext(itr.ctx)\n\n\tfor _, key := range keys {\n\t\tkey := key // capture for goroutine\n\n\t\tg.Go(func() error {\n\t\t\t// Acquire semaphore slot (blocking with context cancellation)\n\t\t\tif err := sem.Acquire(ctx, 1); err != nil {\n\t\t\t\treturn err // context cancelled\n\t\t\t}\n\t\t\tdefer sem.Release(1)\n\n\t\t\thead, err := itr.client.client.HeadObject(ctx, \u0026oss.HeadObjectRequest{\n\t\t\t\tBucket: oss.Ptr(itr.client.Bucket),\n\t\t\t\tKey: oss.Ptr(key),\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\t// Non-fatal: file might not have metadata, use LastModified\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif head.Metadata != nil {\n\t\t\t\tif ts, ok := head.Metadata[MetadataKeyTimestamp]; ok {\n\t\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, ts); err == nil {\n\t\t\t\t\t\tmu.Lock()\n\t\t\t\t\t\tresults[key] = parsed\n\t\t\t\t\t\tmu.Unlock()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t}\n\n\tif err := g.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\t// Merge results into cache\n\tfor k, v := range results {\n\t\titr.metadataCache[k] = v\n\t}\n\treturn nil\n}\n\n// initPaginator initializes the paginator lazily.\nfunc (itr *fileIterator) initPaginator() {\n\tif itr.initialized {\n\t\treturn\n\t}\n\titr.initialized = true\n\n\t// Create paginator for listing objects with level prefix\n\tprefix := itr.client.ltxPath(itr.level, \"\")\n\titr.paginator = itr.client.client.NewListObjectsV2Paginator(\u0026oss.ListObjectsV2Request{\n\t\tBucket: oss.Ptr(itr.client.Bucket),\n\t\tPrefix: oss.Ptr(prefix),\n\t})\n}\n\n// Close stops iteration and returns any error that occurred during iteration.\nfunc (itr *fileIterator) Close() (err error) {\n\titr.closed = true\n\titr.cancel()\n\treturn itr.err\n}\n\n// Next returns the next file. Returns false when no more files are available.\nfunc (itr *fileIterator) Next() bool {\n\tif itr.closed || itr.err != nil {\n\t\treturn false\n\t}\n\n\t// Initialize paginator on first call\n\titr.initPaginator()\n\n\t// Process objects until we find a valid LTX file\n\tfor {\n\t\t// Load next page if needed\n\t\tif itr.page == nil || itr.pageIndex \u003e= len(itr.page.Contents) {\n\t\t\tif !itr.paginator.HasNext() {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tvar err error\n\t\t\titr.page, err = itr.paginator.NextPage(itr.ctx)\n\t\t\tif err != nil {\n\t\t\t\titr.err = err\n\t\t\t\treturn false\n\t\t\t}\n\t\t\titr.pageIndex = 0\n\n\t\t\t// Batch fetch metadata for the entire page when useMetadata is true.\n\t\t\t// This uses parallel HeadObject calls controlled by MetadataConcurrency\n\t\t\t// to avoid the O(N) sequential calls that caused restore hangs (issue #930).\n\t\t\tif itr.useMetadata \u0026\u0026 len(itr.page.Contents) \u003e 0 {\n\t\t\t\tkeys := make([]string, 0, len(itr.page.Contents))\n\t\t\t\tfor _, obj := range itr.page.Contents {\n\t\t\t\t\tif obj.Key != nil {\n\t\t\t\t\t\tkeys = append(keys, *obj.Key)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif err := itr.fetchMetadataBatch(keys); err != nil {\n\t\t\t\t\titr.err = err\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process current object\n\t\tif itr.pageIndex \u003c len(itr.page.Contents) {\n\t\t\tobj := itr.page.Contents[itr.pageIndex]\n\t\t\titr.pageIndex++\n\n\t\t\tif obj.Key == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Extract file info from key\n\t\t\tfullKey := *obj.Key\n\t\t\tkey := path.Base(fullKey)\n\t\t\tminTXID, maxTXID, err := ltx.ParseFilename(key)\n\t\t\tif err != nil {\n\t\t\t\tcontinue // Skip non-LTX files\n\t\t\t}\n\n\t\t\t// Build file info\n\t\t\tinfo := \u0026ltx.FileInfo{\n\t\t\t\tLevel: itr.level,\n\t\t\t\tMinTXID: minTXID,\n\t\t\t\tMaxTXID: maxTXID,\n\t\t\t}\n\n\t\t\t// Skip if below seek TXID\n\t\t\tif info.MinTXID \u003c itr.seek {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Set file info\n\t\t\tinfo.Size = obj.Size\n\n\t\t\t// Use cached metadata timestamp if available (from batch fetch),\n\t\t\t// otherwise fallback to LastModified from LIST operation.\n\t\t\tif itr.useMetadata {\n\t\t\t\tif ts, ok := itr.metadataCache[fullKey]; ok {\n\t\t\t\t\tinfo.CreatedAt = ts\n\t\t\t\t} else if obj.LastModified != nil {\n\t\t\t\t\tinfo.CreatedAt = obj.LastModified.UTC()\n\t\t\t\t} else {\n\t\t\t\t\tinfo.CreatedAt = time.Now().UTC()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif obj.LastModified != nil {\n\t\t\t\t\tinfo.CreatedAt = obj.LastModified.UTC()\n\t\t\t\t} else {\n\t\t\t\t\tinfo.CreatedAt = time.Now().UTC()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titr.info = info\n\t\t\treturn true\n\t\t}\n\t}\n}\n\n// Item returns the metadata for the current file.\nfunc (itr *fileIterator) Item() *ltx.FileInfo {\n\treturn itr.info\n}\n\n// Err returns any error that occurred during iteration.\nfunc (itr *fileIterator) Err() error {\n\treturn itr.err\n}\n\n// ParseURL parses an OSS URL into its host and path parts.\nfunc ParseURL(s string) (bucket, region, key string, err error) {\n\tu, err := url.Parse(s)\n\tif err != nil {\n\t\treturn \"\", \"\", \"\", err\n\t}\n\n\tif u.Scheme != \"oss\" {\n\t\treturn \"\", \"\", \"\", fmt.Errorf(\"oss: invalid url scheme\")\n\t}\n\n\t// Parse host to extract bucket and region\n\tbucket, region, _ = ParseHost(u.Host)\n\tif bucket == \"\" {\n\t\tbucket = u.Host\n\t}\n\n\tkey = strings.TrimPrefix(u.Path, \"/\")\n\treturn bucket, region, key, nil\n}\n\n// ParseHost parses the host/endpoint for an OSS storage system.\n// Supports formats like:\n// - bucket.oss-cn-hangzhou.aliyuncs.com\n// - bucket.oss-cn-hangzhou-internal.aliyuncs.com\n// - bucket (just bucket name)\nfunc ParseHost(host string) (bucket, region, endpoint string) {\n\t// Check for internal OSS URL format first (more specific pattern)\n\tif a := ossInternalRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tif len(a) \u003e 2 \u0026\u0026 a[2] != \"\" {\n\t\t\tregion = a[2]\n\t\t}\n\t\treturn bucket, region, \"\"\n\t}\n\n\t// Check for standard OSS URL format\n\tif a := ossRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tif len(a) \u003e 2 \u0026\u0026 a[2] != \"\" {\n\t\t\tregion = a[2]\n\t\t}\n\t\treturn bucket, region, \"\"\n\t}\n\n\t// For other hosts, assume it's just the bucket name\n\treturn host, \"\", \"\"\n}\n\nvar (\n\t// oss-cn-hangzhou.aliyuncs.com or bucket.oss-cn-hangzhou.aliyuncs.com\n\tossRegex = regexp.MustCompile(`^(?:([^.]+)\\.)?oss-([^.]+)\\.aliyuncs\\.com$`)\n\t// oss-cn-hangzhou-internal.aliyuncs.com or bucket.oss-cn-hangzhou-internal.aliyuncs.com\n\t// Uses non-greedy .+? to correctly extract region without -internal suffix\n\tossInternalRegex = regexp.MustCompile(`^(?:([^.]+)\\.)?oss-(.+?)-internal\\.aliyuncs\\.com$`)\n)\n\nfunc isNotExists(err error) bool {\n\tvar serviceErr *oss.ServiceError\n\tif errors.As(err, \u0026serviceErr) {\n\t\treturn serviceErr.Code == \"NoSuchKey\"\n\t}\n\treturn false\n}\n\n// deleteResultError checks if all requested objects were deleted.\n// OSS SDK doesn't have explicit per-object error reporting like S3, so we verify\n// all requested keys appear in the deleted list.\nfunc deleteResultError(requested []oss.DeleteObject, out *oss.DeleteMultipleObjectsResult) error {\n\tif out == nil {\n\t\treturn nil\n\t}\n\n\t// Build set of deleted keys for quick lookup\n\tdeleted := make(map[string]struct{}, len(out.DeletedObjects))\n\tfor _, obj := range out.DeletedObjects {\n\t\tif obj.Key != nil {\n\t\t\tdeleted[*obj.Key] = struct{}{}\n\t\t}\n\t}\n\n\t// Check that all requested keys were deleted\n\tvar failed []string\n\tfor _, obj := range requested {\n\t\tif obj.Key == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif _, ok := deleted[*obj.Key]; !ok {\n\t\t\tfailed = append(failed, *obj.Key)\n\t\t}\n\t}\n\n\tif len(failed) == 0 {\n\t\treturn nil\n\t}\n\n\t// Build error message listing failed keys\n\tvar b strings.Builder\n\tb.WriteString(\"oss: failed to delete files:\")\n\tfor _, key := range failed {\n\t\tfmt.Fprintf(\u0026b, \"\\n%s\", key)\n\t}\n\treturn errors.New(b.String())\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[22,30]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[31,41]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[42,51]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[52,58]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[59,64]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[65,76]}},{"name":"url","path":"net/url","span":{"start":[10,1],"end":[10,11],"bytes":[77,87]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[88,93]}},{"name":"path","path":"path","span":{"start":[12,1],"end":[12,8],"bytes":[94,101]}},{"name":"regexp","path":"regexp","span":{"start":[13,1],"end":[13,10],"bytes":[102,111]}},{"name":"strings","path":"strings","span":{"start":[14,1],"end":[14,11],"bytes":[112,122]}},{"name":"sync","path":"sync","span":{"start":[15,1],"end":[15,8],"bytes":[123,130]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[131,138]}},{"name":"oss","path":"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss","span":{"start":[18,1],"end":[18,52],"bytes":[140,191]}},{"name":"credentials","path":"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials","span":{"start":[19,1],"end":[19,64],"bytes":[192,255]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[20,1],"end":[20,27],"bytes":[256,282]}},{"name":"errgroup","path":"golang.org/x/sync/errgroup","span":{"start":[21,1],"end":[21,30],"bytes":[283,312]}},{"name":"semaphore","path":"golang.org/x/sync/semaphore","span":{"start":[22,1],"end":[22,31],"bytes":[313,343]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[24,1],"end":[24,37],"bytes":[345,381]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[25,1],"end":[25,46],"bytes":[382,427]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient","kind":"struct","span":{"start":[52,1],"end":[76,2],"bytes":[1331,1999]},"callables":{"github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","kind":"method","span":{"start":[336,1],"end":[386,2],"bytes":[9636,10832]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[336,1],"end":[336,63],"bytes":[9636,9698]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"337:12":{"kind":"call","span":{"start":[337,12],"end":[337,23],"bytes":[9710,9721]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"345:15":{"kind":"call","span":{"start":[345,15],"end":[348,4],"bytes":[9865,9986]},"callee":null},"346:11":{"kind":"call","span":{"start":[346,11],"end":[346,28],"bytes":[9937,9954]},"callee":null},"347:11":{"kind":"call","span":{"start":[347,11],"end":[347,26],"bytes":[9966,9981]},"callee":null},"351:6":{"kind":"call","span":{"start":[351,6],"end":[351,25],"bytes":[10023,10042]},"callee":null},"352:16":{"kind":"call","span":{"start":[352,16],"end":[352,39],"bytes":[10060,10083]},"callee":null},"354:11":{"kind":"call","span":{"start":[354,11],"end":[354,56],"bytes":[10112,10157]},"callee":null},"360:15":{"kind":"call","span":{"start":[360,15],"end":[360,62],"bytes":[10270,10317]},"callee":null},"366:6":{"kind":"call","span":{"start":[366,6],"end":[366,18],"bytes":[10380,10392]},"callee":null},"367:12":{"kind":"call","span":{"start":[367,12],"end":[367,24],"bytes":[10410,10422]},"callee":null},"367:8":{"kind":"call","span":{"start":[367,8],"end":[367,34],"bytes":[10406,10432]},"callee":null},"371:13":{"kind":"call","span":{"start":[371,13],"end":[371,30],"bytes":[10517,10534]},"callee":null},"375:15":{"kind":"call","span":{"start":[375,15],"end":[375,59],"bytes":[10574,10618]},"callee":null},"377:11":{"kind":"call","span":{"start":[377,11],"end":[377,72],"bytes":[10647,10708]},"callee":null},"378:20":{"kind":"call","span":{"start":[378,20],"end":[378,49],"bytes":[10728,10757]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError"}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[291,1],"end":[333,2],"bytes":[8451,9602]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[291,1],"end":[291,87],"bytes":[8451,8537]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[291,1],"end":[291,87],"bytes":[8451,8537]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"292:12":{"kind":"call","span":{"start":[292,12],"end":[292,23],"bytes":[8549,8560]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"296:5":{"kind":"call","span":{"start":[296,5],"end":[296,11],"bytes":[8596,8602]},"callee":null},"301:13":{"kind":"call","span":{"start":[301,13],"end":[301,48],"bytes":[8684,8719]},"callee":null},"301:41":{"kind":"call","span":{"start":[301,41],"end":[301,47],"bytes":[8712,8718]},"callee":null},"303:15":{"kind":"call","span":{"start":[303,15],"end":[303,61],"bytes":[8760,8806]},"callee":null},"304:10":{"kind":"call","span":{"start":[304,10],"end":[304,41],"bytes":[8816,8847]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath"},"305:13":{"kind":"call","span":{"start":[305,13],"end":[305,65],"bytes":[8860,8912]},"callee":null},"305:51":{"kind":"call","span":{"start":[305,51],"end":[305,63],"bytes":[8898,8910]},"callee":null},"307:3":{"kind":"call","span":{"start":[307,3],"end":[307,121],"bytes":[8916,9034]},"callee":null},"311:6":{"kind":"call","span":{"start":[311,6],"end":[311,18],"bytes":[9066,9078]},"callee":null},"312:12":{"kind":"call","span":{"start":[312,12],"end":[312,24],"bytes":[9096,9108]},"callee":null},"312:8":{"kind":"call","span":{"start":[312,8],"end":[312,34],"bytes":[9092,9118]},"callee":null},"316:13":{"kind":"call","span":{"start":[316,13],"end":[316,30],"bytes":[9203,9220]},"callee":null},"320:15":{"kind":"call","span":{"start":[320,15],"end":[320,59],"bytes":[9260,9304]},"callee":null},"322:11":{"kind":"call","span":{"start":[322,11],"end":[322,68],"bytes":[9333,9390]},"callee":null},"323:20":{"kind":"call","span":{"start":[323,20],"end":[323,49],"bytes":[9410,9439]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError"},"327:3":{"kind":"call","span":{"start":[327,3],"end":[327,81],"bytes":[9475,9553]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.Init":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","kind":"method","span":{"start":[113,1],"end":[178,2],"bytes":[3063,4679]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[113,1],"end":[113,64],"bytes":[3063,3126]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"114:2":{"kind":"call","span":{"start":[114,2],"end":[114,13],"bytes":[3128,3139]},"callee":null},"115:8":{"kind":"call","span":{"start":[115,8],"end":[115,21],"bytes":[3147,3160]},"callee":null},"123:10":{"kind":"call","span":{"start":[123,10],"end":[123,52],"bytes":[3267,3309]},"callee":null},"133:9":{"kind":"call","span":{"start":[133,9],"end":[133,32],"bytes":[3454,3477]},"callee":null},"137:9":{"kind":"call","span":{"start":[137,9],"end":[139,4],"bytes":[3566,3677]},"callee":null},"138:4":{"kind":"call","span":{"start":[138,4],"end":[138,78],"bytes":[3598,3672]},"callee":null},"142:9":{"kind":"call","span":{"start":[142,9],"end":[144,4],"bytes":[3747,3839]},"callee":null},"143:4":{"kind":"call","span":{"start":[143,4],"end":[143,59],"bytes":[3779,3834]},"callee":null},"148:8":{"kind":"call","span":{"start":[148,8],"end":[148,30],"bytes":[3872,3894]},"callee":null},"154:50":{"kind":"call","span":{"start":[154,50],"end":[154,89],"bytes":[4067,4106]},"callee":null},"154:7":{"kind":"call","span":{"start":[154,7],"end":[154,45],"bytes":[4024,4062]},"callee":null},"157:9":{"kind":"call","span":{"start":[157,9],"end":[157,35],"bytes":[4157,4183]},"callee":null},"161:13":{"kind":"call","span":{"start":[161,13],"end":[161,31],"bytes":[4222,4240]},"callee":null},"166:18":{"kind":"call","span":{"start":[166,18],"end":[168,5],"bytes":[4392,4475]},"callee":null},"171:18":{"kind":"call","span":{"start":[171,18],"end":[173,5],"bytes":[4520,4609]},"callee":null},"175:15":{"kind":"call","span":{"start":[175,15],"end":[175,52],"bytes":[4627,4664]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init/github.com/benbjohnson/litestream/oss.ReplicaClient.Init.closure_1","kind":"function","span":{"start":[166,1],"end":[168,5],"bytes":[4375,4475]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.Init.closure_1","parameters":[{"name":"o","type":"*github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss.UploaderOptions","span":{"start":[166,1],"end":[166,69],"bytes":[4375,4443]}}],"body":{}},"closure_2":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init/github.com/benbjohnson/litestream/oss.ReplicaClient.Init.closure_2","kind":"function","span":{"start":[171,1],"end":[173,5],"bytes":[4503,4609]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.Init.closure_2","parameters":[{"name":"o","type":"*github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss.UploaderOptions","span":{"start":[171,1],"end":[171,69],"bytes":[4503,4571]}}],"body":{}}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles","kind":"method","span":{"start":[185,1],"end":[190,2],"bytes":[5068,5316]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[185,1],"end":[185,126],"bytes":[5068,5193]}},{"name":"level","type":"int","span":{"start":[185,1],"end":[185,126],"bytes":[5068,5193]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[185,1],"end":[185,126],"bytes":[5068,5193]}},{"name":"useMetadata","type":"bool","span":{"start":[185,1],"end":[185,126],"bytes":[5068,5193]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"186:12":{"kind":"call","span":{"start":[186,12],"end":[186,23],"bytes":[5205,5216]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"189:9":{"kind":"call","span":{"start":[189,9],"end":[189,58],"bytes":[5260,5309]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator"}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[194,1],"end":[228,2],"bytes":[5423,6452]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"level","type":"int","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"offset","type":"int64","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"size","type":"int64","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"195:12":{"kind":"call","span":{"start":[195,12],"end":[195,23],"bytes":[5574,5585]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"200:14":{"kind":"call","span":{"start":[200,14],"end":[200,50],"bytes":[5672,5708]},"callee":null},"201:9":{"kind":"call","span":{"start":[201,9],"end":[201,35],"bytes":[5717,5743]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath"},"204:11":{"kind":"call","span":{"start":[204,11],"end":[204,28],"bytes":[5790,5807]},"callee":null},"205:11":{"kind":"call","span":{"start":[205,11],"end":[205,23],"bytes":[5819,5831]},"callee":null},"210:27":{"kind":"call","span":{"start":[210,27],"end":[210,46],"bytes":[5922,5941]},"callee":null},"211:19":{"kind":"call","span":{"start":[211,19],"end":[211,77],"bytes":[5960,6018]},"callee":null},"211:27":{"kind":"call","span":{"start":[211,27],"end":[211,76],"bytes":[5968,6017]},"callee":null},"213:27":{"kind":"call","span":{"start":[213,27],"end":[213,46],"bytes":[6069,6088]},"callee":null},"214:19":{"kind":"call","span":{"start":[214,19],"end":[214,60],"bytes":[6107,6148]},"callee":null},"214:27":{"kind":"call","span":{"start":[214,27],"end":[214,59],"bytes":[6115,6147]},"callee":null},"217:17":{"kind":"call","span":{"start":[217,17],"end":[217,49],"bytes":[6169,6201]},"callee":null},"219:6":{"kind":"call","span":{"start":[219,6],"end":[219,22],"bytes":[6224,6240]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.isNotExists"},"222:15":{"kind":"call","span":{"start":[222,15],"end":[222,61],"bytes":[6291,6337]},"callee":null},"225:2":{"kind":"call","span":{"start":[225,2],"end":[225,77],"bytes":[6343,6418]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.SetLogger":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.SetLogger","kind":"method","span":{"start":[85,1],"end":[87,2],"bytes":[2188,2294]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[85,1],"end":[85,57],"bytes":[2188,2244]}}],"metrics":{"cyclomatic":1},"body":{"86:13":{"kind":"call","span":{"start":[86,13],"end":[86,48],"bytes":[2257,2292]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.Type":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Type","kind":"method","span":{"start":[108,1],"end":[110,2],"bytes":[2921,2988]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[233,1],"end":[288,2],"bytes":[6668,8400]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}},{"name":"level","type":"int","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}},{"name":"r","type":"io.Reader","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"234:12":{"kind":"call","span":{"start":[234,12],"end":[234,23],"bytes":[6813,6824]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"240:15":{"kind":"call","span":{"start":[240,15],"end":[240,36],"bytes":[6970,6991]},"callee":null},"243:17":{"kind":"call","span":{"start":[243,17],"end":[243,42],"bytes":[7047,7072]},"callee":null},"245:15":{"kind":"call","span":{"start":[245,15],"end":[245,71],"bytes":[7104,7160]},"callee":null},"247:15":{"kind":"call","span":{"start":[247,15],"end":[247,44],"bytes":[7178,7207]},"callee":null},"250:32":{"kind":"call","span":{"start":[250,32],"end":[250,55],"bytes":[7292,7315]},"callee":null},"250:8":{"kind":"call","span":{"start":[250,8],"end":[250,56],"bytes":[7268,7316]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter"},"252:14":{"kind":"call","span":{"start":[252,14],"end":[252,50],"bytes":[7331,7367]},"callee":null},"253:9":{"kind":"call","span":{"start":[253,9],"end":[253,35],"bytes":[7376,7402]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath"},"257:25":{"kind":"call","span":{"start":[257,25],"end":[257,59],"bytes":[7529,7563]},"callee":null},"261:17":{"kind":"call","span":{"start":[261,17],"end":[265,8],"bytes":[7648,7784]},"callee":null},"262:13":{"kind":"call","span":{"start":[262,13],"end":[262,30],"bytes":[7710,7727]},"callee":null},"263:13":{"kind":"call","span":{"start":[263,13],"end":[263,25],"bytes":[7741,7753]},"callee":null},"267:15":{"kind":"call","span":{"start":[267,15],"end":[267,60],"bytes":[7816,7861]},"callee":null},"275:14":{"kind":"call","span":{"start":[275,14],"end":[275,20],"bytes":[8010,8016]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"},"279:2":{"kind":"call","span":{"start":[279,2],"end":[279,77],"bytes":[8047,8122]},"callee":null},"280:2":{"kind":"call","span":{"start":[280,2],"end":[280,77],"bytes":[8130,8205]},"callee":null},"280:82":{"kind":"call","span":{"start":[280,82],"end":[280,97],"bytes":[8210,8225]},"callee":null},"280:90":{"kind":"call","span":{"start":[280,90],"end":[280,96],"bytes":[8218,8224]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"},"284:15":{"kind":"call","span":{"start":[284,15],"end":[284,65],"bytes":[8326,8376]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","kind":"method","span":{"start":[389,1],"end":[391,2],"bytes":[10883,11016]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","parameters":[{"name":"level","type":"int","span":{"start":[389,1],"end":[389,69],"bytes":[10883,10951]}},{"name":"filename","type":"string","span":{"start":[389,1],"end":[389,69],"bytes":[10883,10951]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"390:24":{"kind":"call","span":{"start":[390,24],"end":[390,63],"bytes":[10975,11014]},"callee":null}}}},"fields":{"AccessKeyID":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/AccessKeyID","kind":"field","type":"string","span":{"start":[59,1],"end":[59,24],"bytes":[1489,1512]}},"AccessKeySecret":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/AccessKeySecret","kind":"field","type":"string","span":{"start":[60,1],"end":[60,24],"bytes":[1513,1536]}},"Bucket":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Bucket","kind":"field","type":"string","span":{"start":[64,1],"end":[64,17],"bytes":[1582,1598]}},"Concurrency":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Concurrency","kind":"field","type":"int","span":{"start":[70,1],"end":[70,72],"bytes":[1728,1799]}},"Endpoint":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Endpoint","kind":"field","type":"string","span":{"start":[66,1],"end":[66,17],"bytes":[1616,1632]}},"MetadataConcurrency":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/MetadataConcurrency","kind":"field","type":"int","span":{"start":[75,1],"end":[75,25],"bytes":[1973,1997]}},"PartSize":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/PartSize","kind":"field","type":"int64","span":{"start":[69,1],"end":[69,69],"bytes":[1659,1727]}},"Path":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[65,1],"end":[65,17],"bytes":[1599,1615]}},"Region":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Region","kind":"field","type":"string","span":{"start":[63,1],"end":[63,17],"bytes":[1565,1581]}},"client":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/client","kind":"field","type":"*github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss.Client","span":{"start":[54,1],"end":[54,22],"bytes":[1380,1401]}},"logger":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[56,1],"end":[56,23],"bytes":[1426,1448]}},"mu":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[53,1],"end":[53,21],"bytes":[1359,1379]}},"uploader":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/uploader","kind":"field","type":"*github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss.Uploader","span":{"start":[55,1],"end":[55,24],"bytes":[1402,1425]}}}},"fileIterator":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator","kind":"struct","span":{"start":[394,1],"end":[412,2],"bytes":[11080,11547]},"callables":{"github.com/benbjohnson/litestream/oss.fileIterator.Close":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Close","kind":"method","span":{"start":[509,1],"end":[513,2],"bytes":[14035,14132]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"511:2":{"kind":"call","span":{"start":[511,2],"end":[511,14],"bytes":[14102,14114]},"callee":null}}},"github.com/benbjohnson/litestream/oss.fileIterator.Err":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Err","kind":"method","span":{"start":[619,1],"end":[621,2],"bytes":[16662,16718]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/oss.fileIterator.Item":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Item","kind":"method","span":{"start":[614,1],"end":[616,2],"bytes":[16537,16603]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.Item","parameters":[],"return_type":"*github.com/superfly/ltx.FileInfo","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/oss.fileIterator.Next":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","kind":"method","span":{"start":[516,1],"end":[611,2],"bytes":[14213,16484]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":18},"body":{"522:2":{"kind":"call","span":{"start":[522,2],"end":[522,21],"bytes":[14346,14365]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator"},"527:42":{"kind":"call","span":{"start":[527,42],"end":[527,64],"bytes":[14496,14518]},"callee":null},"528:8":{"kind":"call","span":{"start":[528,8],"end":[528,31],"bytes":[14528,14551]},"callee":null},"533:20":{"kind":"call","span":{"start":[533,20],"end":[533,51],"bytes":[14613,14644]},"callee":null},"543:26":{"kind":"call","span":{"start":[543,26],"end":[543,48],"bytes":[14981,15003]},"callee":null},"544:13":{"kind":"call","span":{"start":[544,13],"end":[544,54],"bytes":[15022,15063]},"callee":null},"544:31":{"kind":"call","span":{"start":[544,31],"end":[544,53],"bytes":[15040,15062]},"callee":null},"547:14":{"kind":"call","span":{"start":[547,14],"end":[547,36],"bytes":[15146,15168]},"callee":null},"550:15":{"kind":"call","span":{"start":[550,15],"end":[550,43],"bytes":[15196,15224]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch"},"558:22":{"kind":"call","span":{"start":[558,22],"end":[558,44],"bytes":[15341,15363]},"callee":null},"568:11":{"kind":"call","span":{"start":[568,11],"end":[568,29],"bytes":[15537,15555]},"callee":null},"569:29":{"kind":"call","span":{"start":[569,29],"end":[569,51],"bytes":[15584,15606]},"callee":null},"595:23":{"kind":"call","span":{"start":[595,23],"end":[595,45],"bytes":[16207,16229]},"callee":null},"597:23":{"kind":"call","span":{"start":[597,23],"end":[597,33],"bytes":[16265,16275]},"callee":null},"601:23":{"kind":"call","span":{"start":[601,23],"end":[601,45],"bytes":[16355,16377]},"callee":null},"603:23":{"kind":"call","span":{"start":[603,23],"end":[603,33],"bytes":[16413,16423]},"callee":null}}},"github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch","kind":"method","span":{"start":[431,1],"end":[491,2],"bytes":[12043,13537]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch","parameters":[{"name":"keys","type":"[]string","span":{"start":[431,1],"end":[431,67],"bytes":[12043,12109]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"432:5":{"kind":"call","span":{"start":[432,5],"end":[432,14],"bytes":[12114,12123]},"callee":null},"443:13":{"kind":"call","span":{"start":[443,13],"end":[443,50],"bytes":[12377,12414]},"callee":null},"443:40":{"kind":"call","span":{"start":[443,40],"end":[443,49],"bytes":[12404,12413]},"callee":null},"447:31":{"kind":"call","span":{"start":[447,31],"end":[447,49],"bytes":[12543,12561]},"callee":null},"447:9":{"kind":"call","span":{"start":[447,9],"end":[447,50],"bytes":[12521,12562]},"callee":null},"448:12":{"kind":"call","span":{"start":[448,12],"end":[448,41],"bytes":[12574,12603]},"callee":null},"453:3":{"kind":"call","span":{"start":[453,3],"end":[479,5],"bytes":[12674,13380]},"callee":null},"482:12":{"kind":"call","span":{"start":[482,12],"end":[482,20],"bytes":[13396,13404]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1","kind":"function","span":{"start":[453,1],"end":[479,5],"bytes":[12672,13380]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1","parameters":[],"return_type":"error","error_channel":["error"],"body":{"455:14":{"kind":"call","span":{"start":[455,14],"end":[455,33],"bytes":[12773,12792]},"callee":null},"458:10":{"kind":"call","span":{"start":[458,10],"end":[458,24],"bytes":[12857,12871]},"callee":null},"460:17":{"kind":"call","span":{"start":[460,17],"end":[463,6],"bytes":[12889,13018]},"callee":null},"461:13":{"kind":"call","span":{"start":[461,13],"end":[461,39],"bytes":[12959,12985]},"callee":null},"462:13":{"kind":"call","span":{"start":[462,13],"end":[462,25],"bytes":[12999,13011]},"callee":null},"471:24":{"kind":"call","span":{"start":[471,24],"end":[471,56],"bytes":[13235,13267]},"callee":null},"472:7":{"kind":"call","span":{"start":[472,7],"end":[472,16],"bytes":[13288,13297]},"callee":null},"474:7":{"kind":"call","span":{"start":[474,7],"end":[474,18],"bytes":[13332,13343]},"callee":null}}}}},"github.com/benbjohnson/litestream/oss.fileIterator.initPaginator":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator","kind":"method","span":{"start":[494,1],"end":[506,2],"bytes":[13590,13954]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.initPaginator","parameters":[],"metrics":{"cyclomatic":2},"body":{"501:12":{"kind":"call","span":{"start":[501,12],"end":[501,45],"bytes":[13762,13795]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath"},"502:18":{"kind":"call","span":{"start":[502,18],"end":[505,4],"bytes":[13813,13952]},"callee":null},"503:11":{"kind":"call","span":{"start":[503,11],"end":[503,37],"bytes":[13894,13920]},"callee":null},"504:11":{"kind":"call","span":{"start":[504,11],"end":[504,26],"bytes":[13932,13947]},"callee":null}}}},"fields":{"cancel":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[396,1],"end":[396,27],"bytes":[11131,11157]}},"client":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/client","kind":"field","type":"*github.com/benbjohnson/litestream/oss.ReplicaClient","span":{"start":[397,1],"end":[397,23],"bytes":[11158,11180]}},"closed":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/closed","kind":"field","type":"bool","span":{"start":[409,1],"end":[409,13],"bytes":[11497,11509]}},"ctx":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/ctx","kind":"field","type":"context.Context","span":{"start":[395,1],"end":[395,24],"bytes":[11107,11130]}},"err":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/err","kind":"field","type":"error","span":{"start":[410,1],"end":[410,14],"bytes":[11510,11523]}},"info":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/info","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[411,1],"end":[411,22],"bytes":[11524,11545]}},"initialized":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/initialized","kind":"field","type":"bool","span":{"start":[407,1],"end":[407,18],"bytes":[11478,11495]}},"level":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/level","kind":"field","type":"int","span":{"start":[398,1],"end":[398,12],"bytes":[11181,11192]}},"metadataCache":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/metadataCache","kind":"field","type":"map[string]time.Time","span":{"start":[402,1],"end":[402,80],"bytes":[11301,11380]}},"page":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/page","kind":"field","type":"*github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss.ListObjectsV2Result","span":{"start":[405,1],"end":[405,38],"bytes":[11423,11460]}},"pageIndex":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/pageIndex","kind":"field","type":"int","span":{"start":[406,1],"end":[406,17],"bytes":[11461,11477]}},"paginator":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/paginator","kind":"field","type":"*github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss.ListObjectsV2Paginator","span":{"start":[404,1],"end":[404,41],"bytes":[11382,11422]}},"seek":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/seek","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[399,1],"end":[399,17],"bytes":[11193,11209]}},"useMetadata":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/useMetadata","kind":"field","type":"bool","span":{"start":[401,1],"end":[401,90],"bytes":[11211,11300]}}}}},"functions":{"github.com/benbjohnson/litestream/oss.NewReplicaClient":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","kind":"function","span":{"start":[79,1],"end":[83,2],"bytes":[2062,2186]},"signature":"github.com/benbjohnson/litestream/oss.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/oss.ReplicaClient","metrics":{"cyclomatic":1},"body":{"81:11":{"kind":"call","span":{"start":[81,11],"end":[81,25],"bytes":[2137,2151]},"callee":null}}},"github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","kind":"function","span":{"start":[92,1],"end":[105,2],"bytes":[2491,2877]},"signature":"github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}},{"name":"host","type":"string","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}},{"name":"urlPath","type":"string","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}},{"name":"query","type":"net/url.Values","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"93:12":{"kind":"call","span":{"start":[93,12],"end":[93,30],"bytes":[2639,2657]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient"},"95:23":{"kind":"call","span":{"start":[95,23],"end":[95,38],"bytes":[2681,2696]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost"},"97:15":{"kind":"call","span":{"start":[97,15],"end":[97,64],"bytes":[2730,2779]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ParseHost":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","kind":"function","span":{"start":[649,1],"end":[670,2],"bytes":[17421,17991]},"signature":"github.com/benbjohnson/litestream/oss.ParseHost","parameters":[{"name":"host","type":"string","span":{"start":[649,1],"end":[649,64],"bytes":[17421,17484]}}],"return_type":"(string, string, string)","metrics":{"cyclomatic":5},"body":{"651:10":{"kind":"call","span":{"start":[651,10],"end":[651,51],"bytes":[17562,17603]},"callee":null},"651:53":{"kind":"call","span":{"start":[651,53],"end":[651,59],"bytes":[17605,17611]},"callee":null},"653:6":{"kind":"call","span":{"start":[653,6],"end":[653,12],"bytes":[17639,17645]},"callee":null},"660:10":{"kind":"call","span":{"start":[660,10],"end":[660,43],"bytes":[17766,17799]},"callee":null},"660:45":{"kind":"call","span":{"start":[660,45],"end":[660,51],"bytes":[17801,17807]},"callee":null},"662:6":{"kind":"call","span":{"start":[662,6],"end":[662,12],"bytes":[17835,17841]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ParseURL":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL","kind":"function","span":{"start":[624,1],"end":[642,2],"bytes":[16780,17200]},"signature":"github.com/benbjohnson/litestream/oss.ParseURL","parameters":[{"name":"s","type":"string","span":{"start":[624,1],"end":[624,66],"bytes":[16780,16845]}}],"return_type":"(string, string, string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"625:12":{"kind":"call","span":{"start":[625,12],"end":[625,24],"bytes":[16857,16869]},"callee":null},"631:22":{"kind":"call","span":{"start":[631,22],"end":[631,59],"bytes":[16961,16998]},"callee":null},"635:22":{"kind":"call","span":{"start":[635,22],"end":[635,39],"bytes":[17068,17085]},"callee":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost"},"640:8":{"kind":"call","span":{"start":[640,8],"end":[640,39],"bytes":[17134,17165]},"callee":null}}},"github.com/benbjohnson/litestream/oss.deleteResultError":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","kind":"function","span":{"start":[691,1],"end":[726,2],"bytes":[18772,19594]},"signature":"github.com/benbjohnson/litestream/oss.deleteResultError","parameters":[{"name":"requested","type":"[]github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss.DeleteObject","span":{"start":[691,1],"end":[691,99],"bytes":[18772,18870]}},{"name":"out","type":"*github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss.DeleteMultipleObjectsResult","span":{"start":[691,1],"end":[691,99],"bytes":[18772,18870]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"697:13":{"kind":"call","span":{"start":[697,13],"end":[697,63],"bytes":[18964,19014]},"callee":null},"697:39":{"kind":"call","span":{"start":[697,39],"end":[697,62],"bytes":[18990,19013]},"callee":null},"711:13":{"kind":"call","span":{"start":[711,13],"end":[711,37],"bytes":[19311,19335]},"callee":null},"715:5":{"kind":"call","span":{"start":[715,5],"end":[715,16],"bytes":[19348,19359]},"callee":null},"721:2":{"kind":"call","span":{"start":[721,2],"end":[721,47],"bytes":[19452,19497]},"callee":null},"723:3":{"kind":"call","span":{"start":[723,3],"end":[723,31],"bytes":[19530,19558]},"callee":null},"725:20":{"kind":"call","span":{"start":[725,20],"end":[725,30],"bytes":[19581,19591]},"callee":null},"725:9":{"kind":"call","span":{"start":[725,9],"end":[725,31],"bytes":[19570,19592]},"callee":null}}},"github.com/benbjohnson/litestream/oss.init":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.init","kind":"function","span":{"start":[28,1],"end":[30,2],"bytes":[431,519]},"signature":"github.com/benbjohnson/litestream/oss.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"29:2":{"kind":"call","span":{"start":[29,2],"end":[29,73],"bytes":[446,517]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/oss.isNotExists":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.isNotExists","kind":"function","span":{"start":[680,1],"end":[686,2],"bytes":[18410,18571]},"signature":"github.com/benbjohnson/litestream/oss.isNotExists","parameters":[{"name":"err","type":"error","span":{"start":[680,1],"end":[680,35],"bytes":[18410,18444]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"682:5":{"kind":"call","span":{"start":[682,5],"end":[682,32],"bytes":[18483,18510]},"callee":null}}},"github.com/benbjohnson/litestream/oss.newFileIterator":{"id":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator","kind":"function","span":{"start":[414,1],"end":[428,2],"bytes":[11549,11949]},"signature":"github.com/benbjohnson/litestream/oss.newFileIterator","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}},{"name":"client","type":"*github.com/benbjohnson/litestream/oss.ReplicaClient","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}},{"name":"level","type":"int","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}},{"name":"useMetadata","type":"bool","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}}],"return_type":"*github.com/benbjohnson/litestream/oss.fileIterator","metrics":{"cyclomatic":1},"body":{"415:17":{"kind":"call","span":{"start":[415,17],"end":[415,40],"bytes":[11690,11713]},"callee":null},"424:18":{"kind":"call","span":{"start":[424,18],"end":[424,44],"bytes":[11904,11930]},"callee":null}}}},"content_hash":"c4aa5689e4bfc9330f1ff5f76ce0208a37895f43f5de7ca9427f243d3f037e17"},"replica.go":{"id":"can://go/litestream/replica.go","kind":"module","span":{"start":[1,1],"end":[1847,1],"bytes":[0,54263]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"crypto/rand\"\n\t\"database/sql\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/semaphore\"\n\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// Default replica settings.\nconst (\n\tDefaultSyncInterval = 1 * time.Second\n\tDefaultMaxSyncLTXFiles = 256\n)\n\nvar errReplicaWaitForData = errors.New(\"no position, waiting for data\")\n\n// Replica connects a database to a replication destination via a ReplicaClient.\n// The replica manages periodic synchronization and maintaining the current\n// replica position.\ntype Replica struct {\n\tdb *DB\n\n\tmu sync.RWMutex\n\tpos ltx.Pos // current replicated position\n\n\tsyncSem *semaphore.Weighted\n\tsyncWaiters atomic.Int64 // diagnostic instrumentation: goroutines queued on syncSem\n\n\tmuf sync.Mutex\n\tf *os.File // long-running file descriptor to avoid non-OFD lock issues\n\n\twg sync.WaitGroup\n\tcancel func()\n\n\t// Client used to connect to the remote replica.\n\tClient ReplicaClient\n\n\t// Time between syncs with the shadow WAL.\n\tSyncInterval time.Duration\n\n\t// Maximum L0 files to upload in a single monitor sync batch.\n\t// Set to zero to process all pending L0 files in one batch.\n\tMaxSyncLTXFiles int\n\n\t// If true, replica monitors database for changes automatically.\n\t// Set to false if replica is being used synchronously (such as in tests).\n\tMonitorEnabled bool\n\n\t// If true, automatically reset local state when LTX errors are detected.\n\t// This allows recovery from corrupted/missing LTX files by resetting\n\t// the position file and removing local LTX files, forcing a fresh sync.\n\t// Disabled by default to prevent silent data loss scenarios.\n\tAutoRecoverEnabled bool\n}\n\nfunc NewReplica(db *DB) *Replica {\n\tr := \u0026Replica{\n\t\tdb: db,\n\t\tsyncSem: semaphore.NewWeighted(1),\n\t\tcancel: func() {},\n\n\t\tSyncInterval: DefaultSyncInterval,\n\t\tMaxSyncLTXFiles: DefaultMaxSyncLTXFiles,\n\t\tMonitorEnabled: true,\n\t}\n\n\treturn r\n}\n\nfunc NewReplicaWithClient(db *DB, client ReplicaClient) *Replica {\n\tr := NewReplica(db)\n\tr.Client = client\n\treturn r\n}\n\n// Logger returns the DB sub-logger for this replica.\nfunc (r *Replica) Logger() *slog.Logger {\n\tlogger := slog.Default()\n\tif r.db != nil {\n\t\tlogger = r.db.Logger\n\t}\n\treturn logger.With(\"replica\", r.Client.Type())\n}\n\n// DB returns a reference to the database the replica is attached to, if any.\nfunc (r *Replica) DB() *DB { return r.db }\n\n// Starts replicating in a background goroutine.\nfunc (r *Replica) Start(ctx context.Context) error {\n\t// Ignore if replica is being used sychronously.\n\tif !r.MonitorEnabled {\n\t\treturn nil\n\t}\n\n\t// Stop previous replication.\n\tr.Stop(false)\n\n\t// Wrap context with cancelation.\n\tctx, r.cancel = context.WithCancel(ctx)\n\n\t// Start goroutine to replicate data.\n\tr.wg.Add(1)\n\tgo func() { defer r.wg.Done(); r.monitor(ctx) }()\n\n\treturn nil\n}\n\n// Stop cancels any outstanding replication and blocks until finished.\n//\n// Performing a hard stop will close the DB file descriptor which could release\n// locks on per-process locks. Hard stops should only be performed when\n// stopping the entire process.\nfunc (r *Replica) Stop(hard bool) (err error) {\n\tr.cancel()\n\tr.wg.Wait()\n\n\tr.muf.Lock()\n\tdefer r.muf.Unlock()\n\tif hard \u0026\u0026 r.f != nil {\n\t\tif e := r.f.Close(); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\treturn err\n}\n\n// Sync copies new WAL frames from the shadow WAL to the replica client.\n// Only one Sync can run at a time to prevent concurrent uploads of the same file.\nfunc (r *Replica) Sync(ctx context.Context) (err error) {\n\treturn r.sync(ctx, 0)\n}\n\nfunc (r *Replica) sync(ctx context.Context, maxSyncLTXFiles int) error {\n\tfor {\n\t\tresult, err := r.syncOnce(ctx, maxSyncLTXFiles)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t} else if !result.limited {\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\ntype replicaSyncResult struct {\n\tsynced bool\n\tlimited bool\n}\n\nfunc (r *Replica) syncOnce(ctx context.Context, maxSyncLTXFiles int) (result replicaSyncResult, err error) {\n\tif err := r.lockSync(ctx); err != nil {\n\t\treturn result, err\n\t}\n\tdefer r.syncSem.Release(1)\n\n\t// Clear last position if if an error occurs during sync.\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tr.mu.Lock()\n\t\t\tr.pos = ltx.Pos{}\n\t\t\tr.mu.Unlock()\n\t\t}\n\t}()\n\n\tif err := ctx.Err(); err != nil {\n\t\treturn result, context.Cause(ctx)\n\t}\n\n\t// Calculate current replica position, if unknown.\n\tif r.Pos().IsZero() {\n\t\tpos, err := r.calcPos(ctx)\n\t\tif err != nil {\n\t\t\treturn result, fmt.Errorf(\"calc pos: %w\", err)\n\t\t}\n\t\tr.SetPos(pos)\n\t}\n\n\t// Find current position of database.\n\tdpos, err := r.db.Pos()\n\tif err != nil {\n\t\treturn result, fmt.Errorf(\"cannot determine current position: %w\", err)\n\t} else if dpos.IsZero() {\n\t\treturn result, errReplicaWaitForData\n\t}\n\n\tr.Logger().Debug(\"replica sync\",\n\t\tslog.Group(\"txid\",\n\t\t\tslog.String(\"replica\", r.Pos().TXID.String()),\n\t\t\tslog.String(\"db\", dpos.TXID.String()),\n\t\t))\n\n\t// Replicate all L0 LTX files since last replica position.\n\tfor txID, syncedFileN := r.Pos().TXID+1, 0; txID \u003c= dpos.TXID; txID = r.Pos().TXID + 1 {\n\t\tif maxSyncLTXFiles \u003e 0 \u0026\u0026 syncedFileN \u003e= maxSyncLTXFiles {\n\t\t\tresult.limited = true\n\t\t\t// Uploads succeeded, so record sync health; otherwise a\n\t\t\t// sustained backlog reads as unhealthy while progressing.\n\t\t\tr.db.RecordSuccessfulSync()\n\t\t\tr.Logger().Debug(\"replica sync limited\",\n\t\t\t\t\"synced_files\", syncedFileN,\n\t\t\t\t\"db_txid\", dpos.TXID.String(),\n\t\t\t\t\"replica_txid\", r.Pos().TXID.String())\n\t\t\treturn result, nil\n\t\t}\n\t\tif err := ctx.Err(); err != nil {\n\t\t\treturn result, context.Cause(ctx)\n\t\t}\n\t\tif err := r.uploadLTXFile(ctx, 0, txID, txID); err != nil {\n\t\t\treturn result, err\n\t\t}\n\t\tr.SetPos(ltx.Pos{TXID: txID})\n\t\tresult.synced = true\n\t\tsyncedFileN++\n\t}\n\n\t// Record successful sync for heartbeat monitoring.\n\tr.db.RecordSuccessfulSync()\n\n\treturn result, nil\n}\n\nfunc (r *Replica) lockSync(ctx context.Context) error {\n\tif r.syncSem.TryAcquire(1) {\n\t\treturn nil\n\t}\n\tr.syncWaiters.Add(1)\n\tdefer r.syncWaiters.Add(-1)\n\tif err := r.syncSem.Acquire(ctx, 1); err != nil {\n\t\treturn fmt.Errorf(\"wait for replica sync: %w\", context.Cause(ctx))\n\t}\n\treturn nil\n}\n\nfunc (r *Replica) uploadLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID) (err error) {\n\tfilename := r.db.LTXPath(level, minTXID, maxTXID)\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\treturn NewLTXError(\"open\", filename, level, uint64(minTXID), uint64(maxTXID), err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tinfo, err := r.Client.WriteLTXFile(ctx, level, minTXID, maxTXID, f)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"write ltx file: %w\", err)\n\t}\n\tr.Logger().Debug(\"ltx file uploaded\",\n\t\t\"level\", info.Level,\n\t\t\"minTXID\", info.MinTXID,\n\t\t\"maxTXID\", info.MaxTXID,\n\t\t\"size\", info.Size)\n\n\t// Track current position\n\t//replicaWALIndexGaugeVec.WithLabelValues(r.db.Path(), r.Name()).Set(float64(rd.Pos().Index))\n\t//replicaWALOffsetGaugeVec.WithLabelValues(r.db.Path(), r.Name()).Set(float64(rd.Pos().Offset))\n\n\treturn nil\n}\n\n// calcPos returns the last position saved to the replica for level 0.\nfunc (r *Replica) calcPos(ctx context.Context) (pos ltx.Pos, err error) {\n\tinfo, err := r.MaxLTXFileInfo(ctx, 0)\n\tif err != nil {\n\t\treturn pos, fmt.Errorf(\"max ltx file: %w\", err)\n\t}\n\treturn ltx.Pos{TXID: info.MaxTXID}, nil\n}\n\n// MaxLTXFileInfo returns metadata about the last LTX file for a given level.\n// Returns nil if no files exist for the level.\nfunc (r *Replica) MaxLTXFileInfo(ctx context.Context, level int) (info ltx.FileInfo, err error) {\n\t// Normal operation - use fast timestamps\n\titr, err := r.Client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn info, err\n\t}\n\tdefer itr.Close()\n\n\tfor itr.Next() {\n\t\titem := itr.Item()\n\t\tif item.MaxTXID \u003e info.MaxTXID {\n\t\t\tinfo = *item\n\t\t}\n\t}\n\treturn info, itr.Close()\n}\n\n// Pos returns the current replicated position.\n// Returns a zero value if the current position cannot be determined.\nfunc (r *Replica) Pos() ltx.Pos {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\treturn r.pos\n}\n\n// SetPos sets the current replicated position.\nfunc (r *Replica) SetPos(pos ltx.Pos) {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tr.pos = pos\n}\n\n// EnforceRetention forces a new snapshot once the retention interval has passed.\n// Older snapshots and WAL files are then removed.\nfunc (r *Replica) EnforceRetention(ctx context.Context) (err error) {\n\tpanic(\"TODO(ltx): Re-implement after multi-level compaction\")\n\n\t/*\n\t\t// Obtain list of snapshots that are within the retention period.\n\t\tsnapshots, err := r.Snapshots(ctx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"snapshots: %w\", err)\n\t\t}\n\t\tretained := FilterSnapshotsAfter(snapshots, time.Now().Add(-r.Retention))\n\n\t\t// If no retained snapshots exist, create a new snapshot.\n\t\tif len(retained) == 0 {\n\t\t\tsnapshot, err := r.Snapshot(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"snapshot: %w\", err)\n\t\t\t}\n\t\t\tretained = append(retained, snapshot)\n\t\t}\n\n\t\t// Delete unretained snapshots \u0026 WAL files.\n\t\tsnapshot := FindMinSnapshot(retained)\n\n\t\t// Otherwise remove all earlier snapshots \u0026 WAL segments.\n\t\tif err := r.deleteSnapshotsBeforeIndex(ctx, snapshot.Index); err != nil {\n\t\t\treturn fmt.Errorf(\"delete snapshots before index: %w\", err)\n\t\t} else if err := r.deleteWALSegmentsBeforeIndex(ctx, snapshot.Index); err != nil {\n\t\t\treturn fmt.Errorf(\"delete wal segments before index: %w\", err)\n\t\t}\n\n\t\treturn nil\n\t*/\n}\n\n/*\nfunc (r *Replica) deleteBeforeTXID(ctx context.Context, level int, txID ltx.TXID) error {\n\titr, err := r.Client.LTXFiles(ctx, level)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar a []*ltx.FileInfo\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tif info.MinTXID \u003e= txID {\n\t\t\tcontinue\n\t\t}\n\t\ta = append(a, info)\n\t}\n\tif err := itr.Close(); err != nil {\n\t\treturn err\n\t}\n\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\n\tif err := r.Client.DeleteLTXFiles(ctx, a); err != nil {\n\t\treturn fmt.Errorf(\"delete wal segments: %w\", err)\n\t}\n\n\tr.Logger().Info(\"ltx files deleted before\",\n\t\tslog.Int(\"level\", level),\n\t\tslog.String(\"txID\", txID.String()),\n\t\tslog.Int(\"n\", len(a)))\n\n\treturn nil\n}\n*/\n\n// monitor runs in a separate goroutine and continuously replicates the DB.\n// Implements exponential backoff on repeated sync errors to prevent log spam\n// and reduce load when persistent errors occur. See issue #927.\nfunc (r *Replica) monitor(ctx context.Context) {\n\tticker := time.NewTicker(r.SyncInterval)\n\tdefer ticker.Stop()\n\n\tnotify := r.db.Notify()\n\n\tvar backoff time.Duration\n\tvar lastLogTime time.Time\n\tvar consecutiveErrs int\n\n\tfor initial := true; ; initial = false {\n\t\t// Enforce a minimum time between synchronization.\n\t\tif !initial {\n\t\t\tselect {\n\t\t\tcase \u003c-ctx.Done():\n\t\t\t\treturn\n\t\t\tcase \u003c-ticker.C:\n\t\t\t}\n\t\t}\n\n\t\t// If in backoff mode, wait additional time before retrying.\n\t\tif backoff \u003e 0 {\n\t\t\tselect {\n\t\t\tcase \u003c-ctx.Done():\n\t\t\t\treturn\n\t\t\tcase \u003c-time.After(backoff):\n\t\t\t}\n\t\t}\n\n\t\t// If the position is unavailable, skip the wait so Sync() surfaces\n\t\t// the error to the backoff \u0026 auto-recovery handling below.\n\t\tif pos, err := r.db.Pos(); err == nil \u0026\u0026 pos.TXID \u003c= r.Pos().TXID {\n\t\t\t// Wait for new data, but still sync on an interval so idle\n\t\t\t// databases continue recording sync health for heartbeats.\n\t\t\tselect {\n\t\t\tcase \u003c-ctx.Done():\n\t\t\t\treturn\n\t\t\tcase \u003c-ticker.C:\n\t\t\tcase \u003c-notify:\n\t\t\t}\n\t\t} else if ctx.Err() != nil {\n\t\t\treturn\n\t\t}\n\n\t\t// Fetch new notify channel before replicating data.\n\t\tnotify = r.db.Notify()\n\n\t\t// Synchronize the shadow wal into the replication directory.\n\t\tif err := r.sync(ctx, r.MaxSyncLTXFiles); err != nil {\n\t\t\tif errors.Is(err, errReplicaWaitForData) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Don't log context cancellation errors during shutdown\n\t\t\tif !isShutdownError(ctx, err) {\n\t\t\t\tconsecutiveErrs++\n\n\t\t\t\t// Exponential backoff: SyncInterval -\u003e 2x -\u003e 4x -\u003e ... -\u003e max\n\t\t\t\tif backoff == 0 {\n\t\t\t\t\tbackoff = r.SyncInterval\n\t\t\t\t} else {\n\t\t\t\t\tbackoff *= 2\n\t\t\t\t\tif backoff \u003e DefaultSyncBackoffMax {\n\t\t\t\t\t\tbackoff = DefaultSyncBackoffMax\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check for LTX errors and include recovery hints\n\t\t\t\tvar ltxErr *LTXError\n\t\t\t\tif errors.As(err, \u0026ltxErr) {\n\t\t\t\t\t// Log with rate limiting to avoid log spam during persistent errors.\n\t\t\t\t\tif time.Since(lastLogTime) \u003e= SyncErrorLogInterval {\n\t\t\t\t\t\tif ltxErr.Hint != \"\" {\n\t\t\t\t\t\t\tr.Logger().Error(\"monitor error\",\n\t\t\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\t\t\"path\", ltxErr.Path,\n\t\t\t\t\t\t\t\t\"hint\", ltxErr.Hint,\n\t\t\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\t\t\"backoff\", backoff)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tr.Logger().Error(\"monitor error\",\n\t\t\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\t\t\"path\", ltxErr.Path,\n\t\t\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\t\t\"backoff\", backoff)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastLogTime = time.Now()\n\t\t\t\t\t}\n\n\t\t\t\t\t// Attempt auto-recovery only for missing/corrupt LTX files.\n\t\t\t\t\t// Transient OS errors (EMFILE, EIO, EACCES) should retry\n\t\t\t\t\t// with backoff rather than destructively resetting state.\n\t\t\t\t\tif r.AutoRecoverEnabled \u0026\u0026 ltxErr.IsAutoRecoverable() {\n\t\t\t\t\t\tr.Logger().Warn(\"auto-recovery enabled, resetting local state\")\n\t\t\t\t\t\tif resetErr := r.db.ResetLocalState(ctx); resetErr != nil {\n\t\t\t\t\t\t\tr.Logger().Error(\"auto-recovery failed\", \"error\", resetErr)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tr.Logger().Info(\"auto-recovery complete, resuming replication\")\n\t\t\t\t\t\t\t// Reset backoff after successful recovery\n\t\t\t\t\t\t\tbackoff = 0\n\t\t\t\t\t\t\tconsecutiveErrs = 0\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Log with rate limiting to avoid log spam during persistent errors.\n\t\t\t\t\tif time.Since(lastLogTime) \u003e= SyncErrorLogInterval {\n\t\t\t\t\t\tr.Logger().Error(\"monitor error\",\n\t\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\t\"backoff\", backoff)\n\t\t\t\t\t\tlastLogTime = time.Now()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Success - reset backoff and error counter.\n\t\tif consecutiveErrs \u003e 0 {\n\t\t\tr.Logger().Info(\"replica sync recovered\", \"previous_errors\", consecutiveErrs)\n\t\t}\n\t\tbackoff = 0\n\t\tconsecutiveErrs = 0\n\t}\n}\n\n// CreatedAt returns the earliest creation time of any LTX file.\n// Returns zero time if no LTX files exist.\nfunc (r *Replica) CreatedAt(ctx context.Context) (time.Time, error) {\n\tvar min time.Time\n\n\t// Normal operation - use fast timestamps\n\titr, err := r.Client.LTXFiles(ctx, 0, 0, false)\n\tif err != nil {\n\t\treturn min, err\n\t}\n\tdefer itr.Close()\n\n\tif itr.Next() {\n\t\tmin = itr.Item().CreatedAt\n\t}\n\treturn min, itr.Close()\n}\n\n// TimeBounds returns the creation time \u0026 last updated time.\n// Returns zero time if no LTX files exist.\nfunc (r *Replica) TimeBounds(ctx context.Context) (createdAt, updatedAt time.Time, err error) {\n\tfor level := SnapshotLevel; level \u003e= 0; level-- {\n\t\titr, err := r.Client.LTXFiles(ctx, level, 0, false)\n\t\tif err != nil {\n\t\t\treturn createdAt, updatedAt, err\n\t\t}\n\n\t\tfor itr.Next() {\n\t\t\tinfo := itr.Item()\n\t\t\tif createdAt.IsZero() || info.CreatedAt.Before(createdAt) {\n\t\t\t\tcreatedAt = info.CreatedAt\n\t\t\t}\n\t\t\tif updatedAt.IsZero() || info.CreatedAt.After(updatedAt) {\n\t\t\t\tupdatedAt = info.CreatedAt\n\t\t\t}\n\t\t}\n\t\tif err := itr.Close(); err != nil {\n\t\t\treturn createdAt, updatedAt, err\n\t\t}\n\t}\n\treturn createdAt, updatedAt, nil\n}\n\n// CalcRestoreTarget returns a target time restore from.\nfunc (r *Replica) CalcRestoreTarget(ctx context.Context, opt RestoreOptions) (updatedAt time.Time, err error) {\n\t// Determine the replicated time bounds from LTX files.\n\tcreatedAt, updatedAt, err := r.TimeBounds(ctx)\n\tif err != nil {\n\t\treturn time.Time{}, fmt.Errorf(\"created at: %w\", err)\n\t}\n\n\t// Also check v0.3.x time bounds if client supports it.\n\tif client, ok := r.Client.(ReplicaClientV3); ok {\n\t\tv3CreatedAt, v3UpdatedAt, err := r.TimeBoundsV3(ctx, client)\n\t\tif err != nil {\n\t\t\treturn time.Time{}, fmt.Errorf(\"v0.3.x time bounds: %w\", err)\n\t\t}\n\t\t// Extend time bounds to include v0.3.x backups.\n\t\tif !v3CreatedAt.IsZero() \u0026\u0026 (createdAt.IsZero() || v3CreatedAt.Before(createdAt)) {\n\t\t\tcreatedAt = v3CreatedAt\n\t\t}\n\t\tif !v3UpdatedAt.IsZero() \u0026\u0026 (updatedAt.IsZero() || v3UpdatedAt.After(updatedAt)) {\n\t\t\tupdatedAt = v3UpdatedAt\n\t\t}\n\t}\n\n\t// Skip if it does not contain timestamp.\n\tif !opt.Timestamp.IsZero() {\n\t\tif createdAt.IsZero() \u0026\u0026 updatedAt.IsZero() {\n\t\t\treturn time.Time{}, fmt.Errorf(\"no backups found\")\n\t\t}\n\t\tif opt.Timestamp.Before(createdAt) || opt.Timestamp.After(updatedAt) {\n\t\t\treturn time.Time{}, fmt.Errorf(\"timestamp does not exist\")\n\t\t}\n\t}\n\n\treturn updatedAt, nil\n}\n\n// Replica restores the database from a replica based on the options given.\n// This method will restore into opt.OutputPath, if specified, or into the\n// DB's original database path. It can optionally restore from a specific\n// replica or it will automatically choose the best one. Finally,\n// a timestamp can be specified to restore the database to a specific\n// point-in-time.\n//\n// When the replica contains both v0.3.x and LTX format backups, this method\n// compares snapshots from both formats and uses whichever has the better backup:\n// - With timestamp: uses the format with the most recent snapshot before timestamp\n// - Without timestamp: uses the format with the most recent backup overall\nfunc (r *Replica) Restore(ctx context.Context, opt RestoreOptions) (err error) {\n\t// Validate options.\n\tif opt.OutputPath == \"\" {\n\t\treturn fmt.Errorf(\"output path required\")\n\t} else if opt.TXID != 0 \u0026\u0026 !opt.Timestamp.IsZero() {\n\t\treturn fmt.Errorf(\"cannot specify index \u0026 timestamp to restore\")\n\t} else if opt.Follow \u0026\u0026 opt.TXID != 0 {\n\t\treturn fmt.Errorf(\"cannot use follow mode with -txid\")\n\t} else if opt.Follow \u0026\u0026 !opt.Timestamp.IsZero() {\n\t\treturn fmt.Errorf(\"cannot use follow mode with -timestamp\")\n\t} else if opt.IntegrityCheck != IntegrityCheckNone \u0026\u0026 opt.IntegrityCheck != IntegrityCheckQuick \u0026\u0026 opt.IntegrityCheck != IntegrityCheckFull {\n\t\treturn fmt.Errorf(\"unsupported integrity check mode: %d\", opt.IntegrityCheck)\n\t}\n\n\t// In follow mode, if the database already exists, attempt crash recovery\n\t// by reading the last applied TXID from the sidecar file.\n\tif opt.Follow {\n\t\tif _, statErr := os.Stat(opt.OutputPath); statErr == nil {\n\t\t\ttxid, readErr := ReadTXIDFile(opt.OutputPath)\n\t\t\tif readErr != nil {\n\t\t\t\treturn fmt.Errorf(\"read txid file for crash recovery: %w\", readErr)\n\t\t\t}\n\t\t\tif txid == 0 {\n\t\t\t\treturn fmt.Errorf(\"cannot resume follow mode: database exists but no -txid file found; delete the database to re-restore: %s\", opt.OutputPath)\n\t\t\t}\n\t\t\t// Validate saved TXID is still reachable. If the earliest snapshot\n\t\t\t// starts after our saved TXID, retention has pruned the history\n\t\t\t// and we can't catch up incrementally.\n\t\t\tsnapshotItr, itrErr := r.Client.LTXFiles(ctx, SnapshotLevel, 0, false)\n\t\t\tif itrErr != nil {\n\t\t\t\treturn fmt.Errorf(\"cannot validate saved TXID for crash recovery: %w\", itrErr)\n\t\t\t}\n\n\t\t\tvar latestSnapshot *ltx.FileInfo\n\t\t\tfor snapshotItr.Next() {\n\t\t\t\tlatestSnapshot = snapshotItr.Item()\n\t\t\t}\n\t\t\tif err := snapshotItr.Err(); err != nil {\n\t\t\t\t_ = snapshotItr.Close()\n\t\t\t\treturn fmt.Errorf(\"iterate snapshots for crash recovery validation: %w\", err)\n\t\t\t}\n\t\t\t_ = snapshotItr.Close()\n\n\t\t\tif latestSnapshot != nil {\n\t\t\t\tif latestSnapshot.MinTXID \u003e txid {\n\t\t\t\t\treturn fmt.Errorf(\"cannot resume follow mode: saved TXID %s is behind the earliest snapshot (min TXID %s); replica history has been pruned -- delete %s and %s-txid to re-restore\", txid, latestSnapshot.MinTXID, opt.OutputPath, opt.OutputPath)\n\t\t\t\t}\n\t\t\t\tif txid \u003e latestSnapshot.MaxTXID {\n\t\t\t\t\treturn fmt.Errorf(\"cannot resume follow mode: saved TXID %s is ahead of latest snapshot (max TXID %s); delete %s and %s-txid to re-restore\", txid, latestSnapshot.MaxTXID, opt.OutputPath, opt.OutputPath)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tr.Logger().Info(\"resuming follow mode from crash recovery\", \"txid\", txid, \"output\", opt.OutputPath)\n\t\t\treturn r.follow(ctx, opt.OutputPath, txid, opt.FollowInterval)\n\t\t}\n\t}\n\n\t// Ensure output path does not already exist.\n\tif _, err := os.Stat(opt.OutputPath); err == nil {\n\t\treturn fmt.Errorf(\"cannot restore, output path already exists: %s\", opt.OutputPath)\n\t} else if !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\n\t// Compare v0.3.x and LTX formats to find the best backup (unless TXID is specified).\n\t// Skip V3 format when follow mode is enabled (V3 doesn't support incremental following).\n\tif opt.TXID == 0 \u0026\u0026 !opt.Follow {\n\t\tif client, ok := r.Client.(ReplicaClientV3); ok {\n\t\t\tuseV3, err := r.shouldUseV3Restore(ctx, client, opt.Timestamp)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif useV3 {\n\t\t\t\treturn r.RestoreV3(ctx, opt)\n\t\t\t}\n\t\t}\n\t}\n\n\tinfos, err := CalcRestorePlan(ctx, r.Client, opt.TXID, opt.Timestamp, r.Logger())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot calc restore plan: %w\", err)\n\t}\n\n\tr.Logger().Debug(\"restore plan\", \"n\", len(infos), \"txid\", infos[len(infos)-1].MaxTXID, \"timestamp\", infos[len(infos)-1].CreatedAt)\n\n\trdrs := make([]io.Reader, 0, len(infos))\n\tdefer func() {\n\t\tfor _, rd := range rdrs {\n\t\t\tif closer, ok := rd.(io.Closer); ok {\n\t\t\t\t_ = closer.Close()\n\t\t\t}\n\t\t}\n\t}()\n\n\tfor _, info := range infos {\n\t\t// Validate file size - must be at least header size to be readable\n\t\tif info.Size \u003c ltx.HeaderSize {\n\t\t\treturn fmt.Errorf(\"invalid ltx file: level=%d min=%s max=%s has size %d bytes (minimum %d)\",\n\t\t\t\tinfo.Level, info.MinTXID, info.MaxTXID, info.Size, ltx.HeaderSize)\n\t\t}\n\n\t\tr.Logger().Debug(\"opening ltx file for restore\", \"level\", info.Level, \"min\", info.MinTXID, \"max\", info.MaxTXID)\n\n\t\trdrs = append(rdrs, internal.NewResumableReader(ctx, r.Client, info.Level, info.MinTXID, info.MaxTXID, info.Size, nil, r.Logger()))\n\t}\n\n\tif len(rdrs) == 0 {\n\t\treturn fmt.Errorf(\"no matching backup files available\")\n\t}\n\n\t// Create parent directory if it doesn't exist.\n\tvar dirInfo os.FileInfo\n\tif db := r.DB(); db != nil {\n\t\tdirInfo = db.dirInfo\n\t}\n\tif err := internal.MkdirAll(filepath.Dir(opt.OutputPath), dirInfo); err != nil {\n\t\treturn fmt.Errorf(\"create parent directory: %w\", err)\n\t}\n\n\t// Output to temp file \u0026 atomically rename.\n\ttmpOutputPath := opt.OutputPath + \".tmp\"\n\tr.Logger().Debug(\"compacting into database\", \"path\", tmpOutputPath, \"n\", len(rdrs))\n\tdefer func() { _ = os.Remove(tmpOutputPath) }()\n\n\tf, err := os.Create(tmpOutputPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create temp database path: %w\", err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tpr, pw := io.Pipe()\n\n\tgo func() {\n\t\tc, err := ltx.NewCompactor(pw, rdrs)\n\t\tif err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"new ltx compactor: %w\", err))\n\t\t\treturn\n\t\t}\n\t\tc.HeaderFlags = ltx.HeaderFlagNoChecksum\n\t\t_ = pw.CloseWithError(c.Compact(ctx))\n\t}()\n\n\tdec := ltx.NewDecoder(pr)\n\tif err := dec.DecodeDatabaseTo(f); err != nil {\n\t\treturn fmt.Errorf(\"decode database: %w\", err)\n\t}\n\n\tif err := f.Sync(); err != nil {\n\t\treturn err\n\t} else if err := f.Close(); err != nil {\n\t\treturn err\n\t}\n\n\t// Copy file to final location.\n\tr.Logger().Debug(\"renaming database from temporary location\")\n\tif err := os.Rename(tmpOutputPath, opt.OutputPath); err != nil {\n\t\treturn err\n\t}\n\tif err := internal.FsyncDir(filepath.Dir(opt.OutputPath)); err != nil {\n\t\treturn fmt.Errorf(\"sync restore output dir: %w\", err)\n\t}\n\n\tif opt.IntegrityCheck != IntegrityCheckNone {\n\t\tif err := checkIntegrity(ctx, opt.OutputPath, opt.IntegrityCheck); err != nil {\n\t\t\tif ctx.Err() == nil {\n\t\t\t\t_ = os.Remove(opt.OutputPath)\n\t\t\t\t_ = os.Remove(opt.OutputPath + \"-shm\")\n\t\t\t\t_ = os.Remove(opt.OutputPath + \"-wal\")\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"post-restore integrity check: %w\", err)\n\t\t}\n\t\tr.Logger().Info(\"post-restore integrity check passed\")\n\t}\n\n\t// Enter follow mode if enabled, continuously applying new LTX files.\n\tif opt.Follow {\n\t\tfor _, rd := range rdrs {\n\t\t\tif closer, ok := rd.(io.Closer); ok {\n\t\t\t\t_ = closer.Close()\n\t\t\t}\n\t\t}\n\t\trdrs = nil\n\n\t\tmaxTXID := infos[len(infos)-1].MaxTXID\n\t\tif err := WriteTXIDFile(opt.OutputPath, maxTXID); err != nil {\n\t\t\treturn fmt.Errorf(\"write initial txid file: %w\", err)\n\t\t}\n\t\treturn r.follow(ctx, opt.OutputPath, maxTXID, opt.FollowInterval)\n\t}\n\n\treturn nil\n}\n\n// follow enters a continuous restore loop, polling for new LTX files and\n// applying them to the restored database. It blocks until the context is\n// cancelled (e.g. Ctrl+C). Returns nil on clean shutdown.\nfunc (r *Replica) follow(ctx context.Context, outputPath string, lastTXID ltx.TXID, interval time.Duration) error {\n\tf, err := os.OpenFile(outputPath, os.O_RDWR, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database for follow: %w\", err)\n\t}\n\tdefer func() {\n\t\t_ = f.Sync()\n\t\t_ = f.Close()\n\t}()\n\n\t// Read page size from SQLite header (offset 16, 2 bytes, big-endian).\n\tvar buf [2]byte\n\tif _, err := f.ReadAt(buf[:], 16); err != nil {\n\t\treturn fmt.Errorf(\"read page size from database header: %w\", err)\n\t}\n\tpageSize := uint32(buf[0])\u003c\u003c8 | uint32(buf[1])\n\tif pageSize == 1 {\n\t\tpageSize = 65536\n\t}\n\n\tif interval \u003c= 0 {\n\t\tinterval = DefaultFollowInterval\n\t}\n\n\tr.Logger().Info(\"entering follow mode\", \"output\", outputPath, \"txid\", lastTXID, \"interval\", interval)\n\n\tticker := time.NewTicker(interval)\n\tdefer ticker.Stop()\n\n\tvar consecutiveErrors int\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\tr.Logger().Info(\"follow mode stopped\")\n\t\t\treturn nil\n\t\tcase \u003c-ticker.C:\n\t\t\tnewTXID, err := r.applyNewLTXFiles(ctx, f, lastTXID, pageSize)\n\t\t\tif err != nil {\n\t\t\t\tif ctx.Err() != nil {\n\t\t\t\t\tr.Logger().Info(\"follow mode stopped\")\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tconsecutiveErrors++\n\t\t\t\tr.Logger().Error(\"follow: error applying updates\", \"err\", err, \"consecutive_errors\", consecutiveErrors)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif newTXID \u003e lastTXID {\n\t\t\t\tif err := WriteTXIDFile(outputPath, newTXID); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"write txid file: %w\", err)\n\t\t\t\t}\n\t\t\t\tr.Logger().Info(\"follow: applied updates\", \"from_txid\", lastTXID, \"to_txid\", newTXID)\n\t\t\t\tlastTXID = newTXID\n\t\t\t\tconsecutiveErrors = 0\n\t\t\t}\n\t\t}\n\t}\n}\n\n// applyNewLTXFiles polls for new LTX files and applies them to the database.\n// It starts from level 0 and falls back to higher levels if there are gaps\n// (e.g., level 0 files were compacted away).\nfunc (r *Replica) applyNewLTXFiles(ctx context.Context, f *os.File, afterTXID ltx.TXID, pageSize uint32) (ltx.TXID, error) {\n\tcurrentTXID := afterTXID\n\n\t// Poll level 0 for the most recent incremental files.\n\titr, err := r.Client.LTXFiles(ctx, 0, currentTXID+1, false)\n\tif err != nil {\n\t\treturn currentTXID, fmt.Errorf(\"list level 0 ltx files: %w\", err)\n\t}\n\tcloseLevel0 := func(retErr error) (ltx.TXID, error) {\n\t\tif closeErr := itr.Close(); closeErr != nil {\n\t\t\tcloseErr = fmt.Errorf(\"close level 0 ltx iterator: %w\", closeErr)\n\t\t\tif retErr != nil {\n\t\t\t\treturn currentTXID, errors.Join(retErr, closeErr)\n\t\t\t}\n\t\t\treturn currentTXID, closeErr\n\t\t}\n\t\treturn currentTXID, retErr\n\t}\n\n\tvar sawLevel0 bool\n\tfor itr.Next() {\n\t\tsawLevel0 = true\n\t\tinfo := itr.Item()\n\n\t\t// If there's a gap, try to fill it from higher compaction levels.\n\t\tif info.MinTXID \u003e currentTXID+1 {\n\t\t\tbridgedTXID, err := r.fillFollowGap(ctx, f, currentTXID, info.MinTXID, pageSize)\n\t\t\tif err != nil {\n\t\t\t\treturn closeLevel0(err)\n\t\t\t}\n\t\t\tcurrentTXID = bridgedTXID\n\n\t\t\t// Re-check if this file is still needed after bridging.\n\t\t\tif info.MaxTXID \u003c= currentTXID {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif info.MinTXID \u003e currentTXID+1 {\n\t\t\t\treturn closeLevel0(nil)\n\t\t\t}\n\t\t}\n\n\t\t// Skip if already covered by a higher-level file.\n\t\tif info.MaxTXID \u003c= currentTXID {\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := r.applyLTXFile(ctx, f, info, pageSize); err != nil {\n\t\t\treturn closeLevel0(fmt.Errorf(\n\t\t\t\t\"apply ltx file (level=%d, min=%s, max=%s): %w\",\n\t\t\t\tinfo.Level, info.MinTXID, info.MaxTXID, err,\n\t\t\t))\n\t\t}\n\t\tcurrentTXID = info.MaxTXID\n\t}\n\n\tif iterErr := itr.Err(); iterErr != nil {\n\t\treturn closeLevel0(fmt.Errorf(\"iterate level 0 ltx files: %w\", iterErr))\n\t}\n\tif _, err := closeLevel0(nil); err != nil {\n\t\treturn currentTXID, err\n\t}\n\n\tif !sawLevel0 {\n\t\tbridgedTXID, err := r.fillFollowGap(ctx, f, currentTXID, currentTXID+1, pageSize)\n\t\tif err != nil {\n\t\t\treturn currentTXID, err\n\t\t}\n\t\tcurrentTXID = bridgedTXID\n\t}\n\n\treturn currentTXID, nil\n}\n\n// applyLTXFile applies a single LTX file's pages to the database file.\n// This follows the same pattern as Hydrator.ApplyLTX (vfs.go:712-747).\n//\n// To prevent concurrent SQLite readers from seeing partial updates, we acquire\n// an exclusive file lock before writing. We also rewrite the SQLite header\n// (bytes 18-19) to indicate DELETE journal mode instead of WAL mode, and\n// randomize the schema change counter (bytes 24-27) to invalidate cached\n// schemas in other connections.\nfunc (r *Replica) applyLTXFile(ctx context.Context, f *os.File, info *ltx.FileInfo, pageSize uint32) error {\n\trc, err := r.Client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, 0, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\tdefer rc.Close()\n\n\tdec := ltx.NewDecoder(rc)\n\tif err := dec.DecodeHeader(); err != nil {\n\t\treturn fmt.Errorf(\"decode header: %w\", err)\n\t}\n\n\thdr := dec.Header()\n\n\tif err := internal.LockFileExclusive(f); err != nil {\n\t\treturn fmt.Errorf(\"acquire exclusive lock: %w\", err)\n\t}\n\tdefer internal.UnlockFile(f)\n\n\tfor {\n\t\tvar phdr ltx.PageHeader\n\t\tdata := make([]byte, pageSize)\n\t\tif err := dec.DecodePage(\u0026phdr, data); err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"decode page: %w\", err)\n\t\t}\n\n\t\tif phdr.Pgno == 1 \u0026\u0026 len(data) \u003e= 28 {\n\t\t\tdata[18], data[19] = 0x01, 0x01\n\t\t\t_, _ = rand.Read(data[24:28])\n\t\t}\n\n\t\toff := int64(phdr.Pgno-1) * int64(pageSize)\n\t\tif _, err := f.WriteAt(data, off); err != nil {\n\t\t\treturn fmt.Errorf(\"write page %d: %w\", phdr.Pgno, err)\n\t\t}\n\t}\n\n\tif hdr.Commit \u003e 0 {\n\t\tif err := f.Sync(); err != nil {\n\t\t\treturn fmt.Errorf(\"sync before truncate: %w\", err)\n\t\t}\n\t\tnewSize := int64(hdr.Commit) * int64(pageSize)\n\t\tif err := f.Truncate(newSize); err != nil {\n\t\t\treturn fmt.Errorf(\"truncate: %w\", err)\n\t\t}\n\t}\n\n\tif err := dec.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close decoder: %w\", err)\n\t}\n\n\treturn f.Sync()\n}\n\n// fillFollowGap attempts to bridge a gap in level 0 files by searching\n// higher compaction levels for a file that covers the missing TXID range.\nfunc (r *Replica) fillFollowGap(ctx context.Context, f *os.File, afterTXID ltx.TXID, gapMinTXID ltx.TXID, pageSize uint32) (ltx.TXID, error) {\n\tcurrentTXID := afterTXID\n\n\tfor level := 1; level \u003c SnapshotLevel; level++ {\n\t\titr, err := r.Client.LTXFiles(ctx, level, 0, false)\n\t\tif err != nil {\n\t\t\treturn currentTXID, fmt.Errorf(\"list level %d ltx files: %w\", level, err)\n\t\t}\n\t\tcloseLevel := func(retErr error) (ltx.TXID, error) {\n\t\t\tif closeErr := itr.Close(); closeErr != nil {\n\t\t\t\tcloseErr = fmt.Errorf(\"close level %d ltx iterator: %w\", level, closeErr)\n\t\t\t\tif retErr != nil {\n\t\t\t\t\treturn currentTXID, errors.Join(retErr, closeErr)\n\t\t\t\t}\n\t\t\t\treturn currentTXID, closeErr\n\t\t\t}\n\t\t\treturn currentTXID, retErr\n\t\t}\n\n\t\tfor itr.Next() {\n\t\t\tinfo := itr.Item()\n\n\t\t\t// Skip if there's a gap at this level too.\n\t\t\tif info.MinTXID \u003e currentTXID+1 {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Skip if already covered.\n\t\t\tif info.MaxTXID \u003c= currentTXID {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif err := r.applyLTXFile(ctx, f, info, pageSize); err != nil {\n\t\t\t\treturn closeLevel(fmt.Errorf(\n\t\t\t\t\t\"apply gap-fill ltx file (level=%d, min=%s, max=%s): %w\",\n\t\t\t\t\tinfo.Level, info.MinTXID, info.MaxTXID, err,\n\t\t\t\t))\n\t\t\t}\n\t\t\tcurrentTXID = info.MaxTXID\n\n\t\t\t// If we've bridged past the gap, we're done.\n\t\t\tif currentTXID+1 \u003e= gapMinTXID {\n\t\t\t\treturn closeLevel(nil)\n\t\t\t}\n\t\t}\n\n\t\tif iterErr := itr.Err(); iterErr != nil {\n\t\t\treturn closeLevel(fmt.Errorf(\"iterate level %d ltx files: %w\", level, iterErr))\n\t\t}\n\t\tif _, err := closeLevel(nil); err != nil {\n\t\t\treturn currentTXID, err\n\t\t}\n\n\t\t// If we made progress at this level, restart from level 1.\n\t\tif currentTXID \u003e afterTXID {\n\t\t\treturn currentTXID, nil\n\t\t}\n\t}\n\n\treturn currentTXID, nil\n}\n\n// RestoreV3 restores from a v0.3.x format backup.\nfunc (r *Replica) RestoreV3(ctx context.Context, opt RestoreOptions) error {\n\tclient, ok := r.Client.(ReplicaClientV3)\n\tif !ok {\n\t\treturn fmt.Errorf(\"replica client does not support v0.3.x restore\")\n\t}\n\n\t// Validate options.\n\tif opt.OutputPath == \"\" {\n\t\treturn fmt.Errorf(\"output path required\")\n\t} else if opt.IntegrityCheck != IntegrityCheckNone \u0026\u0026 opt.IntegrityCheck != IntegrityCheckQuick \u0026\u0026 opt.IntegrityCheck != IntegrityCheckFull {\n\t\treturn fmt.Errorf(\"unsupported integrity check mode: %d\", opt.IntegrityCheck)\n\t}\n\n\t// Ensure output path does not already exist.\n\tif _, err := os.Stat(opt.OutputPath); err == nil {\n\t\treturn fmt.Errorf(\"cannot restore, output path already exists: %s\", opt.OutputPath)\n\t} else if !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\n\t// Find all generations.\n\tgenerations, err := client.GenerationsV3(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"list generations: %w\", err)\n\t}\n\tif len(generations) == 0 {\n\t\treturn ErrNoSnapshots\n\t}\n\n\t// Collect all snapshots across all generations.\n\tvar allSnapshots []SnapshotInfoV3\n\tfor _, gen := range generations {\n\t\tsnapshots, err := client.SnapshotsV3(ctx, gen)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"list snapshots for generation %s: %w\", gen, err)\n\t\t}\n\t\tallSnapshots = append(allSnapshots, snapshots...)\n\t}\n\tif len(allSnapshots) == 0 {\n\t\treturn ErrNoSnapshots\n\t}\n\n\t// Sort all snapshots by CreatedAt for timestamp-based selection.\n\tsortSnapshotsV3ByCreatedAt(allSnapshots)\n\n\t// Find best snapshot across all generations (latest, or before timestamp if specified).\n\tsnapshot := findBestSnapshotV3(allSnapshots, opt.Timestamp)\n\tif snapshot == nil {\n\t\treturn ErrNoSnapshots\n\t}\n\n\tr.Logger().Debug(\"selected v0.3.x snapshot\",\n\t\t\"generation\", snapshot.Generation,\n\t\t\"index\", snapshot.Index,\n\t\t\"created_at\", snapshot.CreatedAt)\n\n\t// Get WAL segments for the snapshot's generation.\n\tsegments, err := client.WALSegmentsV3(ctx, snapshot.Generation)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"list WAL segments: %w\", err)\n\t}\n\tsegments = filterWALSegmentsV3(segments, snapshot.Index, opt.Timestamp)\n\n\tr.Logger().Debug(\"found v0.3.x WAL segments\", \"n\", len(segments))\n\n\t// Create parent directory if it doesn't exist.\n\tvar dirInfo os.FileInfo\n\tif db := r.DB(); db != nil {\n\t\tdirInfo = db.DirInfo()\n\t}\n\tif err := internal.MkdirAll(filepath.Dir(opt.OutputPath), dirInfo); err != nil {\n\t\treturn fmt.Errorf(\"create parent directory: %w\", err)\n\t}\n\n\t// Create temp file for restore.\n\ttmpPath := opt.OutputPath + \".tmp\"\n\tdefer func() { _ = os.Remove(tmpPath) }()\n\n\t// Download and decompress snapshot.\n\tif err := r.downloadSnapshotV3(ctx, client, snapshot.Generation, snapshot.Index, tmpPath); err != nil {\n\t\treturn fmt.Errorf(\"download snapshot: %w\", err)\n\t}\n\n\t// Apply WAL segments.\n\tif err := r.applyWALSegmentsV3(ctx, client, snapshot.Generation, snapshot.Index, segments, tmpPath); err != nil {\n\t\treturn fmt.Errorf(\"apply WAL segments: %w\", err)\n\t}\n\n\t// Rename to final path.\n\tif err := os.Rename(tmpPath, opt.OutputPath); err != nil {\n\t\treturn fmt.Errorf(\"rename to output path: %w\", err)\n\t}\n\tif err := internal.FsyncDir(filepath.Dir(opt.OutputPath)); err != nil {\n\t\treturn fmt.Errorf(\"sync restore output dir: %w\", err)\n\t}\n\n\tif opt.IntegrityCheck != IntegrityCheckNone {\n\t\tif err := checkIntegrity(ctx, opt.OutputPath, opt.IntegrityCheck); err != nil {\n\t\t\tif ctx.Err() == nil {\n\t\t\t\t_ = os.Remove(opt.OutputPath)\n\t\t\t\t_ = os.Remove(opt.OutputPath + \"-shm\")\n\t\t\t\t_ = os.Remove(opt.OutputPath + \"-wal\")\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"post-restore integrity check: %w\", err)\n\t\t}\n\t\tr.Logger().Info(\"post-restore integrity check passed\")\n\t}\n\n\treturn nil\n}\n\n// sortSnapshotsV3ByCreatedAt sorts snapshots by creation time in ascending order.\nfunc sortSnapshotsV3ByCreatedAt(snapshots []SnapshotInfoV3) {\n\tfor i := 0; i \u003c len(snapshots)-1; i++ {\n\t\tfor j := i + 1; j \u003c len(snapshots); j++ {\n\t\t\tif snapshots[i].CreatedAt.After(snapshots[j].CreatedAt) {\n\t\t\t\tsnapshots[i], snapshots[j] = snapshots[j], snapshots[i]\n\t\t\t}\n\t\t}\n\t}\n}\n\n// findBestSnapshotV3 finds the best snapshot for restore.\n// If timestamp is zero, returns the latest snapshot.\n// Otherwise, returns the latest snapshot created before or at the timestamp.\nfunc findBestSnapshotV3(snapshots []SnapshotInfoV3, timestamp time.Time) *SnapshotInfoV3 {\n\tif len(snapshots) == 0 {\n\t\treturn nil\n\t}\n\tif timestamp.IsZero() {\n\t\treturn \u0026snapshots[len(snapshots)-1]\n\t}\n\tfor i := len(snapshots) - 1; i \u003e= 0; i-- {\n\t\tif !snapshots[i].CreatedAt.After(timestamp) {\n\t\t\treturn \u0026snapshots[i]\n\t\t}\n\t}\n\treturn nil\n}\n\n// filterWALSegmentsV3 filters WAL segments to those at or after the snapshot index\n// and optionally before the timestamp.\nfunc filterWALSegmentsV3(segments []WALSegmentInfoV3, snapshotIndex int, timestamp time.Time) []WALSegmentInfoV3 {\n\tvar result []WALSegmentInfoV3\n\tfor _, seg := range segments {\n\t\tif seg.Index \u003c snapshotIndex {\n\t\t\tcontinue\n\t\t}\n\t\tif !timestamp.IsZero() \u0026\u0026 seg.CreatedAt.After(timestamp) {\n\t\t\tcontinue\n\t\t}\n\t\tresult = append(result, seg)\n\t}\n\treturn result\n}\n\n// downloadSnapshotV3 downloads and decompresses a v0.3.x snapshot to the destination path.\nfunc (r *Replica) downloadSnapshotV3(ctx context.Context, client ReplicaClientV3, generation string, index int, destPath string) error {\n\trc, err := client.OpenSnapshotV3(ctx, generation, index)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() { _ = rc.Close() }()\n\n\tf, err := os.Create(destPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tif _, err := io.Copy(f, rc); err != nil {\n\t\treturn err\n\t}\n\treturn f.Sync()\n}\n\n// applyWALSegmentsV3 applies WAL segments to the database file.\nfunc (r *Replica) applyWALSegmentsV3(ctx context.Context, client ReplicaClientV3, generation string, snapshotIndex int, segments []WALSegmentInfoV3, dbPath string) error {\n\tif len(segments) == 0 {\n\t\treturn nil\n\t}\n\n\t// Write all WAL segments to the WAL file.\n\twalPath := dbPath + \"-wal\"\n\tvar f *os.File\n\tvar err error\n\texpectedIndex := snapshotIndex\n\toffset := int64(0)\n\n\tdefer func() {\n\t\tif f != nil {\n\t\t\t_ = f.Close()\n\t\t}\n\t}()\n\n\tapplyLastWalFile := func() error {\n\t\tif f == nil {\n\t\t\treturn nil\n\t\t} else if err = f.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tf = nil\n\t\tif err = checkpointV3(dbPath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tr.Logger().Debug(\"applied WAL index\", \"generation\", generation, \"index\", expectedIndex-1, \"bytes\", offset)\n\t\treturn nil\n\t}\n\n\t// Reconstruct each wal file, appending non-zero offsets, and apply them\n\t// to the db.\n\tfor _, seg := range segments {\n\t\tif seg.Offset == 0 {\n\t\t\t// Apply the last WAL file, if any\n\t\t\tif err = applyLastWalFile(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif seg.Index != expectedIndex {\n\t\t\t\treturn fmt.Errorf(\"missing WAL index: expected %d/0, got %d/%d\", expectedIndex, seg.Index, seg.Offset)\n\t\t\t}\n\t\t\toffset = 0\n\t\t\t// Open a new WAL file\n\t\t\tif f, err = os.OpenFile(walPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\texpectedIndex++\n\t\t} else if seg.Offset != offset {\n\t\t\treturn fmt.Errorf(\"missing WAL segment: expected %d/%d, got %d/%d\", seg.Index, offset, seg.Index, seg.Offset)\n\t\t}\n\t\tif n, err := r.appendWALSegmentV3(ctx, client, generation, seg, f); err != nil {\n\t\t\treturn fmt.Errorf(\"write WAL segment %d/%d: %w\", seg.Index, seg.Offset, err)\n\t\t} else {\n\t\t\toffset += n\n\t\t\tr.Logger().Debug(\"wrote WAL segment\", \"generation\", generation, \"index\", seg.Index, \"offset\", seg.Offset, \"bytes\", n)\n\t\t}\n\t}\n\n\treturn applyLastWalFile()\n}\n\n// appendWALSegmentV3 appends the specified segment to an open WAL file f.\nfunc (r *Replica) appendWALSegmentV3(ctx context.Context, client ReplicaClientV3, generation string, seg WALSegmentInfoV3, f *os.File) (int64, error) {\n\t// Download WAL segment.\n\trc, err := client.OpenWALSegmentV3(ctx, generation, seg.Index, seg.Offset)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tdefer func() { _ = rc.Close() }()\n\n\treturn io.Copy(f, rc)\n}\n\n// checkpointV3 checkpoints the WAL file into the database.\nfunc checkpointV3(dbPath string) error {\n\tdb, err := sql.Open(\"sqlite\", dbPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() { _ = db.Close() }()\n\n\t_, err = db.Exec(\"PRAGMA wal_checkpoint(TRUNCATE)\")\n\treturn err\n}\n\n// checkIntegrity runs a SQLite integrity check on the database at dbPath.\nfunc checkIntegrity(ctx context.Context, dbPath string, mode IntegrityCheckMode) error {\n\tif mode == IntegrityCheckNone {\n\t\treturn nil\n\t}\n\n\tdb, err := sql.Open(\"sqlite\", dbPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database for integrity check: %w\", err)\n\t}\n\tdefer func() { _ = db.Close() }()\n\n\tvar pragma string\n\tswitch mode {\n\tcase IntegrityCheckQuick:\n\t\tpragma = \"quick_check\"\n\tcase IntegrityCheckFull:\n\t\tpragma = \"integrity_check\"\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported integrity check mode: %d\", mode)\n\t}\n\n\tvar result string\n\tif err := db.QueryRowContext(ctx, \"PRAGMA \"+pragma).Scan(\u0026result); err != nil {\n\t\treturn fmt.Errorf(\"integrity check: %w\", err)\n\t}\n\tif result != \"ok\" {\n\t\treturn fmt.Errorf(\"integrity check failed: %s\", result)\n\t}\n\n\t// Clean up -shm and -wal files that SQLite may create during the PRAGMA.\n\t_ = os.Remove(dbPath + \"-shm\")\n\t_ = os.Remove(dbPath + \"-wal\")\n\n\treturn nil\n}\n\n// findBestV3SnapshotForTimestamp returns the best v0.3.x snapshot for the given timestamp.\n// Returns nil if no suitable snapshot exists.\nfunc (r *Replica) findBestV3SnapshotForTimestamp(ctx context.Context, client ReplicaClientV3, timestamp time.Time) (*SnapshotInfoV3, error) {\n\tgenerations, err := client.GenerationsV3(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"list v0.3.x generations: %w\", err)\n\t}\n\tif len(generations) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tvar allSnapshots []SnapshotInfoV3\n\tfor _, gen := range generations {\n\t\tsnapshots, err := client.SnapshotsV3(ctx, gen)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"list v0.3.x snapshots for generation %s: %w\", gen, err)\n\t\t}\n\t\tallSnapshots = append(allSnapshots, snapshots...)\n\t}\n\n\tif len(allSnapshots) == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Sort by CreatedAt for timestamp-based selection.\n\tsortSnapshotsV3ByCreatedAt(allSnapshots)\n\n\treturn findBestSnapshotV3(allSnapshots, timestamp), nil\n}\n\n// shouldUseV3Restore determines whether to use v0.3.x restore instead of LTX.\n// Returns true if v0.3.x has a better backup for the given options.\nfunc (r *Replica) shouldUseV3Restore(ctx context.Context, client ReplicaClientV3, timestamp time.Time) (bool, error) {\n\t// Get v0.3.x time bounds.\n\t_, v3UpdatedAt, err := r.TimeBoundsV3(ctx, client)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"get v0.3.x time bounds: %w\", err)\n\t}\n\n\t// Get LTX time bounds.\n\t_, ltxUpdatedAt, err := r.TimeBounds(ctx)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"get LTX time bounds: %w\", err)\n\t}\n\n\t// If no v0.3.x backups exist, use LTX.\n\tif v3UpdatedAt.IsZero() {\n\t\treturn false, nil\n\t}\n\n\t// If no LTX backups exist, use v0.3.x.\n\tif ltxUpdatedAt.IsZero() {\n\t\tr.Logger().Debug(\"using v0.3.x restore (no LTX backups)\")\n\t\treturn true, nil\n\t}\n\n\t// Both formats have backups - compare based on timestamp or latest.\n\tif !timestamp.IsZero() {\n\t\t// With timestamp: use format with best snapshot before timestamp.\n\t\tv3Snapshot, err := r.findBestV3SnapshotForTimestamp(ctx, client, timestamp)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"find v0.3.x snapshot: %w\", err)\n\t\t}\n\n\t\tltxSnapshot, err := r.findBestLTXSnapshotForTimestamp(ctx, timestamp)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"find LTX snapshot: %w\", err)\n\t\t}\n\n\t\tif v3Snapshot != nil \u0026\u0026 (ltxSnapshot == nil || v3Snapshot.CreatedAt.After(ltxSnapshot.CreatedAt)) {\n\t\t\tr.Logger().Debug(\"using v0.3.x restore (better snapshot for timestamp)\",\n\t\t\t\t\"v3_snapshot\", v3Snapshot.CreatedAt,\n\t\t\t\t\"ltx_snapshot\", ltxSnapshot)\n\t\t\treturn true, nil\n\t\t}\n\t} else {\n\t\t// Without timestamp: use format with most recent backup.\n\t\tif v3UpdatedAt.After(ltxUpdatedAt) {\n\t\t\tr.Logger().Debug(\"using v0.3.x restore (more recent backup)\",\n\t\t\t\t\"v3_updated_at\", v3UpdatedAt,\n\t\t\t\t\"ltx_updated_at\", ltxUpdatedAt)\n\t\t\treturn true, nil\n\t\t}\n\t}\n\n\treturn false, nil\n}\n\n// TimeBoundsV3 returns the time bounds of v0.3.x backups.\n// Returns zero times if no v0.3.x backups exist.\nfunc (r *Replica) TimeBoundsV3(ctx context.Context, client ReplicaClientV3) (createdAt, updatedAt time.Time, err error) {\n\tgenerations, err := client.GenerationsV3(ctx)\n\tif err != nil {\n\t\treturn time.Time{}, time.Time{}, err\n\t}\n\n\tfor _, gen := range generations {\n\t\tsnapshots, err := client.SnapshotsV3(ctx, gen)\n\t\tif err != nil {\n\t\t\treturn time.Time{}, time.Time{}, err\n\t\t}\n\t\tfor _, snap := range snapshots {\n\t\t\tif createdAt.IsZero() || snap.CreatedAt.Before(createdAt) {\n\t\t\t\tcreatedAt = snap.CreatedAt\n\t\t\t}\n\t\t\tif updatedAt.IsZero() || snap.CreatedAt.After(updatedAt) {\n\t\t\t\tupdatedAt = snap.CreatedAt\n\t\t\t}\n\t\t}\n\n\t\tsegments, err := client.WALSegmentsV3(ctx, gen)\n\t\tif err != nil {\n\t\t\treturn time.Time{}, time.Time{}, err\n\t\t}\n\t\tfor _, seg := range segments {\n\t\t\tif createdAt.IsZero() || seg.CreatedAt.Before(createdAt) {\n\t\t\t\tcreatedAt = seg.CreatedAt\n\t\t\t}\n\t\t\tif updatedAt.IsZero() || seg.CreatedAt.After(updatedAt) {\n\t\t\t\tupdatedAt = seg.CreatedAt\n\t\t\t}\n\t\t}\n\t}\n\n\treturn createdAt, updatedAt, nil\n}\n\n// findBestLTXSnapshotForTimestamp returns the best LTX snapshot for the given timestamp.\n// Returns nil if no suitable snapshot exists.\nfunc (r *Replica) findBestLTXSnapshotForTimestamp(ctx context.Context, timestamp time.Time) (*ltx.FileInfo, error) {\n\t// Find snapshots at the snapshot level that are before the timestamp.\n\tsnapshots, err := FindLTXFiles(ctx, r.Client, SnapshotLevel, true, func(info *ltx.FileInfo) (bool, error) {\n\t\treturn info.CreatedAt.Before(timestamp), nil\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"find LTX snapshots: %w\", err)\n\t}\n\tif len(snapshots) == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Return the latest snapshot before the timestamp (last in the sorted list).\n\treturn snapshots[len(snapshots)-1], nil\n}\n\n// CalcRestorePlan returns a list of storage paths to restore a snapshot at the given TXID.\nfunc CalcRestorePlan(ctx context.Context, client ReplicaClient, txID ltx.TXID, timestamp time.Time, logger *slog.Logger) ([]*ltx.FileInfo, error) {\n\tif txID != 0 \u0026\u0026 !timestamp.IsZero() {\n\t\treturn nil, fmt.Errorf(\"cannot specify both TXID \u0026 timestamp to restore\")\n\t}\n\n\tvar infos ltx.FileInfoSlice\n\tlogger = logger.With(\"target\", txID)\n\n\t// Start with latest snapshot before target TXID or timestamp.\n\t// Pass useMetadata flag to enable accurate timestamp fetching for timestamp-based restore.\n\tvar snapshot *ltx.FileInfo\n\tsnapshotItr, err := client.LTXFiles(ctx, SnapshotLevel, 0, !timestamp.IsZero())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor snapshotItr.Next() {\n\t\tinfo := snapshotItr.Item()\n\t\tlogger.Debug(\"finding snapshot before target TXID or timestamp\", \"snapshot\", info.MaxTXID)\n\t\tif txID != 0 \u0026\u0026 info.MaxTXID \u003e txID {\n\t\t\tcontinue\n\t\t}\n\t\tif !timestamp.IsZero() \u0026\u0026 !info.CreatedAt.Before(timestamp) {\n\t\t\tcontinue\n\t\t}\n\t\tsnapshot = info\n\t}\n\tif err := snapshotItr.Close(); err != nil {\n\t\treturn nil, err\n\t}\n\tif snapshot != nil {\n\t\tlogger.Debug(\"found snapshot before target TXID or timestamp\", \"snapshot\", snapshot.MaxTXID)\n\t\tinfos = append(infos, snapshot)\n\t}\n\n\t// Collect candidates across all compaction levels and pick the next file\n\t// from any level that extends the longest contiguous TXID range.\n\tconst maxLevel = SnapshotLevel - 1\n\tstartTXID := infos.MaxTXID()\n\tcurrentMax := startTXID\n\tif txID != 0 \u0026\u0026 currentMax \u003e= txID {\n\t\treturn infos, nil\n\t}\n\n\tcursors := make([]*restoreLevelCursor, 0, maxLevel+1)\n\tfor level := maxLevel; level \u003e= 0; level-- {\n\t\tlogger.Debug(\"finding ltx files for level\", \"level\", level)\n\t\titr, err := client.LTXFiles(ctx, level, 0, !timestamp.IsZero())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcursors = append(cursors, \u0026restoreLevelCursor{\n\t\t\titr: itr,\n\t\t})\n\t}\n\tdefer func() {\n\t\tfor _, cursor := range cursors {\n\t\t\tif cursor != nil {\n\t\t\t\t_ = cursor.itr.Close()\n\t\t\t}\n\t\t}\n\t}()\n\n\tfor {\n\t\tvar next *restoreLevelCursor\n\t\tfor _, cursor := range cursors {\n\t\t\tif err := cursor.refresh(currentMax, txID, timestamp); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif cursor.candidate == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif next == nil || restoreCandidateBetter(next.candidate, cursor.candidate) {\n\t\t\t\tnext = cursor\n\t\t\t}\n\t\t}\n\n\t\tif next == nil || next.candidate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\tif next.candidate.MaxTXID \u003c= currentMax {\n\t\t\tnext.candidate = nil\n\t\t\tcontinue\n\t\t}\n\n\t\tlogger.Debug(\"matching LTX file for restore\",\n\t\t\t\"filename\", ltx.FormatFilename(next.candidate.MinTXID, next.candidate.MaxTXID),\n\t\t\t\"level\", next.candidate.Level)\n\t\tinfos = append(infos, next.candidate)\n\t\tcurrentMax = next.candidate.MaxTXID\n\t\tnext.candidate = nil\n\n\t\tif txID != 0 \u0026\u0026 currentMax \u003e= txID {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif len(infos) \u003e 0 \u0026\u0026 txID == 0 \u0026\u0026 timestamp.IsZero() {\n\t\tfor _, cursor := range cursors {\n\t\t\tif err := cursor.ensureCurrent(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif cursor.current != nil \u0026\u0026 cursor.current.MinTXID \u003e currentMax+1 {\n\t\t\t\treturn nil, fmt.Errorf(\"non-contiguous ltx files: have up to %s but next file starts at %s\", currentMax, cursor.current.MinTXID)\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(infos) == 0 {\n\t\treturn nil, ErrTxNotAvailable\n\t}\n\tif txID != 0 \u0026\u0026 infos.MaxTXID() \u003c txID {\n\t\treturn nil, ErrTxNotAvailable\n\t}\n\n\treturn infos, nil\n}\n\ntype restoreLevelCursor struct {\n\t// itr streams LTX file infos for a single level in filename order.\n\titr ltx.FileIterator\n\t// current holds the last item read from itr but not yet evaluated.\n\tcurrent *ltx.FileInfo\n\t// candidate is the best eligible file at this level for the currentMax.\n\tcandidate *ltx.FileInfo\n\t// done indicates the iterator has been exhausted or errored.\n\tdone bool\n}\n\nfunc (c *restoreLevelCursor) refresh(currentMax, txID ltx.TXID, timestamp time.Time) error {\n\t// Advance the iterator until we've evaluated all files that could be\n\t// contiguous with currentMax. Keep the best eligible candidate.\n\tif c.done {\n\t\treturn nil\n\t}\n\tif c.candidate != nil \u0026\u0026 c.candidate.MaxTXID \u003c= currentMax {\n\t\tc.candidate = nil\n\t}\n\n\tfor {\n\t\tif err := c.ensureCurrent(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif c.done {\n\t\t\treturn nil\n\t\t}\n\n\t\tinfo := c.current\n\t\tif info.MinTXID \u003e currentMax+1 {\n\t\t\treturn nil\n\t\t}\n\t\tc.current = nil\n\n\t\tif info.MaxTXID \u003c= currentMax {\n\t\t\tcontinue\n\t\t}\n\t\tif txID != 0 \u0026\u0026 info.MaxTXID \u003e txID {\n\t\t\tcontinue\n\t\t}\n\t\tif !timestamp.IsZero() \u0026\u0026 !info.CreatedAt.Before(timestamp) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif c.candidate == nil || restoreCandidateBetter(c.candidate, info) {\n\t\t\tc.candidate = info\n\t\t}\n\t}\n}\n\nfunc (c *restoreLevelCursor) ensureCurrent() error {\n\t// Ensure current is populated with the next iterator item, or mark done.\n\tif c.done || c.current != nil {\n\t\treturn nil\n\t}\n\tif !c.itr.Next() {\n\t\tif err := c.itr.Err(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc.done = true\n\t\treturn nil\n\t}\n\tc.current = c.itr.Item()\n\treturn nil\n}\n\nfunc restoreCandidateBetter(curr, next *ltx.FileInfo) bool {\n\tif next.MaxTXID != curr.MaxTXID {\n\t\treturn next.MaxTXID \u003e curr.MaxTXID\n\t}\n\tif next.MinTXID != curr.MinTXID {\n\t\treturn next.MinTXID \u003c curr.MinTXID\n\t}\n\tif next.Level != curr.Level {\n\t\treturn next.Level \u003e curr.Level\n\t}\n\treturn next.CreatedAt.Before(curr.CreatedAt)\n}\n\n// TXIDPath returns the path to the TXID sidecar file for the given database path.\n// Uses -txid suffix to match SQLite's naming convention for associated files (-wal, -shm).\nfunc TXIDPath(outputPath string) string {\n\treturn outputPath + \"-txid\"\n}\n\n// WriteTXIDFile atomically writes a TXID to a sidecar file at \u003coutputPath\u003e-txid.\n// Uses temp-file + fsync + rename for crash safety.\nfunc WriteTXIDFile(outputPath string, txid ltx.TXID) error {\n\ttxidPath := TXIDPath(outputPath)\n\ttmpPath := txidPath + \".tmp\"\n\n\tf, err := os.Create(tmpPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create txid temp file: %w\", err)\n\t}\n\tdefer f.Close()\n\tdefer os.Remove(tmpPath)\n\n\tif _, err := fmt.Fprintln(f, txid); err != nil {\n\t\treturn fmt.Errorf(\"write txid: %w\", err)\n\t}\n\n\tif err := f.Sync(); err != nil {\n\t\treturn fmt.Errorf(\"sync txid file: %w\", err)\n\t}\n\n\tif err := f.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close txid file: %w\", err)\n\t}\n\n\tif err := os.Rename(tmpPath, txidPath); err != nil {\n\t\treturn fmt.Errorf(\"rename txid file: %w\", err)\n\t}\n\n\tif err := internal.FsyncDir(filepath.Dir(txidPath)); err != nil {\n\t\treturn fmt.Errorf(\"sync txid dir: %w\", err)\n\t}\n\treturn nil\n}\n\n// ReadTXIDFile reads the TXID from a sidecar file at \u003coutputPath\u003e-txid.\n// Returns 0, nil if the file does not exist (first run).\nfunc ReadTXIDFile(outputPath string) (ltx.TXID, error) {\n\ttxidPath := TXIDPath(outputPath)\n\n\tdata, err := os.ReadFile(txidPath)\n\tif os.IsNotExist(err) {\n\t\treturn 0, nil\n\t} else if err != nil {\n\t\treturn 0, fmt.Errorf(\"read txid file: %w\", err)\n\t}\n\n\ttxid, err := ltx.ParseTXID(strings.TrimSpace(string(data)))\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"parse txid file: %w\", err)\n\t}\n\n\treturn txid, nil\n}\n\n// ValidationError represents a single validation issue.\ntype ValidationError struct {\n\tLevel int // compaction level\n\tType string // \"gap\", \"overlap\", or \"unsorted\"\n\tMessage string // human-readable description\n\tPrevFile *ltx.FileInfo // previous file\n\tCurrFile *ltx.FileInfo // current file that caused error\n}\n\n// ValidateLevel checks LTX files at the given level are sorted and contiguous.\n// Returns a slice of validation errors (empty if valid).\nfunc (r *Replica) ValidateLevel(ctx context.Context, level int) ([]ValidationError, error) {\n\titr, err := r.Client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar errors []ValidationError\n\tvar prevInfo *ltx.FileInfo\n\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\n\t\t// Skip first file - nothing to compare against\n\t\tif prevInfo == nil {\n\t\t\tprevInfo = info\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check for sort order: curr.MinTXID should be \u003e= prev.MinTXID\n\t\tif info.MinTXID \u003c prevInfo.MinTXID {\n\t\t\terrors = append(errors, ValidationError{\n\t\t\t\tLevel: level,\n\t\t\t\tType: \"unsorted\",\n\t\t\t\tMessage: fmt.Sprintf(\"files out of order: curr.MinTXID=%s \u003c prev.MinTXID=%s\", info.MinTXID, prevInfo.MinTXID),\n\t\t\t\tPrevFile: prevInfo,\n\t\t\t\tCurrFile: info,\n\t\t\t})\n\t\t\tprevInfo = info\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check for TXID contiguity: prev.MaxTXID + 1 should equal curr.MinTXID\n\t\texpectedMinTXID := prevInfo.MaxTXID + 1\n\t\tif info.MinTXID != expectedMinTXID {\n\t\t\tif info.MinTXID \u003e expectedMinTXID {\n\t\t\t\terrors = append(errors, ValidationError{\n\t\t\t\t\tLevel: level,\n\t\t\t\t\tType: \"gap\",\n\t\t\t\t\tMessage: fmt.Sprintf(\"TXID gap: prev.MaxTXID=%s, curr.MinTXID=%s (expected %s)\", prevInfo.MaxTXID, info.MinTXID, expectedMinTXID),\n\t\t\t\t\tPrevFile: prevInfo,\n\t\t\t\t\tCurrFile: info,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\terrors = append(errors, ValidationError{\n\t\t\t\t\tLevel: level,\n\t\t\t\t\tType: \"overlap\",\n\t\t\t\t\tMessage: fmt.Sprintf(\"TXID overlap: prev.MaxTXID=%s, curr.MinTXID=%s\", prevInfo.MaxTXID, info.MinTXID),\n\t\t\t\t\tPrevFile: prevInfo,\n\t\t\t\t\tCurrFile: info,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tprevInfo = info\n\t}\n\n\tif err := itr.Close(); err != nil {\n\t\treturn nil, fmt.Errorf(\"close iterator: %w\", err)\n\t}\n\n\treturn errors, nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"rand","path":"crypto/rand","span":{"start":[5,1],"end":[5,15],"bytes":[40,54]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[55,70]}},{"name":"errors","path":"errors","span":{"start":[7,1],"end":[7,10],"bytes":[71,80]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[81,87]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[88,93]}},{"name":"slog","path":"log/slog","span":{"start":[10,1],"end":[10,12],"bytes":[94,105]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[106,111]}},{"name":"filepath","path":"path/filepath","span":{"start":[12,1],"end":[12,17],"bytes":[112,128]}},{"name":"strings","path":"strings","span":{"start":[13,1],"end":[13,11],"bytes":[129,139]}},{"name":"sync","path":"sync","span":{"start":[14,1],"end":[14,8],"bytes":[140,147]}},{"name":"atomic","path":"sync/atomic","span":{"start":[15,1],"end":[15,15],"bytes":[148,162]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[163,170]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[18,1],"end":[18,27],"bytes":[172,198]}},{"name":"semaphore","path":"golang.org/x/sync/semaphore","span":{"start":[19,1],"end":[19,31],"bytes":[199,229]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[21,1],"end":[21,46],"bytes":[231,276]}}],"types":{"Replica":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica","kind":"struct","span":{"start":[35,1],"end":[69,2],"bytes":[643,1754]},"callables":{"github.com/benbjohnson/litestream.Replica.CalcRestoreTarget":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","kind":"method","span":{"start":[562,1],"end":[595,2],"bytes":[15010,16196]},"signature":"github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[562,1],"end":[562,112],"bytes":[15010,15121]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[562,1],"end":[562,112],"bytes":[15010,15121]}}],"return_type":"(time.Time, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"564:31":{"kind":"call","span":{"start":[564,31],"end":[564,48],"bytes":[15209,15226]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds"},"566:23":{"kind":"call","span":{"start":[566,23],"end":[566,56],"bytes":[15266,15299]},"callee":null},"571:36":{"kind":"call","span":{"start":[571,36],"end":[571,63],"bytes":[15447,15474]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3"},"573:24":{"kind":"call","span":{"start":[573,24],"end":[573,65],"bytes":[15516,15557]},"callee":null},"576:32":{"kind":"call","span":{"start":[576,32],"end":[576,50],"bytes":[15644,15662]},"callee":null},"576:54":{"kind":"call","span":{"start":[576,54],"end":[576,83],"bytes":[15666,15695]},"callee":null},"576:7":{"kind":"call","span":{"start":[576,7],"end":[576,27],"bytes":[15619,15639]},"callee":null},"579:32":{"kind":"call","span":{"start":[579,32],"end":[579,50],"bytes":[15761,15779]},"callee":null},"579:54":{"kind":"call","span":{"start":[579,54],"end":[579,82],"bytes":[15783,15811]},"callee":null},"579:7":{"kind":"call","span":{"start":[579,7],"end":[579,27],"bytes":[15736,15756]},"callee":null},"585:6":{"kind":"call","span":{"start":[585,6],"end":[585,28],"bytes":[15898,15920]},"callee":null},"586:28":{"kind":"call","span":{"start":[586,28],"end":[586,46],"bytes":[15950,15968]},"callee":null},"586:6":{"kind":"call","span":{"start":[586,6],"end":[586,24],"bytes":[15928,15946]},"callee":null},"587:24":{"kind":"call","span":{"start":[587,24],"end":[587,54],"bytes":[15994,16024]},"callee":null},"589:41":{"kind":"call","span":{"start":[589,41],"end":[589,71],"bytes":[16069,16099]},"callee":null},"589:6":{"kind":"call","span":{"start":[589,6],"end":[589,37],"bytes":[16034,16065]},"callee":null},"590:24":{"kind":"call","span":{"start":[590,24],"end":[590,62],"bytes":[16125,16163]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.CreatedAt":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt","kind":"method","span":{"start":[520,1],"end":[534,2],"bytes":[13911,14226]},"signature":"github.com/benbjohnson/litestream.Replica.CreatedAt","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[520,1],"end":[520,70],"bytes":[13911,13980]}}],"return_type":"(time.Time, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"524:14":{"kind":"call","span":{"start":[524,14],"end":[524,49],"bytes":[14057,14092]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"528:8":{"kind":"call","span":{"start":[528,8],"end":[528,19],"bytes":[14138,14149]},"callee":null},"530:5":{"kind":"call","span":{"start":[530,5],"end":[530,15],"bytes":[14155,14165]},"callee":null},"531:9":{"kind":"call","span":{"start":[531,9],"end":[531,19],"bytes":[14176,14186]},"callee":null},"533:14":{"kind":"call","span":{"start":[533,14],"end":[533,25],"bytes":[14213,14224]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.DB":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB","kind":"method","span":{"start":[101,1],"end":[101,43],"bytes":[2422,2464]},"signature":"github.com/benbjohnson/litestream.Replica.DB","parameters":[],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.Replica.EnforceRetention":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.EnforceRetention","kind":"method","span":{"start":[318,1],"end":[350,2],"bytes":[8223,9303]},"signature":"github.com/benbjohnson/litestream.Replica.EnforceRetention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[318,1],"end":[318,70],"bytes":[8223,8292]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"319:2":{"kind":"call","span":{"start":[319,2],"end":[319,63],"bytes":[8294,8355]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.Logger":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","kind":"method","span":{"start":[92,1],"end":[98,2],"bytes":[2181,2342]},"signature":"github.com/benbjohnson/litestream.Replica.Logger","parameters":[],"return_type":"*log/slog.Logger","metrics":{"cyclomatic":2},"body":{"93:12":{"kind":"call","span":{"start":[93,12],"end":[93,26],"bytes":[2234,2248]},"callee":null},"97:32":{"kind":"call","span":{"start":[97,32],"end":[97,47],"bytes":[2324,2339]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"97:9":{"kind":"call","span":{"start":[97,9],"end":[97,48],"bytes":[2301,2340]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","kind":"method","span":{"start":[284,1],"end":[299,2],"bytes":[7368,7745]},"signature":"github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[284,1],"end":[284,98],"bytes":[7368,7465]}},{"name":"level","type":"int","span":{"start":[284,1],"end":[284,98],"bytes":[7368,7465]}}],"return_type":"(github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"286:14":{"kind":"call","span":{"start":[286,14],"end":[286,53],"bytes":[7522,7561]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"290:8":{"kind":"call","span":{"start":[290,8],"end":[290,19],"bytes":[7608,7619]},"callee":null},"292:6":{"kind":"call","span":{"start":[292,6],"end":[292,16],"bytes":[7626,7636]},"callee":null},"293:11":{"kind":"call","span":{"start":[293,11],"end":[293,21],"bytes":[7649,7659]},"callee":null},"298:15":{"kind":"call","span":{"start":[298,15],"end":[298,26],"bytes":[7732,7743]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.Pos":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","kind":"method","span":{"start":[303,1],"end":[307,2],"bytes":[7865,7950]},"signature":"github.com/benbjohnson/litestream.Replica.Pos","parameters":[],"return_type":"github.com/superfly/ltx.Pos","metrics":{"cyclomatic":1},"body":{"304:2":{"kind":"call","span":{"start":[304,2],"end":[304,14],"bytes":[7900,7912]},"callee":null},"305:8":{"kind":"call","span":{"start":[305,8],"end":[305,22],"bytes":[7920,7934]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.Restore":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","kind":"method","span":{"start":[608,1],"end":[799,2],"bytes":[16899,23659]},"signature":"github.com/benbjohnson/litestream.Replica.Restore","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[608,1],"end":[608,81],"bytes":[16899,16979]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[608,1],"end":[608,81],"bytes":[16899,16979]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":44},"body":{"611:10":{"kind":"call","span":{"start":[611,10],"end":[611,44],"bytes":[17038,17072]},"callee":null},"612:30":{"kind":"call","span":{"start":[612,30],"end":[612,52],"bytes":[17102,17124]},"callee":null},"613:10":{"kind":"call","span":{"start":[613,10],"end":[613,67],"bytes":[17136,17193]},"callee":null},"615:10":{"kind":"call","span":{"start":[615,10],"end":[615,57],"bytes":[17244,17291]},"callee":null},"616:27":{"kind":"call","span":{"start":[616,27],"end":[616,49],"bytes":[17318,17340]},"callee":null},"617:10":{"kind":"call","span":{"start":[617,10],"end":[617,62],"bytes":[17352,17404]},"callee":null},"619:10":{"kind":"call","span":{"start":[619,10],"end":[619,80],"bytes":[17557,17627]},"callee":null},"625:20":{"kind":"call","span":{"start":[625,20],"end":[625,43],"bytes":[17803,17826]},"callee":null},"626:21":{"kind":"call","span":{"start":[626,21],"end":[626,49],"bytes":[17865,17893]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile"},"628:12":{"kind":"call","span":{"start":[628,12],"end":[628,72],"bytes":[17928,17988]},"callee":null},"631:12":{"kind":"call","span":{"start":[631,12],"end":[631,147],"bytes":[18023,18158]},"callee":null},"636:27":{"kind":"call","span":{"start":[636,27],"end":[636,74],"bytes":[18372,18419]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"638:12":{"kind":"call","span":{"start":[638,12],"end":[638,83],"bytes":[18453,18524]},"callee":null},"642:8":{"kind":"call","span":{"start":[642,8],"end":[642,26],"bytes":[18574,18592]},"callee":null},"643:22":{"kind":"call","span":{"start":[643,22],"end":[643,40],"bytes":[18616,18634]},"callee":null},"645:14":{"kind":"call","span":{"start":[645,14],"end":[645,31],"bytes":[18653,18670]},"callee":null},"646:9":{"kind":"call","span":{"start":[646,9],"end":[646,28],"bytes":[18693,18712]},"callee":null},"647:12":{"kind":"call","span":{"start":[647,12],"end":[647,82],"bytes":[18724,18794]},"callee":null},"649:8":{"kind":"call","span":{"start":[649,8],"end":[649,27],"bytes":[18807,18826]},"callee":null},"653:13":{"kind":"call","span":{"start":[653,13],"end":[653,247],"bytes":[18909,19143]},"callee":null},"656:13":{"kind":"call","span":{"start":[656,13],"end":[656,208],"bytes":[19201,19396]},"callee":null},"660:4":{"kind":"call","span":{"start":[660,4],"end":[660,14],"bytes":[19412,19422]},"callee":null},"661:11":{"kind":"call","span":{"start":[661,11],"end":[661,66],"bytes":[19522,19577]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow"},"666:15":{"kind":"call","span":{"start":[666,15],"end":[666,38],"bytes":[19647,19670]},"callee":null},"667:10":{"kind":"call","span":{"start":[667,10],"end":[667,86],"bytes":[19694,19770]},"callee":null},"668:13":{"kind":"call","span":{"start":[668,13],"end":[668,31],"bytes":[19783,19801]},"callee":null},"676:18":{"kind":"call","span":{"start":[676,18],"end":[676,66],"bytes":[20103,20151]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore"},"681:12":{"kind":"call","span":{"start":[681,12],"end":[681,33],"bytes":[20216,20237]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3"},"686:16":{"kind":"call","span":{"start":[686,16],"end":[686,83],"bytes":[20266,20333]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan"},"686:72":{"kind":"call","span":{"start":[686,72],"end":[686,82],"bytes":[20322,20332]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"688:10":{"kind":"call","span":{"start":[688,10],"end":[688,57],"bytes":[20360,20407]},"callee":null},"691:108":{"kind":"call","span":{"start":[691,108],"end":[691,118],"bytes":[20519,20529]},"callee":null},"691:2":{"kind":"call","span":{"start":[691,2],"end":[691,12],"bytes":[20413,20423]},"callee":null},"691:40":{"kind":"call","span":{"start":[691,40],"end":[691,50],"bytes":[20451,20461]},"callee":null},"691:66":{"kind":"call","span":{"start":[691,66],"end":[691,76],"bytes":[20477,20487]},"callee":null},"693:10":{"kind":"call","span":{"start":[693,10],"end":[693,42],"bytes":[20554,20586]},"callee":null},"693:31":{"kind":"call","span":{"start":[693,31],"end":[693,41],"bytes":[20575,20585]},"callee":null},"694:8":{"kind":"call","span":{"start":[694,8],"end":[700,5],"bytes":[20594,20708]},"callee":null},"705:11":{"kind":"call","span":{"start":[705,11],"end":[706,71],"bytes":[20854,21010]},"callee":null},"709:3":{"kind":"call","span":{"start":[709,3],"end":[709,13],"bytes":[21018,21028]},"callee":null},"711:10":{"kind":"call","span":{"start":[711,10],"end":[711,134],"bytes":[21140,21264]},"callee":null},"711:122":{"kind":"call","span":{"start":[711,122],"end":[711,132],"bytes":[21252,21262]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"711:23":{"kind":"call","span":{"start":[711,23],"end":[711,133],"bytes":[21153,21263]},"callee":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader"},"714:5":{"kind":"call","span":{"start":[714,5],"end":[714,14],"bytes":[21273,21282]},"callee":null},"715:10":{"kind":"call","span":{"start":[715,10],"end":[715,58],"bytes":[21299,21347]},"callee":null},"720:11":{"kind":"call","span":{"start":[720,11],"end":[720,17],"bytes":[21436,21442]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB"},"723:12":{"kind":"call","span":{"start":[723,12],"end":[723,68],"bytes":[21493,21549]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"723:30":{"kind":"call","span":{"start":[723,30],"end":[723,58],"bytes":[21511,21539]},"callee":null},"724:10":{"kind":"call","span":{"start":[724,10],"end":[724,56],"bytes":[21573,21619]},"callee":null},"729:2":{"kind":"call","span":{"start":[729,2],"end":[729,12],"bytes":[21712,21722]},"callee":null},"729:75":{"kind":"call","span":{"start":[729,75],"end":[729,84],"bytes":[21785,21794]},"callee":null},"730:8":{"kind":"call","span":{"start":[730,8],"end":[730,49],"bytes":[21803,21844]},"callee":null},"732:12":{"kind":"call","span":{"start":[732,12],"end":[732,36],"bytes":[21857,21881]},"callee":null},"734:10":{"kind":"call","span":{"start":[734,10],"end":[734,58],"bytes":[21908,21956]},"callee":null},"736:8":{"kind":"call","span":{"start":[736,8],"end":[736,34],"bytes":[21967,21993]},"callee":null},"738:12":{"kind":"call","span":{"start":[738,12],"end":[738,21],"bytes":[22006,22015]},"callee":null},"740:5":{"kind":"call","span":{"start":[740,5],"end":[748,5],"bytes":[22021,22251]},"callee":null,"is_goroutine":true},"750:9":{"kind":"call","span":{"start":[750,9],"end":[750,27],"bytes":[22261,22279]},"callee":null},"751:12":{"kind":"call","span":{"start":[751,12],"end":[751,35],"bytes":[22291,22314]},"callee":null},"752:10":{"kind":"call","span":{"start":[752,10],"end":[752,48],"bytes":[22338,22376]},"callee":null},"755:12":{"kind":"call","span":{"start":[755,12],"end":[755,20],"bytes":[22392,22400]},"callee":null},"757:19":{"kind":"call","span":{"start":[757,19],"end":[757,28],"bytes":[22446,22455]},"callee":null},"762:2":{"kind":"call","span":{"start":[762,2],"end":[762,12],"bytes":[22521,22531]},"callee":null},"763:12":{"kind":"call","span":{"start":[763,12],"end":[763,52],"bytes":[22594,22634]},"callee":null},"766:12":{"kind":"call","span":{"start":[766,12],"end":[766,59],"bytes":[22676,22723]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"766:30":{"kind":"call","span":{"start":[766,30],"end":[766,58],"bytes":[22694,22722]},"callee":null},"767:10":{"kind":"call","span":{"start":[767,10],"end":[767,56],"bytes":[22747,22793]},"callee":null},"771:13":{"kind":"call","span":{"start":[771,13],"end":[771,68],"bytes":[22857,22912]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.checkIntegrity"},"772:7":{"kind":"call","span":{"start":[772,7],"end":[772,16],"bytes":[22933,22942]},"callee":null},"773:9":{"kind":"call","span":{"start":[773,9],"end":[773,34],"bytes":[22960,22985]},"callee":null},"774:9":{"kind":"call","span":{"start":[774,9],"end":[774,43],"bytes":[22994,23028]},"callee":null},"775:9":{"kind":"call","span":{"start":[775,9],"end":[775,43],"bytes":[23037,23071]},"callee":null},"777:11":{"kind":"call","span":{"start":[777,11],"end":[777,62],"bytes":[23087,23138]},"callee":null},"779:3":{"kind":"call","span":{"start":[779,3],"end":[779,13],"bytes":[23145,23155]},"callee":null},"786:9":{"kind":"call","span":{"start":[786,9],"end":[786,23],"bytes":[23369,23383]},"callee":null},"791:20":{"kind":"call","span":{"start":[791,20],"end":[791,30],"bytes":[23426,23436]},"callee":null},"792:13":{"kind":"call","span":{"start":[792,13],"end":[792,51],"bytes":[23460,23498]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile"},"793:11":{"kind":"call","span":{"start":[793,11],"end":[793,57],"bytes":[23523,23569]},"callee":null},"795:10":{"kind":"call","span":{"start":[795,10],"end":[795,68],"bytes":[23583,23641]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow"}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_1","kind":"function","span":{"start":[694,1],"end":[700,5],"bytes":[20587,20708]},"signature":"github.com/benbjohnson/litestream.Replica.Restore.closure_1","parameters":[],"body":{"697:9":{"kind":"call","span":{"start":[697,9],"end":[697,23],"bytes":[20680,20694]},"callee":null}}},"closure_2":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_2","kind":"function","span":{"start":[730,1],"end":[730,49],"bytes":[21796,21844]},"signature":"github.com/benbjohnson/litestream.Replica.Restore.closure_2","parameters":[],"body":{"730:21":{"kind":"call","span":{"start":[730,21],"end":[730,45],"bytes":[21816,21840]},"callee":null}}},"closure_3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_3","kind":"function","span":{"start":[736,1],"end":[736,34],"bytes":[21960,21993]},"signature":"github.com/benbjohnson/litestream.Replica.Restore.closure_3","parameters":[],"body":{"736:21":{"kind":"call","span":{"start":[736,21],"end":[736,30],"bytes":[21980,21989]},"callee":null}}},"closure_4":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4","kind":"function","span":{"start":[740,1],"end":[748,5],"bytes":[22017,22251]},"signature":"github.com/benbjohnson/litestream.Replica.Restore.closure_4","parameters":[],"body":{"741:13":{"kind":"call","span":{"start":[741,13],"end":[741,39],"bytes":[22042,22068]},"callee":null},"743:22":{"kind":"call","span":{"start":[743,22],"end":[743,62],"bytes":[22108,22148]},"callee":null},"743:4":{"kind":"call","span":{"start":[743,4],"end":[743,63],"bytes":[22090,22149]},"callee":null},"747:25":{"kind":"call","span":{"start":[747,25],"end":[747,39],"bytes":[22231,22245]},"callee":null},"747:7":{"kind":"call","span":{"start":[747,7],"end":[747,40],"bytes":[22213,22246]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.RestoreV3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","kind":"method","span":{"start":[1067,1],"end":[1176,2],"bytes":[31404,34995]},"signature":"github.com/benbjohnson/litestream.Replica.RestoreV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1067,1],"end":[1067,77],"bytes":[31404,31480]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[1067,1],"end":[1067,77],"bytes":[31404,31480]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":22},"body":{"1070:10":{"kind":"call","span":{"start":[1070,10],"end":[1070,70],"bytes":[31542,31602]},"callee":null},"1075:10":{"kind":"call","span":{"start":[1075,10],"end":[1075,44],"bytes":[31665,31699]},"callee":null},"1077:10":{"kind":"call","span":{"start":[1077,10],"end":[1077,80],"bytes":[31852,31922]},"callee":null},"1081:15":{"kind":"call","span":{"start":[1081,15],"end":[1081,38],"bytes":[31988,32011]},"callee":null},"1082:10":{"kind":"call","span":{"start":[1082,10],"end":[1082,86],"bytes":[32035,32111]},"callee":null},"1083:13":{"kind":"call","span":{"start":[1083,13],"end":[1083,31],"bytes":[32124,32142]},"callee":null},"1088:22":{"kind":"call","span":{"start":[1088,22],"end":[1088,47],"bytes":[32209,32234]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3"},"1090:10":{"kind":"call","span":{"start":[1090,10],"end":[1090,49],"bytes":[32261,32300]},"callee":null},"1092:5":{"kind":"call","span":{"start":[1092,5],"end":[1092,21],"bytes":[32308,32324]},"callee":null},"1099:21":{"kind":"call","span":{"start":[1099,21],"end":[1099,49],"bytes":[32500,32528]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3"},"1101:11":{"kind":"call","span":{"start":[1101,11],"end":[1101,71],"bytes":[32557,32617]},"callee":null},"1103:18":{"kind":"call","span":{"start":[1103,18],"end":[1103,52],"bytes":[32639,32673]},"callee":null},"1105:5":{"kind":"call","span":{"start":[1105,5],"end":[1105,22],"bytes":[32681,32698]},"callee":null},"1110:2":{"kind":"call","span":{"start":[1110,2],"end":[1110,42],"bytes":[32802,32842]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt"},"1113:14":{"kind":"call","span":{"start":[1113,14],"end":[1113,61],"bytes":[32947,32994]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3"},"1118:2":{"kind":"call","span":{"start":[1118,2],"end":[1118,12],"bytes":[33046,33056]},"callee":null},"1124:19":{"kind":"call","span":{"start":[1124,19],"end":[1124,65],"bytes":[33262,33308]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3"},"1126:10":{"kind":"call","span":{"start":[1126,10],"end":[1126,50],"bytes":[33335,33375]},"callee":null},"1128:13":{"kind":"call","span":{"start":[1128,13],"end":[1128,73],"bytes":[33391,33451]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3"},"1130:2":{"kind":"call","span":{"start":[1130,2],"end":[1130,12],"bytes":[33454,33464]},"callee":null},"1130:53":{"kind":"call","span":{"start":[1130,53],"end":[1130,66],"bytes":[33505,33518]},"callee":null},"1134:11":{"kind":"call","span":{"start":[1134,11],"end":[1134,17],"bytes":[33605,33611]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB"},"1135:13":{"kind":"call","span":{"start":[1135,13],"end":[1135,25],"bytes":[33637,33649]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo"},"1137:12":{"kind":"call","span":{"start":[1137,12],"end":[1137,68],"bytes":[33664,33720]},"callee":null},"1137:30":{"kind":"call","span":{"start":[1137,30],"end":[1137,58],"bytes":[33682,33710]},"callee":null},"1138:10":{"kind":"call","span":{"start":[1138,10],"end":[1138,56],"bytes":[33744,33790]},"callee":null},"1143:8":{"kind":"call","span":{"start":[1143,8],"end":[1143,43],"bytes":[33872,33907]},"callee":null},"1146:12":{"kind":"call","span":{"start":[1146,12],"end":[1146,91],"bytes":[33958,34037]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3"},"1147:10":{"kind":"call","span":{"start":[1147,10],"end":[1147,50],"bytes":[34061,34101]},"callee":null},"1151:12":{"kind":"call","span":{"start":[1151,12],"end":[1151,101],"bytes":[34141,34230]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3"},"1152:10":{"kind":"call","span":{"start":[1152,10],"end":[1152,51],"bytes":[34254,34295]},"callee":null},"1156:12":{"kind":"call","span":{"start":[1156,12],"end":[1156,46],"bytes":[34337,34371]},"callee":null},"1157:10":{"kind":"call","span":{"start":[1157,10],"end":[1157,54],"bytes":[34395,34439]},"callee":null},"1159:12":{"kind":"call","span":{"start":[1159,12],"end":[1159,59],"bytes":[34454,34501]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"1159:30":{"kind":"call","span":{"start":[1159,30],"end":[1159,58],"bytes":[34472,34500]},"callee":null},"1160:10":{"kind":"call","span":{"start":[1160,10],"end":[1160,56],"bytes":[34525,34571]},"callee":null},"1164:13":{"kind":"call","span":{"start":[1164,13],"end":[1164,68],"bytes":[34635,34690]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.checkIntegrity"},"1165:7":{"kind":"call","span":{"start":[1165,7],"end":[1165,16],"bytes":[34711,34720]},"callee":null},"1166:9":{"kind":"call","span":{"start":[1166,9],"end":[1166,34],"bytes":[34738,34763]},"callee":null},"1167:9":{"kind":"call","span":{"start":[1167,9],"end":[1167,43],"bytes":[34772,34806]},"callee":null},"1168:9":{"kind":"call","span":{"start":[1168,9],"end":[1168,43],"bytes":[34815,34849]},"callee":null},"1170:11":{"kind":"call","span":{"start":[1170,11],"end":[1170,62],"bytes":[34865,34916]},"callee":null},"1172:3":{"kind":"call","span":{"start":[1172,3],"end":[1172,13],"bytes":[34923,34933]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3/github.com/benbjohnson/litestream.Replica.RestoreV3.closure_1","kind":"function","span":{"start":[1143,1],"end":[1143,43],"bytes":[33865,33907]},"signature":"github.com/benbjohnson/litestream.Replica.RestoreV3.closure_1","parameters":[],"body":{"1143:21":{"kind":"call","span":{"start":[1143,21],"end":[1143,39],"bytes":[33885,33903]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.SetPos":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos","kind":"method","span":{"start":[310,1],"end":[314,2],"bytes":[8000,8088]},"signature":"github.com/benbjohnson/litestream.Replica.SetPos","parameters":[{"name":"pos","type":"github.com/superfly/ltx.Pos","span":{"start":[310,1],"end":[310,40],"bytes":[8000,8039]}}],"metrics":{"cyclomatic":1},"body":{"311:2":{"kind":"call","span":{"start":[311,2],"end":[311,13],"bytes":[8041,8052]},"callee":null},"312:8":{"kind":"call","span":{"start":[312,8],"end":[312,21],"bytes":[8060,8073]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.Start":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start","kind":"method","span":{"start":[104,1],"end":[121,2],"bytes":[2515,2900]},"signature":"github.com/benbjohnson/litestream.Replica.Start","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[104,1],"end":[104,53],"bytes":[2515,2567]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"111:2":{"kind":"call","span":{"start":[111,2],"end":[111,15],"bytes":[2691,2704]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop"},"114:18":{"kind":"call","span":{"start":[114,18],"end":[114,41],"bytes":[2758,2781]},"callee":null},"117:2":{"kind":"call","span":{"start":[117,2],"end":[117,13],"bytes":[2823,2834]},"callee":null},"118:5":{"kind":"call","span":{"start":[118,5],"end":[118,51],"bytes":[2839,2885]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start/github.com/benbjohnson/litestream.Replica.Start.closure_1","kind":"function","span":{"start":[118,1],"end":[118,51],"bytes":[2835,2885]},"signature":"github.com/benbjohnson/litestream.Replica.Start.closure_1","parameters":[],"body":{"118:20":{"kind":"call","span":{"start":[118,20],"end":[118,31],"bytes":[2854,2865]},"callee":null},"118:33":{"kind":"call","span":{"start":[118,33],"end":[118,47],"bytes":[2867,2881]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.Stop":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","kind":"method","span":{"start":[128,1],"end":[140,2],"bytes":[3160,3374]},"signature":"github.com/benbjohnson/litestream.Replica.Stop","parameters":[{"name":"hard","type":"bool","span":{"start":[128,1],"end":[128,48],"bytes":[3160,3207]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"129:2":{"kind":"call","span":{"start":[129,2],"end":[129,12],"bytes":[3209,3219]},"callee":null},"130:2":{"kind":"call","span":{"start":[130,2],"end":[130,13],"bytes":[3221,3232]},"callee":null},"132:2":{"kind":"call","span":{"start":[132,2],"end":[132,14],"bytes":[3235,3247]},"callee":null},"133:8":{"kind":"call","span":{"start":[133,8],"end":[133,22],"bytes":[3255,3269]},"callee":null},"135:11":{"kind":"call","span":{"start":[135,11],"end":[135,22],"bytes":[3305,3316]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.Sync":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","kind":"method","span":{"start":[144,1],"end":[146,2],"bytes":[3532,3614]},"signature":"github.com/benbjohnson/litestream.Replica.Sync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[144,1],"end":[144,58],"bytes":[3532,3589]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"145:9":{"kind":"call","span":{"start":[145,9],"end":[145,23],"bytes":[3598,3612]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync"}}},"github.com/benbjohnson/litestream.Replica.TimeBounds":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","kind":"method","span":{"start":[538,1],"end":[559,2],"bytes":[14333,14951]},"signature":"github.com/benbjohnson/litestream.Replica.TimeBounds","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[538,1],"end":[538,96],"bytes":[14333,14428]}}],"return_type":"(time.Time, time.Time, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"540:15":{"kind":"call","span":{"start":[540,15],"end":[540,54],"bytes":[14494,14533]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"545:7":{"kind":"call","span":{"start":[545,7],"end":[545,17],"bytes":[14599,14609]},"callee":null},"546:12":{"kind":"call","span":{"start":[546,12],"end":[546,22],"bytes":[14623,14633]},"callee":null},"547:29":{"kind":"call","span":{"start":[547,29],"end":[547,61],"bytes":[14662,14694]},"callee":null},"547:7":{"kind":"call","span":{"start":[547,7],"end":[547,25],"bytes":[14640,14658]},"callee":null},"550:29":{"kind":"call","span":{"start":[550,29],"end":[550,60],"bytes":[14761,14792]},"callee":null},"550:7":{"kind":"call","span":{"start":[550,7],"end":[550,25],"bytes":[14739,14757]},"callee":null},"554:13":{"kind":"call","span":{"start":[554,13],"end":[554,24],"bytes":[14847,14858]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.TimeBoundsV3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","kind":"method","span":{"start":[1458,1],"end":[1493,2],"bytes":[43406,44399]},"signature":"github.com/benbjohnson/litestream.Replica.TimeBoundsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1458,1],"end":[1458,122],"bytes":[43406,43527]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1458,1],"end":[1458,122],"bytes":[43406,43527]}}],"return_type":"(time.Time, time.Time, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1459:22":{"kind":"call","span":{"start":[1459,22],"end":[1459,47],"bytes":[43549,43574]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3"},"1465:21":{"kind":"call","span":{"start":[1465,21],"end":[1465,49],"bytes":[43690,43718]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3"},"1470:29":{"kind":"call","span":{"start":[1470,29],"end":[1470,61],"bytes":[43844,43876]},"callee":null},"1470:7":{"kind":"call","span":{"start":[1470,7],"end":[1470,25],"bytes":[43822,43840]},"callee":null},"1473:29":{"kind":"call","span":{"start":[1473,29],"end":[1473,60],"bytes":[43943,43974]},"callee":null},"1473:7":{"kind":"call","span":{"start":[1473,7],"end":[1473,25],"bytes":[43921,43939]},"callee":null},"1478:20":{"kind":"call","span":{"start":[1478,20],"end":[1478,50],"bytes":[44037,44067]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3"},"1483:29":{"kind":"call","span":{"start":[1483,29],"end":[1483,60],"bytes":[44191,44222]},"callee":null},"1483:7":{"kind":"call","span":{"start":[1483,7],"end":[1483,25],"bytes":[44169,44187]},"callee":null},"1486:29":{"kind":"call","span":{"start":[1486,29],"end":[1486,59],"bytes":[44288,44318]},"callee":null},"1486:7":{"kind":"call","span":{"start":[1486,7],"end":[1486,25],"bytes":[44266,44284]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.ValidateLevel":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel","kind":"method","span":{"start":[1784,1],"end":[1846,2],"bytes":[52529,54262]},"signature":"github.com/benbjohnson/litestream.Replica.ValidateLevel","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1784,1],"end":[1784,93],"bytes":[52529,52621]}},{"name":"level","type":"int","span":{"start":[1784,1],"end":[1784,93],"bytes":[52529,52621]}}],"return_type":"([]github.com/benbjohnson/litestream.ValidationError, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"1785:14":{"kind":"call","span":{"start":[1785,14],"end":[1785,53],"bytes":[52635,52674]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"1787:15":{"kind":"call","span":{"start":[1787,15],"end":[1787,53],"bytes":[52706,52744]},"callee":null},"1789:8":{"kind":"call","span":{"start":[1789,8],"end":[1789,19],"bytes":[52755,52766]},"callee":null},"1794:6":{"kind":"call","span":{"start":[1794,6],"end":[1794,16],"bytes":[52832,52842]},"callee":null},"1795:11":{"kind":"call","span":{"start":[1795,11],"end":[1795,21],"bytes":[52855,52865]},"callee":null},"1805:13":{"kind":"call","span":{"start":[1805,13],"end":[1811,6],"bytes":[53093,53337]},"callee":null},"1808:15":{"kind":"call","span":{"start":[1808,15],"end":[1808,115],"bytes":[53186,53286]},"callee":null},"1820:14":{"kind":"call","span":{"start":[1820,14],"end":[1826,7],"bytes":[53582,53847]},"callee":null},"1823:16":{"kind":"call","span":{"start":[1823,16],"end":[1823,136],"bytes":[53673,53793]},"callee":null},"1828:14":{"kind":"call","span":{"start":[1828,14],"end":[1834,7],"bytes":[53873,54115]},"callee":null},"1831:16":{"kind":"call","span":{"start":[1831,16],"end":[1831,109],"bytes":[53968,54061]},"callee":null},"1841:12":{"kind":"call","span":{"start":[1841,12],"end":[1841,23],"bytes":[54159,54170]},"callee":null},"1842:15":{"kind":"call","span":{"start":[1842,15],"end":[1842,52],"bytes":[54199,54236]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.appendWALSegmentV3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","kind":"method","span":{"start":[1308,1],"end":[1317,2],"bytes":[38865,39215]},"signature":"github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}},{"name":"generation","type":"string","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}},{"name":"seg","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}},{"name":"f","type":"*os.File","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1310:13":{"kind":"call","span":{"start":[1310,13],"end":[1310,76],"bytes":[39055,39118]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3"},"1314:8":{"kind":"call","span":{"start":[1314,8],"end":[1314,35],"bytes":[39162,39189]},"callee":null},"1316:9":{"kind":"call","span":{"start":[1316,9],"end":[1316,23],"bytes":[39199,39213]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3.closure_1","kind":"function","span":{"start":[1314,1],"end":[1314,35],"bytes":[39155,39189]},"signature":"github.com/benbjohnson/litestream.Replica.appendWALSegmentV3.closure_1","parameters":[],"body":{"1314:21":{"kind":"call","span":{"start":[1314,21],"end":[1314,31],"bytes":[39175,39185]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.applyLTXFile":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","kind":"method","span":{"start":[946,1],"end":[1000,2],"bytes":[28110,29522]},"signature":"github.com/benbjohnson/litestream.Replica.applyLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[946,1],"end":[946,109],"bytes":[28110,28218]}},{"name":"f","type":"*os.File","span":{"start":[946,1],"end":[946,109],"bytes":[28110,28218]}},{"name":"info","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[946,1],"end":[946,109],"bytes":[28110,28218]}},{"name":"pageSize","type":"uint32","span":{"start":[946,1],"end":[946,109],"bytes":[28110,28218]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"947:13":{"kind":"call","span":{"start":[947,13],"end":[947,84],"bytes":[28231,28302]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"949:10":{"kind":"call","span":{"start":[949,10],"end":[949,46],"bytes":[28329,28365]},"callee":null},"951:8":{"kind":"call","span":{"start":[951,8],"end":[951,18],"bytes":[28376,28386]},"callee":null},"953:9":{"kind":"call","span":{"start":[953,9],"end":[953,27],"bytes":[28396,28414]},"callee":null},"954:12":{"kind":"call","span":{"start":[954,12],"end":[954,30],"bytes":[28426,28444]},"callee":null},"955:10":{"kind":"call","span":{"start":[955,10],"end":[955,46],"bytes":[28468,28504]},"callee":null},"958:9":{"kind":"call","span":{"start":[958,9],"end":[958,21],"bytes":[28517,28529]},"callee":null},"960:12":{"kind":"call","span":{"start":[960,12],"end":[960,41],"bytes":[28542,28571]},"callee":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive"},"961:10":{"kind":"call","span":{"start":[961,10],"end":[961,55],"bytes":[28595,28640]},"callee":null},"963:8":{"kind":"call","span":{"start":[963,8],"end":[963,30],"bytes":[28651,28673]},"callee":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile"},"967:11":{"kind":"call","span":{"start":[967,11],"end":[967,33],"bytes":[28718,28740]},"callee":null},"968:13":{"kind":"call","span":{"start":[968,13],"end":[968,40],"bytes":[28753,28780]},"callee":null},"971:11":{"kind":"call","span":{"start":[971,11],"end":[971,45],"bytes":[28842,28876]},"callee":null},"974:24":{"kind":"call","span":{"start":[974,24],"end":[974,33],"bytes":[28905,28914]},"callee":null},"976:11":{"kind":"call","span":{"start":[976,11],"end":[976,33],"bytes":[28968,28990]},"callee":null},"979:10":{"kind":"call","span":{"start":[979,10],"end":[979,28],"bytes":[29005,29023]},"callee":null},"979:31":{"kind":"call","span":{"start":[979,31],"end":[979,46],"bytes":[29026,29041]},"callee":null},"980:16":{"kind":"call","span":{"start":[980,16],"end":[980,36],"bytes":[29057,29077]},"callee":null},"981:11":{"kind":"call","span":{"start":[981,11],"end":[981,58],"bytes":[29102,29149]},"callee":null},"986:13":{"kind":"call","span":{"start":[986,13],"end":[986,21],"bytes":[29191,29199]},"callee":null},"987:11":{"kind":"call","span":{"start":[987,11],"end":[987,54],"bytes":[29224,29267]},"callee":null},"989:14":{"kind":"call","span":{"start":[989,14],"end":[989,31],"bytes":[29285,29302]},"callee":null},"989:34":{"kind":"call","span":{"start":[989,34],"end":[989,49],"bytes":[29305,29320]},"callee":null},"990:13":{"kind":"call","span":{"start":[990,13],"end":[990,32],"bytes":[29333,29352]},"callee":null},"991:11":{"kind":"call","span":{"start":[991,11],"end":[991,42],"bytes":[29377,29408]},"callee":null},"995:12":{"kind":"call","span":{"start":[995,12],"end":[995,23],"bytes":[29428,29439]},"callee":null},"996:10":{"kind":"call","span":{"start":[996,10],"end":[996,46],"bytes":[29463,29499]},"callee":null},"999:9":{"kind":"call","span":{"start":[999,9],"end":[999,17],"bytes":[29512,29520]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.applyNewLTXFiles":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","kind":"method","span":{"start":[865,1],"end":[936,2],"bytes":[25653,27624]},"signature":"github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[865,1],"end":[865,125],"bytes":[25653,25777]}},{"name":"f","type":"*os.File","span":{"start":[865,1],"end":[865,125],"bytes":[25653,25777]}},{"name":"afterTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[865,1],"end":[865,125],"bytes":[25653,25777]}},{"name":"pageSize","type":"uint32","span":{"start":[865,1],"end":[865,125],"bytes":[25653,25777]}}],"return_type":"(github.com/superfly/ltx.TXID, error)","error_channel":["error"],"metrics":{"cyclomatic":15},"body":{"869:14":{"kind":"call","span":{"start":[869,14],"end":[869,61],"bytes":[25874,25921]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"871:23":{"kind":"call","span":{"start":[871,23],"end":[871,68],"bytes":[25961,26006]},"callee":null},"885:6":{"kind":"call","span":{"start":[885,6],"end":[885,16],"bytes":[26357,26367]},"callee":null},"887:11":{"kind":"call","span":{"start":[887,11],"end":[887,21],"bytes":[26399,26409]},"callee":null},"891:24":{"kind":"call","span":{"start":[891,24],"end":[891,84],"bytes":[26539,26599]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap"},"893:12":{"kind":"call","span":{"start":[893,12],"end":[893,28],"bytes":[26630,26646]},"callee":null},"902:12":{"kind":"call","span":{"start":[902,12],"end":[902,28],"bytes":[26844,26860]},"callee":null},"911:13":{"kind":"call","span":{"start":[911,13],"end":[911,51],"bytes":[26988,27026]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile"},"912:11":{"kind":"call","span":{"start":[912,11],"end":[915,6],"bytes":[27051,27182]},"callee":null},"912:23":{"kind":"call","span":{"start":[912,23],"end":[915,5],"bytes":[27063,27181]},"callee":null},"920:16":{"kind":"call","span":{"start":[920,16],"end":[920,25],"bytes":[27235,27244]},"callee":null},"921:10":{"kind":"call","span":{"start":[921,10],"end":[921,75],"bytes":[27272,27337]},"callee":null},"921:22":{"kind":"call","span":{"start":[921,22],"end":[921,74],"bytes":[27284,27336]},"callee":null},"923:15":{"kind":"call","span":{"start":[923,15],"end":[923,31],"bytes":[27355,27371]},"callee":null},"928:23":{"kind":"call","span":{"start":[928,23],"end":[928,84],"bytes":[27455,27516]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap"}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1","kind":"function","span":{"start":[873,1],"end":[882,3],"bytes":[26010,26330]},"signature":"github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1","parameters":[{"name":"retErr","type":"error","span":{"start":[873,1],"end":[873,55],"bytes":[26010,26064]}}],"return_type":"(github.com/superfly/ltx.TXID, error)","error_channel":["error"],"body":{"874:18":{"kind":"call","span":{"start":[874,18],"end":[874,29],"bytes":[26082,26093]},"callee":null},"875:15":{"kind":"call","span":{"start":[875,15],"end":[875,69],"bytes":[26127,26181]},"callee":null},"877:25":{"kind":"call","span":{"start":[877,25],"end":[877,54],"bytes":[26228,26257]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","kind":"method","span":{"start":[1244,1],"end":[1305,2],"bytes":[36970,38788]},"signature":"github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"generation","type":"string","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"snapshotIndex","type":"int","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"segments","type":"[]github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"dbPath","type":"string","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"1245:5":{"kind":"call","span":{"start":[1245,5],"end":[1245,18],"bytes":[37146,37159]},"callee":null},"1254:12":{"kind":"call","span":{"start":[1254,12],"end":[1254,20],"bytes":[37330,37338]},"callee":null},"1256:8":{"kind":"call","span":{"start":[1256,8],"end":[1260,5],"bytes":[37347,37397]},"callee":null},"1281:13":{"kind":"call","span":{"start":[1281,13],"end":[1281,31],"bytes":[37919,37937]},"callee":null},"1285:12":{"kind":"call","span":{"start":[1285,12],"end":[1285,107],"bytes":[38018,38113]},"callee":null},"1289:16":{"kind":"call","span":{"start":[1289,16],"end":[1289,78],"bytes":[38174,38236]},"callee":null},"1294:11":{"kind":"call","span":{"start":[1294,11],"end":[1294,113],"bytes":[38335,38437]},"callee":null},"1296:16":{"kind":"call","span":{"start":[1296,16],"end":[1296,69],"bytes":[38457,38510]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3"},"1297:11":{"kind":"call","span":{"start":[1297,11],"end":[1297,80],"bytes":[38535,38604]},"callee":null},"1300:4":{"kind":"call","span":{"start":[1300,4],"end":[1300,14],"bytes":[38634,38644]},"callee":null},"1304:9":{"kind":"call","span":{"start":[1304,9],"end":[1304,27],"bytes":[38768,38786]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_1","kind":"function","span":{"start":[1256,1],"end":[1260,5],"bytes":[37340,37397]},"signature":"github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_1","parameters":[],"body":{"1258:8":{"kind":"call","span":{"start":[1258,8],"end":[1258,17],"bytes":[37379,37388]},"callee":null}}},"closure_2":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2","kind":"function","span":{"start":[1262,1],"end":[1274,3],"bytes":[37399,37723]},"signature":"github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2","parameters":[],"return_type":"error","error_channel":["error"],"body":{"1265:19":{"kind":"call","span":{"start":[1265,19],"end":[1265,28],"bytes":[37483,37492]},"callee":null},"1269:12":{"kind":"call","span":{"start":[1269,12],"end":[1269,32],"bytes":[37546,37566]},"callee":null},"1272:3":{"kind":"call","span":{"start":[1272,3],"end":[1272,13],"bytes":[37601,37611]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.calcPos":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","kind":"method","span":{"start":[274,1],"end":[280,2],"bytes":[7015,7240]},"signature":"github.com/benbjohnson/litestream.Replica.calcPos","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[274,1],"end":[274,74],"bytes":[7015,7088]}}],"return_type":"(github.com/superfly/ltx.Pos, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"275:15":{"kind":"call","span":{"start":[275,15],"end":[275,39],"bytes":[7103,7127]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo"},"277:15":{"kind":"call","span":{"start":[277,15],"end":[277,50],"bytes":[7159,7194]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.downloadSnapshotV3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","kind":"method","span":{"start":[1224,1],"end":[1241,2],"bytes":[36463,36903]},"signature":"github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}},{"name":"generation","type":"string","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}},{"name":"index","type":"int","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}},{"name":"destPath","type":"string","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1225:13":{"kind":"call","span":{"start":[1225,13],"end":[1225,58],"bytes":[36612,36657]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3"},"1229:8":{"kind":"call","span":{"start":[1229,8],"end":[1229,35],"bytes":[36698,36725]},"callee":null},"1231:12":{"kind":"call","span":{"start":[1231,12],"end":[1231,31],"bytes":[36738,36757]},"callee":null},"1235:8":{"kind":"call","span":{"start":[1235,8],"end":[1235,34],"bytes":[36798,36824]},"callee":null},"1237:15":{"kind":"call","span":{"start":[1237,15],"end":[1237,29],"bytes":[36840,36854]},"callee":null},"1240:9":{"kind":"call","span":{"start":[1240,9],"end":[1240,17],"bytes":[36893,36901]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_1","kind":"function","span":{"start":[1229,1],"end":[1229,35],"bytes":[36691,36725]},"signature":"github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_1","parameters":[],"body":{"1229:21":{"kind":"call","span":{"start":[1229,21],"end":[1229,31],"bytes":[36711,36721]},"callee":null}}},"closure_2":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_2","kind":"function","span":{"start":[1235,1],"end":[1235,34],"bytes":[36791,36824]},"signature":"github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_2","parameters":[],"body":{"1235:21":{"kind":"call","span":{"start":[1235,21],"end":[1235,30],"bytes":[36811,36820]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.fillFollowGap":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","kind":"method","span":{"start":[1004,1],"end":[1064,2],"bytes":[29671,31351]},"signature":"github.com/benbjohnson/litestream.Replica.fillFollowGap","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}},{"name":"f","type":"*os.File","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}},{"name":"afterTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}},{"name":"gapMinTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}},{"name":"pageSize","type":"uint32","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}}],"return_type":"(github.com/superfly/ltx.TXID, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"1008:15":{"kind":"call","span":{"start":[1008,15],"end":[1008,54],"bytes":[29905,29944]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"1010:24":{"kind":"call","span":{"start":[1010,24],"end":[1010,77],"bytes":[29986,30039]},"callee":null},"1023:7":{"kind":"call","span":{"start":[1023,7],"end":[1023,17],"bytes":[30389,30399]},"callee":null},"1024:12":{"kind":"call","span":{"start":[1024,12],"end":[1024,22],"bytes":[30413,30423]},"callee":null},"1036:14":{"kind":"call","span":{"start":[1036,14],"end":[1036,52],"bytes":[30624,30662]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile"},"1037:12":{"kind":"call","span":{"start":[1037,12],"end":[1040,7],"bytes":[30688,30830]},"callee":null},"1037:23":{"kind":"call","span":{"start":[1037,23],"end":[1040,6],"bytes":[30699,30829]},"callee":null},"1046:12":{"kind":"call","span":{"start":[1046,12],"end":[1046,27],"bytes":[30963,30978]},"callee":null},"1050:17":{"kind":"call","span":{"start":[1050,17],"end":[1050,26],"bytes":[31005,31014]},"callee":null},"1051:11":{"kind":"call","span":{"start":[1051,11],"end":[1051,83],"bytes":[31043,31115]},"callee":null},"1051:22":{"kind":"call","span":{"start":[1051,22],"end":[1051,82],"bytes":[31054,31114]},"callee":null},"1053:16":{"kind":"call","span":{"start":[1053,16],"end":[1053,31],"bytes":[31135,31150]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap/github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1","kind":"function","span":{"start":[1012,1],"end":[1021,4],"bytes":[30044,30381]},"signature":"github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1","parameters":[{"name":"retErr","type":"error","span":{"start":[1012,1],"end":[1012,55],"bytes":[30044,30098]}}],"return_type":"(github.com/superfly/ltx.TXID, error)","error_channel":["error"],"body":{"1013:19":{"kind":"call","span":{"start":[1013,19],"end":[1013,30],"bytes":[30117,30128]},"callee":null},"1014:16":{"kind":"call","span":{"start":[1014,16],"end":[1014,78],"bytes":[30163,30225]},"callee":null},"1016:26":{"kind":"call","span":{"start":[1016,26],"end":[1016,55],"bytes":[30274,30303]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","kind":"method","span":{"start":[1497,1],"end":[1511,2],"bytes":[44538,45132]},"signature":"github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1497,1],"end":[1497,117],"bytes":[44538,44654]}},{"name":"timestamp","type":"time.Time","span":{"start":[1497,1],"end":[1497,117],"bytes":[44538,44654]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1499:20":{"kind":"call","span":{"start":[1499,20],"end":[1501,4],"bytes":[44746,44886]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles"},"1503:15":{"kind":"call","span":{"start":[1503,15],"end":[1503,56],"bytes":[44918,44959]},"callee":null},"1505:5":{"kind":"call","span":{"start":[1505,5],"end":[1505,19],"bytes":[44967,44981]},"callee":null},"1510:19":{"kind":"call","span":{"start":[1510,19],"end":[1510,33],"bytes":[45108,45122]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp.closure_1","kind":"function","span":{"start":[1499,1],"end":[1501,4],"bytes":[44727,44886]},"signature":"github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp.closure_1","parameters":[{"name":"info","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1499,1],"end":[1499,109],"bytes":[44727,44835]}}],"return_type":"(bool, error)","error_channel":["error"],"body":{"1500:10":{"kind":"call","span":{"start":[1500,10],"end":[1500,42],"bytes":[44845,44877]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","kind":"method","span":{"start":[1370,1],"end":[1396,2],"bytes":[40618,41423]},"signature":"github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1370,1],"end":[1370,142],"bytes":[40618,40759]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1370,1],"end":[1370,142],"bytes":[40618,40759]}},{"name":"timestamp","type":"time.Time","span":{"start":[1370,1],"end":[1370,142],"bytes":[40618,40759]}}],"return_type":"(*github.com/benbjohnson/litestream.SnapshotInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1371:22":{"kind":"call","span":{"start":[1371,22],"end":[1371,47],"bytes":[40781,40806]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3"},"1373:15":{"kind":"call","span":{"start":[1373,15],"end":[1373,61],"bytes":[40838,40884]},"callee":null},"1375:5":{"kind":"call","span":{"start":[1375,5],"end":[1375,21],"bytes":[40892,40908]},"callee":null},"1381:21":{"kind":"call","span":{"start":[1381,21],"end":[1381,49],"bytes":[41028,41056]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3"},"1383:16":{"kind":"call","span":{"start":[1383,16],"end":[1383,83],"bytes":[41090,41157]},"callee":null},"1385:18":{"kind":"call","span":{"start":[1385,18],"end":[1385,52],"bytes":[41179,41213]},"callee":null},"1388:5":{"kind":"call","span":{"start":[1388,5],"end":[1388,22],"bytes":[41222,41239]},"callee":null},"1393:2":{"kind":"call","span":{"start":[1393,2],"end":[1393,42],"bytes":[41323,41363]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt"},"1395:9":{"kind":"call","span":{"start":[1395,9],"end":[1395,52],"bytes":[41373,41416]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3"}}},"github.com/benbjohnson/litestream.Replica.follow":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","kind":"method","span":{"start":[804,1],"end":[860,2],"bytes":[23868,25451]},"signature":"github.com/benbjohnson/litestream.Replica.follow","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[804,1],"end":[804,116],"bytes":[23868,23983]}},{"name":"outputPath","type":"string","span":{"start":[804,1],"end":[804,116],"bytes":[23868,23983]}},{"name":"lastTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[804,1],"end":[804,116],"bytes":[23868,23983]}},{"name":"interval","type":"time.Duration","span":{"start":[804,1],"end":[804,116],"bytes":[23868,23983]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"805:12":{"kind":"call","span":{"start":[805,12],"end":[805,49],"bytes":[23995,24032]},"callee":null},"807:10":{"kind":"call","span":{"start":[807,10],"end":[807,57],"bytes":[24059,24106]},"callee":null},"809:8":{"kind":"call","span":{"start":[809,8],"end":[812,5],"bytes":[24117,24161]},"callee":null},"816:15":{"kind":"call","span":{"start":[816,15],"end":[816,35],"bytes":[24266,24286]},"callee":null},"817:10":{"kind":"call","span":{"start":[817,10],"end":[817,68],"bytes":[24310,24368]},"callee":null},"819:14":{"kind":"call","span":{"start":[819,14],"end":[819,28],"bytes":[24385,24399]},"callee":null},"819:34":{"kind":"call","span":{"start":[819,34],"end":[819,48],"bytes":[24405,24419]},"callee":null},"828:2":{"kind":"call","span":{"start":[828,2],"end":[828,12],"bytes":[24523,24533]},"callee":null},"830:12":{"kind":"call","span":{"start":[830,12],"end":[830,36],"bytes":[24637,24661]},"callee":null},"831:8":{"kind":"call","span":{"start":[831,8],"end":[831,21],"bytes":[24669,24682]},"callee":null},"836:10":{"kind":"call","span":{"start":[836,10],"end":[836,20],"bytes":[24738,24748]},"callee":null},"837:4":{"kind":"call","span":{"start":[837,4],"end":[837,14],"bytes":[24753,24763]},"callee":null},"840:20":{"kind":"call","span":{"start":[840,20],"end":[840,66],"bytes":[24844,24890]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles"},"842:8":{"kind":"call","span":{"start":[842,8],"end":[842,17],"bytes":[24917,24926]},"callee":null},"843:6":{"kind":"call","span":{"start":[843,6],"end":[843,16],"bytes":[24941,24951]},"callee":null},"847:5":{"kind":"call","span":{"start":[847,5],"end":[847,15],"bytes":[25030,25040]},"callee":null},"851:15":{"kind":"call","span":{"start":[851,15],"end":[851,49],"bytes":[25193,25227]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile"},"852:13":{"kind":"call","span":{"start":[852,13],"end":[852,51],"bytes":[25254,25292]},"callee":null},"854:5":{"kind":"call","span":{"start":[854,5],"end":[854,15],"bytes":[25303,25313]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow/github.com/benbjohnson/litestream.Replica.follow.closure_1","kind":"function","span":{"start":[809,1],"end":[812,5],"bytes":[24110,24161]},"signature":"github.com/benbjohnson/litestream.Replica.follow.closure_1","parameters":[],"body":{"810:7":{"kind":"call","span":{"start":[810,7],"end":[810,15],"bytes":[24132,24140]},"callee":null},"811:7":{"kind":"call","span":{"start":[811,7],"end":[811,16],"bytes":[24147,24156]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.lockSync":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync","kind":"method","span":{"start":[236,1],"end":[246,2],"bytes":[5819,6108]},"signature":"github.com/benbjohnson/litestream.Replica.lockSync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[236,1],"end":[236,56],"bytes":[5819,5874]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"237:5":{"kind":"call","span":{"start":[237,5],"end":[237,28],"bytes":[5879,5902]},"callee":null},"240:2":{"kind":"call","span":{"start":[240,2],"end":[240,22],"bytes":[5922,5942]},"callee":null},"241:8":{"kind":"call","span":{"start":[241,8],"end":[241,29],"bytes":[5950,5971]},"callee":null},"242:12":{"kind":"call","span":{"start":[242,12],"end":[242,37],"bytes":[5983,6008]},"callee":null},"243:10":{"kind":"call","span":{"start":[243,10],"end":[243,69],"bytes":[6032,6091]},"callee":null},"243:50":{"kind":"call","span":{"start":[243,50],"end":[243,68],"bytes":[6072,6090]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.monitor":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","kind":"method","span":{"start":[392,1],"end":[516,2],"bytes":[10236,13800]},"signature":"github.com/benbjohnson/litestream.Replica.monitor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[392,1],"end":[392,49],"bytes":[10236,10284]}}],"metrics":{"cyclomatic":28},"body":{"393:12":{"kind":"call","span":{"start":[393,12],"end":[393,42],"bytes":[10296,10326]},"callee":null},"394:8":{"kind":"call","span":{"start":[394,8],"end":[394,21],"bytes":[10334,10347]},"callee":null},"396:12":{"kind":"call","span":{"start":[396,12],"end":[396,25],"bytes":[10360,10373]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify"},"406:11":{"kind":"call","span":{"start":[406,11],"end":[406,21],"bytes":[10588,10598]},"callee":null},"415:11":{"kind":"call","span":{"start":[415,11],"end":[415,21],"bytes":[10745,10755]},"callee":null},"417:11":{"kind":"call","span":{"start":[417,11],"end":[417,30],"bytes":[10778,10797]},"callee":null},"423:18":{"kind":"call","span":{"start":[423,18],"end":[423,28],"bytes":[10958,10968]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"423:56":{"kind":"call","span":{"start":[423,56],"end":[423,63],"bytes":[10996,11003]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"427:11":{"kind":"call","span":{"start":[427,11],"end":[427,21],"bytes":[11159,11169]},"callee":null},"432:13":{"kind":"call","span":{"start":[432,13],"end":[432,22],"bytes":[11237,11246]},"callee":null},"437:12":{"kind":"call","span":{"start":[437,12],"end":[437,25],"bytes":[11337,11350]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify"},"440:13":{"kind":"call","span":{"start":[440,13],"end":[440,43],"bytes":[11428,11458]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync"},"441:7":{"kind":"call","span":{"start":[441,7],"end":[441,44],"bytes":[11479,11516]},"callee":null},"446:8":{"kind":"call","span":{"start":[446,8],"end":[446,33],"bytes":[11605,11630]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"461:8":{"kind":"call","span":{"start":[461,8],"end":[461,31],"bytes":[11987,12010]},"callee":null},"463:9":{"kind":"call","span":{"start":[463,9],"end":[463,32],"bytes":[12096,12119]},"callee":null},"465:8":{"kind":"call","span":{"start":[465,8],"end":[465,18],"bytes":[12182,12192]},"callee":null},"472:8":{"kind":"call","span":{"start":[472,8],"end":[472,18],"bytes":[12393,12403]},"callee":null},"478:21":{"kind":"call","span":{"start":[478,21],"end":[478,31],"bytes":[12581,12591]},"callee":null},"484:33":{"kind":"call","span":{"start":[484,33],"end":[484,59],"bytes":[12825,12851]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable"},"485:7":{"kind":"call","span":{"start":[485,7],"end":[485,17],"bytes":[12860,12870]},"callee":null},"486:22":{"kind":"call","span":{"start":[486,22],"end":[486,47],"bytes":[12945,12970]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState"},"487:8":{"kind":"call","span":{"start":[487,8],"end":[487,18],"bytes":[12997,13007]},"callee":null},"489:8":{"kind":"call","span":{"start":[489,8],"end":[489,18],"bytes":[13079,13089]},"callee":null},"497:9":{"kind":"call","span":{"start":[497,9],"end":[497,32],"bytes":[13350,13373]},"callee":null},"498:7":{"kind":"call","span":{"start":[498,7],"end":[498,17],"bytes":[13406,13416]},"callee":null},"502:21":{"kind":"call","span":{"start":[502,21],"end":[502,31],"bytes":[13554,13564]},"callee":null},"511:4":{"kind":"call","span":{"start":[511,4],"end":[511,14],"bytes":[13678,13688]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.shouldUseV3Restore":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","kind":"method","span":{"start":[1400,1],"end":[1454,2],"bytes":[41573,43295]},"signature":"github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1400,1],"end":[1400,119],"bytes":[41573,41691]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1400,1],"end":[1400,119],"bytes":[41573,41691]}},{"name":"timestamp","type":"time.Time","span":{"start":[1400,1],"end":[1400,119],"bytes":[41573,41691]}}],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"1402:25":{"kind":"call","span":{"start":[1402,25],"end":[1402,52],"bytes":[41744,41771]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3"},"1404:17":{"kind":"call","span":{"start":[1404,17],"end":[1404,62],"bytes":[41805,41850]},"callee":null},"1408:26":{"kind":"call","span":{"start":[1408,26],"end":[1408,43],"bytes":[41905,41922]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds"},"1410:17":{"kind":"call","span":{"start":[1410,17],"end":[1410,59],"bytes":[41956,41998]},"callee":null},"1414:5":{"kind":"call","span":{"start":[1414,5],"end":[1414,25],"bytes":[42048,42068]},"callee":null},"1419:5":{"kind":"call","span":{"start":[1419,5],"end":[1419,26],"bytes":[42140,42161]},"callee":null},"1420:3":{"kind":"call","span":{"start":[1420,3],"end":[1420,13],"bytes":[42166,42176]},"callee":null},"1425:6":{"kind":"call","span":{"start":[1425,6],"end":[1425,24],"bytes":[42322,42340]},"callee":null},"1427:22":{"kind":"call","span":{"start":[1427,22],"end":[1427,78],"bytes":[42433,42489]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp"},"1429:18":{"kind":"call","span":{"start":[1429,18],"end":[1429,61],"bytes":[42525,42568]},"callee":null},"1432:23":{"kind":"call","span":{"start":[1432,23],"end":[1432,72],"bytes":[42596,42645]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp"},"1434:18":{"kind":"call","span":{"start":[1434,18],"end":[1434,58],"bytes":[42681,42721]},"callee":null},"1437:50":{"kind":"call","span":{"start":[1437,50],"end":[1437,99],"bytes":[42776,42825]},"callee":null},"1438:4":{"kind":"call","span":{"start":[1438,4],"end":[1438,14],"bytes":[42832,42842]},"callee":null},"1445:6":{"kind":"call","span":{"start":[1445,6],"end":[1445,37],"bytes":[43078,43109]},"callee":null},"1446:4":{"kind":"call","span":{"start":[1446,4],"end":[1446,14],"bytes":[43115,43125]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.sync":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync","kind":"method","span":{"start":[148,1],"end":[157,2],"bytes":[3616,3830]},"signature":"github.com/benbjohnson/litestream.Replica.sync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[148,1],"end":[148,73],"bytes":[3616,3688]}},{"name":"maxSyncLTXFiles","type":"int","span":{"start":[148,1],"end":[148,73],"bytes":[3616,3688]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"150:18":{"kind":"call","span":{"start":[150,18],"end":[150,50],"bytes":[3713,3745]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce"}}},"github.com/benbjohnson/litestream.Replica.syncOnce":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","kind":"method","span":{"start":[164,1],"end":[234,2],"bytes":[3895,5817]},"signature":"github.com/benbjohnson/litestream.Replica.syncOnce","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[164,1],"end":[164,109],"bytes":[3895,4003]}},{"name":"maxSyncLTXFiles","type":"int","span":{"start":[164,1],"end":[164,109],"bytes":[3895,4003]}}],"return_type":"(github.com/benbjohnson/litestream.replicaSyncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"165:12":{"kind":"call","span":{"start":[165,12],"end":[165,27],"bytes":[4015,4030]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync"},"168:8":{"kind":"call","span":{"start":[168,8],"end":[168,28],"bytes":[4076,4096]},"callee":null},"171:8":{"kind":"call","span":{"start":[171,8],"end":[177,5],"bytes":[4164,4252]},"callee":null},"179:12":{"kind":"call","span":{"start":[179,12],"end":[179,21],"bytes":[4265,4274]},"callee":null},"180:18":{"kind":"call","span":{"start":[180,18],"end":[180,36],"bytes":[4306,4324]},"callee":null},"184:5":{"kind":"call","span":{"start":[184,5],"end":[184,12],"bytes":[4385,4392]},"callee":null},"185:15":{"kind":"call","span":{"start":[185,15],"end":[185,29],"bytes":[4418,4432]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos"},"187:19":{"kind":"call","span":{"start":[187,19],"end":[187,50],"bytes":[4469,4500]},"callee":null},"189:3":{"kind":"call","span":{"start":[189,3],"end":[189,16],"bytes":[4507,4520]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos"},"193:15":{"kind":"call","span":{"start":[193,15],"end":[193,25],"bytes":[4578,4588]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"195:18":{"kind":"call","span":{"start":[195,18],"end":[195,74],"bytes":[4623,4679]},"callee":null},"196:12":{"kind":"call","span":{"start":[196,12],"end":[196,25],"bytes":[4691,4704]},"callee":null},"200:2":{"kind":"call","span":{"start":[200,2],"end":[200,12],"bytes":[4751,4761]},"callee":null},"201:3":{"kind":"call","span":{"start":[201,3],"end":[204,4],"bytes":[4786,4900]},"callee":null},"202:27":{"kind":"call","span":{"start":[202,27],"end":[202,34],"bytes":[4831,4838]},"callee":null},"202:4":{"kind":"call","span":{"start":[202,4],"end":[202,49],"bytes":[4808,4853]},"callee":null},"203:22":{"kind":"call","span":{"start":[203,22],"end":[203,40],"bytes":[4876,4894]},"callee":null},"203:4":{"kind":"call","span":{"start":[203,4],"end":[203,41],"bytes":[4858,4895]},"callee":null},"207:27":{"kind":"call","span":{"start":[207,27],"end":[207,34],"bytes":[4989,4996]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"207:72":{"kind":"call","span":{"start":[207,72],"end":[207,79],"bytes":[5034,5041]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"212:4":{"kind":"call","span":{"start":[212,4],"end":[212,31],"bytes":[5264,5291]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync"},"213:4":{"kind":"call","span":{"start":[213,4],"end":[213,14],"bytes":[5295,5305]},"callee":null},"215:16":{"kind":"call","span":{"start":[215,16],"end":[215,34],"bytes":[5384,5402]},"callee":null},"216:21":{"kind":"call","span":{"start":[216,21],"end":[216,28],"bytes":[5424,5431]},"callee":null},"219:13":{"kind":"call","span":{"start":[219,13],"end":[219,22],"bytes":[5485,5494]},"callee":null},"220:19":{"kind":"call","span":{"start":[220,19],"end":[220,37],"bytes":[5527,5545]},"callee":null},"222:13":{"kind":"call","span":{"start":[222,13],"end":[222,48],"bytes":[5562,5597]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile"},"225:3":{"kind":"call","span":{"start":[225,3],"end":[225,32],"bytes":[5640,5669]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos"},"231:2":{"kind":"call","span":{"start":[231,2],"end":[231,29],"bytes":[5767,5794]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync"}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce/github.com/benbjohnson/litestream.Replica.syncOnce.closure_1","kind":"function","span":{"start":[171,1],"end":[177,5],"bytes":[4157,4252]},"signature":"github.com/benbjohnson/litestream.Replica.syncOnce.closure_1","parameters":[],"body":{"173:4":{"kind":"call","span":{"start":[173,4],"end":[173,15],"bytes":[4194,4205]},"callee":null},"175:4":{"kind":"call","span":{"start":[175,4],"end":[175,17],"bytes":[4230,4243]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.uploadLTXFile":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","kind":"method","span":{"start":[248,1],"end":[271,2],"bytes":[6110,6942]},"signature":"github.com/benbjohnson/litestream.Replica.uploadLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[248,1],"end":[248,105],"bytes":[6110,6214]}},{"name":"level","type":"int","span":{"start":[248,1],"end":[248,105],"bytes":[6110,6214]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[248,1],"end":[248,105],"bytes":[6110,6214]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[248,1],"end":[248,105],"bytes":[6110,6214]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"249:14":{"kind":"call","span":{"start":[249,14],"end":[249,51],"bytes":[6228,6265]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"250:12":{"kind":"call","span":{"start":[250,12],"end":[250,29],"bytes":[6277,6294]},"callee":null},"252:10":{"kind":"call","span":{"start":[252,10],"end":[252,85],"bytes":[6321,6396]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"252:47":{"kind":"call","span":{"start":[252,47],"end":[252,62],"bytes":[6358,6373]},"callee":null},"252:64":{"kind":"call","span":{"start":[252,64],"end":[252,79],"bytes":[6375,6390]},"callee":null},"254:8":{"kind":"call","span":{"start":[254,8],"end":[254,34],"bytes":[6407,6433]},"callee":null},"256:15":{"kind":"call","span":{"start":[256,15],"end":[256,69],"bytes":[6449,6503]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile"},"258:10":{"kind":"call","span":{"start":[258,10],"end":[258,47],"bytes":[6530,6567]},"callee":null},"260:2":{"kind":"call","span":{"start":[260,2],"end":[260,12],"bytes":[6572,6582]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile/github.com/benbjohnson/litestream.Replica.uploadLTXFile.closure_1","kind":"function","span":{"start":[254,1],"end":[254,34],"bytes":[6400,6433]},"signature":"github.com/benbjohnson/litestream.Replica.uploadLTXFile.closure_1","parameters":[],"body":{"254:21":{"kind":"call","span":{"start":[254,21],"end":[254,30],"bytes":[6420,6429]},"callee":null}}}}}},"fields":{"AutoRecoverEnabled":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/AutoRecoverEnabled","kind":"field","type":"bool","span":{"start":[68,1],"end":[68,25],"bytes":[1728,1752]}},"Client":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/Client","kind":"field","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[51,1],"end":[51,22],"bytes":[1038,1059]}},"MaxSyncLTXFiles":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/MaxSyncLTXFiles","kind":"field","type":"int","span":{"start":[58,1],"end":[58,21],"bytes":[1259,1279]}},"MonitorEnabled":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/MonitorEnabled","kind":"field","type":"bool","span":{"start":[62,1],"end":[62,21],"bytes":[1423,1443]}},"SyncInterval":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/SyncInterval","kind":"field","type":"time.Duration","span":{"start":[54,1],"end":[54,28],"bytes":[1105,1132]}},"cancel":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/cancel","kind":"field","type":"func()","span":{"start":[48,1],"end":[48,15],"bytes":[972,986]}},"db":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/db","kind":"field","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[36,1],"end":[36,8],"bytes":[665,672]}},"f":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/f","kind":"field","type":"*os.File","span":{"start":[45,1],"end":[45,75],"bytes":[873,947]}},"mu":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/mu","kind":"field","type":"sync.RWMutex","span":{"start":[38,1],"end":[38,18],"bytes":[674,691]}},"muf":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/muf","kind":"field","type":"sync.Mutex","span":{"start":[44,1],"end":[44,16],"bytes":[857,872]}},"pos":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/pos","kind":"field","type":"github.com/superfly/ltx.Pos","span":{"start":[39,1],"end":[39,44],"bytes":[692,735]}},"syncSem":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/syncSem","kind":"field","type":"*golang.org/x/sync/semaphore.Weighted","span":{"start":[41,1],"end":[41,33],"bytes":[737,769]}},"syncWaiters":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/syncWaiters","kind":"field","type":"sync/atomic.Int64","span":{"start":[42,1],"end":[42,86],"bytes":[770,855]}},"wg":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[47,1],"end":[47,23],"bytes":[949,971]}}}},"ValidationError":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ValidationError","kind":"struct","span":{"start":[1774,1],"end":[1780,2],"bytes":[52102,52389]},"callables":{},"fields":{"CurrFile":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ValidationError/CurrFile","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1779,1],"end":[1779,58],"bytes":[52330,52387]}},"Level":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ValidationError/Level","kind":"field","type":"int","span":{"start":[1775,1],"end":[1775,44],"bytes":[52132,52175]}},"Message":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ValidationError/Message","kind":"field","type":"string","span":{"start":[1777,1],"end":[1777,54],"bytes":[52235,52288]}},"PrevFile":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ValidationError/PrevFile","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1778,1],"end":[1778,41],"bytes":[52289,52329]}},"Type":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ValidationError/Type","kind":"field","type":"string","span":{"start":[1776,1],"end":[1776,59],"bytes":[52176,52234]}}}},"replicaSyncResult":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.replicaSyncResult","kind":"struct","span":{"start":[159,1],"end":[162,2],"bytes":[3832,3893]},"callables":{},"fields":{"limited":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.replicaSyncResult/limited","kind":"field","type":"bool","span":{"start":[161,1],"end":[161,14],"bytes":[3878,3891]}},"synced":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.replicaSyncResult/synced","kind":"field","type":"bool","span":{"start":[160,1],"end":[160,14],"bytes":[3864,3877]}}}},"restoreLevelCursor":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor","kind":"struct","span":{"start":[1632,1],"end":[1641,2],"bytes":[48474,48864]},"callables":{"github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent","kind":"method","span":{"start":[1683,1],"end":[1697,2],"bytes":[49695,50019]},"signature":"github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1688:6":{"kind":"call","span":{"start":[1688,6],"end":[1688,18],"bytes":[49877,49889]},"callee":null},"1689:13":{"kind":"call","span":{"start":[1689,13],"end":[1689,24],"bytes":[49904,49915]},"callee":null},"1695:14":{"kind":"call","span":{"start":[1695,14],"end":[1695,26],"bytes":[49993,50005]},"callee":null}}},"github.com/benbjohnson/litestream.restoreLevelCursor.refresh":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","kind":"method","span":{"start":[1643,1],"end":[1681,2],"bytes":[48866,49693]},"signature":"github.com/benbjohnson/litestream.restoreLevelCursor.refresh","parameters":[{"name":"currentMax","type":"github.com/superfly/ltx.TXID","span":{"start":[1643,1],"end":[1643,93],"bytes":[48866,48958]}},{"name":"txID","type":"github.com/superfly/ltx.TXID","span":{"start":[1643,1],"end":[1643,93],"bytes":[48866,48958]}},{"name":"timestamp","type":"time.Time","span":{"start":[1643,1],"end":[1643,93],"bytes":[48866,48958]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1654:13":{"kind":"call","span":{"start":[1654,13],"end":[1654,30],"bytes":[49230,49247]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent"},"1673:30":{"kind":"call","span":{"start":[1673,30],"end":[1673,62],"bytes":[49540,49572]},"callee":null},"1673:7":{"kind":"call","span":{"start":[1673,7],"end":[1673,25],"bytes":[49517,49535]},"callee":null},"1677:28":{"kind":"call","span":{"start":[1677,28],"end":[1677,69],"bytes":[49619,49660]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter"}}}},"fields":{"candidate":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/candidate","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1638,1],"end":[1638,25],"bytes":[48764,48788]}},"current":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/current","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1636,1],"end":[1636,23],"bytes":[48667,48689]}},"done":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/done","kind":"field","type":"bool","span":{"start":[1640,1],"end":[1640,11],"bytes":[48852,48862]}},"itr":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/itr","kind":"field","type":"github.com/superfly/ltx.FileIterator","span":{"start":[1634,1],"end":[1634,22],"bytes":[48576,48597]}}}}},"functions":{"github.com/benbjohnson/litestream.CalcRestorePlan":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","kind":"function","span":{"start":[1514,1],"end":[1630,2],"bytes":[45226,48472]},"signature":"github.com/benbjohnson/litestream.CalcRestorePlan","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}},{"name":"txID","type":"github.com/superfly/ltx.TXID","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}},{"name":"timestamp","type":"time.Time","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}}],"return_type":"([]*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":27},"body":{"1515:19":{"kind":"call","span":{"start":[1515,19],"end":[1515,37],"bytes":[45392,45410]},"callee":null},"1516:15":{"kind":"call","span":{"start":[1516,15],"end":[1516,76],"bytes":[45427,45488]},"callee":null},"1520:11":{"kind":"call","span":{"start":[1520,11],"end":[1520,38],"bytes":[45532,45559]},"callee":null},"1525:22":{"kind":"call","span":{"start":[1525,22],"end":[1525,81],"bytes":[45767,45826]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"1525:62":{"kind":"call","span":{"start":[1525,62],"end":[1525,80],"bytes":[45807,45825]},"callee":null},"1529:6":{"kind":"call","span":{"start":[1529,6],"end":[1529,24],"bytes":[45870,45888]},"callee":null},"1530:11":{"kind":"call","span":{"start":[1530,11],"end":[1530,29],"bytes":[45901,45919]},"callee":null},"1531:3":{"kind":"call","span":{"start":[1531,3],"end":[1531,93],"bytes":[45922,46012]},"callee":null},"1535:30":{"kind":"call","span":{"start":[1535,30],"end":[1535,62],"bytes":[46098,46130]},"callee":null},"1535:7":{"kind":"call","span":{"start":[1535,7],"end":[1535,25],"bytes":[46075,46093]},"callee":null},"1540:12":{"kind":"call","span":{"start":[1540,12],"end":[1540,31],"bytes":[46181,46200]},"callee":null},"1544:3":{"kind":"call","span":{"start":[1544,3],"end":[1544,95],"bytes":[46260,46352]},"callee":null},"1545:11":{"kind":"call","span":{"start":[1545,11],"end":[1545,34],"bytes":[46363,46386]},"callee":null},"1551:15":{"kind":"call","span":{"start":[1551,15],"end":[1551,30],"bytes":[46583,46598]},"callee":null},"1557:13":{"kind":"call","span":{"start":[1557,13],"end":[1557,55],"bytes":[46698,46740]},"callee":null},"1559:3":{"kind":"call","span":{"start":[1559,3],"end":[1559,62],"bytes":[46789,46848]},"callee":null},"1560:15":{"kind":"call","span":{"start":[1560,15],"end":[1560,66],"bytes":[46863,46914]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"1560:47":{"kind":"call","span":{"start":[1560,47],"end":[1560,65],"bytes":[46895,46913]},"callee":null},"1564:13":{"kind":"call","span":{"start":[1564,13],"end":[1566,5],"bytes":[46968,47022]},"callee":null},"1568:8":{"kind":"call","span":{"start":[1568,8],"end":[1574,5],"bytes":[47033,47139]},"callee":null},"1579:14":{"kind":"call","span":{"start":[1579,14],"end":[1579,57],"bytes":[47227,47270]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh"},"1585:22":{"kind":"call","span":{"start":[1585,22],"end":[1585,78],"bytes":[47381,47437]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter"},"1599:3":{"kind":"call","span":{"start":[1599,3],"end":[1601,34],"bytes":[47613,47775]},"callee":null},"1600:16":{"kind":"call","span":{"start":[1600,16],"end":[1600,82],"bytes":[47674,47740]},"callee":null},"1602:11":{"kind":"call","span":{"start":[1602,11],"end":[1602,40],"bytes":[47786,47815]},"callee":null},"1611:36":{"kind":"call","span":{"start":[1611,36],"end":[1611,54],"bytes":[47969,47987]},"callee":null},"1611:5":{"kind":"call","span":{"start":[1611,5],"end":[1611,15],"bytes":[47938,47948]},"callee":null},"1613:14":{"kind":"call","span":{"start":[1613,14],"end":[1613,36],"bytes":[48038,48060]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent"},"1617:17":{"kind":"call","span":{"start":[1617,17],"end":[1617,133],"bytes":[48187,48303]},"callee":null},"1622:5":{"kind":"call","span":{"start":[1622,5],"end":[1622,15],"bytes":[48321,48331]},"callee":null},"1625:18":{"kind":"call","span":{"start":[1625,18],"end":[1625,33],"bytes":[48391,48406]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan/github.com/benbjohnson/litestream.CalcRestorePlan.closure_1","kind":"function","span":{"start":[1568,1],"end":[1574,5],"bytes":[47026,47139]},"signature":"github.com/benbjohnson/litestream.CalcRestorePlan.closure_1","parameters":[],"body":{"1571:9":{"kind":"call","span":{"start":[1571,9],"end":[1571,27],"bytes":[47107,47125]},"callee":null}}}}},"github.com/benbjohnson/litestream.NewReplica":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica","kind":"function","span":{"start":[71,1],"end":[83,2],"bytes":[1756,2005]},"signature":"github.com/benbjohnson/litestream.NewReplica","parameters":[{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[71,1],"end":[71,35],"bytes":[1756,1790]}}],"return_type":"*github.com/benbjohnson/litestream.Replica","metrics":{"cyclomatic":1},"body":{"74:12":{"kind":"call","span":{"start":[74,12],"end":[74,36],"bytes":[1833,1857]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica/github.com/benbjohnson/litestream.NewReplica.closure_1","kind":"function","span":{"start":[75,1],"end":[75,22],"bytes":[1859,1880]},"signature":"github.com/benbjohnson/litestream.NewReplica.closure_1","parameters":[],"body":{}}}},"github.com/benbjohnson/litestream.NewReplicaWithClient":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplicaWithClient","kind":"function","span":{"start":[85,1],"end":[89,2],"bytes":[2007,2125]},"signature":"github.com/benbjohnson/litestream.NewReplicaWithClient","parameters":[{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[85,1],"end":[85,67],"bytes":[2007,2073]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[85,1],"end":[85,67],"bytes":[2007,2073]}}],"return_type":"*github.com/benbjohnson/litestream.Replica","metrics":{"cyclomatic":1},"body":{"86:7":{"kind":"call","span":{"start":[86,7],"end":[86,21],"bytes":[2080,2094]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica"}}},"github.com/benbjohnson/litestream.ReadTXIDFile":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","kind":"function","span":{"start":[1755,1],"end":[1771,2],"bytes":[51644,52043]},"signature":"github.com/benbjohnson/litestream.ReadTXIDFile","parameters":[{"name":"outputPath","type":"string","span":{"start":[1755,1],"end":[1755,57],"bytes":[51644,51700]}}],"return_type":"(github.com/superfly/ltx.TXID, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1756:14":{"kind":"call","span":{"start":[1756,14],"end":[1756,34],"bytes":[51714,51734]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.TXIDPath"},"1758:15":{"kind":"call","span":{"start":[1758,15],"end":[1758,36],"bytes":[51750,51771]},"callee":null},"1759:5":{"kind":"call","span":{"start":[1759,5],"end":[1759,23],"bytes":[51776,51794]},"callee":null},"1762:13":{"kind":"call","span":{"start":[1762,13],"end":[1762,50],"bytes":[51849,51886]},"callee":null},"1765:15":{"kind":"call","span":{"start":[1765,15],"end":[1765,61],"bytes":[51905,51951]},"callee":null},"1765:29":{"kind":"call","span":{"start":[1765,29],"end":[1765,60],"bytes":[51919,51950]},"callee":null},"1765:47":{"kind":"call","span":{"start":[1765,47],"end":[1765,59],"bytes":[51937,51949]},"callee":null},"1767:13":{"kind":"call","span":{"start":[1767,13],"end":[1767,51],"bytes":[51981,52019]},"callee":null}}},"github.com/benbjohnson/litestream.TXIDPath":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.TXIDPath","kind":"function","span":{"start":[1714,1],"end":[1716,2],"bytes":[50523,50595]},"signature":"github.com/benbjohnson/litestream.TXIDPath","parameters":[{"name":"outputPath","type":"string","span":{"start":[1714,1],"end":[1714,42],"bytes":[50523,50564]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.WriteTXIDFile":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","kind":"function","span":{"start":[1720,1],"end":[1751,2],"bytes":[50732,51511]},"signature":"github.com/benbjohnson/litestream.WriteTXIDFile","parameters":[{"name":"outputPath","type":"string","span":{"start":[1720,1],"end":[1720,61],"bytes":[50732,50792]}},{"name":"txid","type":"github.com/superfly/ltx.TXID","span":{"start":[1720,1],"end":[1720,61],"bytes":[50732,50792]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"1721:14":{"kind":"call","span":{"start":[1721,14],"end":[1721,34],"bytes":[50806,50826]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.TXIDPath"},"1724:12":{"kind":"call","span":{"start":[1724,12],"end":[1724,30],"bytes":[50869,50887]},"callee":null},"1726:10":{"kind":"call","span":{"start":[1726,10],"end":[1726,54],"bytes":[50914,50958]},"callee":null},"1728:8":{"kind":"call","span":{"start":[1728,8],"end":[1728,17],"bytes":[50969,50978]},"callee":null},"1729:8":{"kind":"call","span":{"start":[1729,8],"end":[1729,26],"bytes":[50986,51004]},"callee":null},"1731:15":{"kind":"call","span":{"start":[1731,15],"end":[1731,36],"bytes":[51020,51041]},"callee":null},"1732:10":{"kind":"call","span":{"start":[1732,10],"end":[1732,43],"bytes":[51065,51098]},"callee":null},"1735:12":{"kind":"call","span":{"start":[1735,12],"end":[1735,20],"bytes":[51114,51122]},"callee":null},"1736:10":{"kind":"call","span":{"start":[1736,10],"end":[1736,47],"bytes":[51146,51183]},"callee":null},"1739:12":{"kind":"call","span":{"start":[1739,12],"end":[1739,21],"bytes":[51199,51208]},"callee":null},"1740:10":{"kind":"call","span":{"start":[1740,10],"end":[1740,48],"bytes":[51232,51270]},"callee":null},"1743:12":{"kind":"call","span":{"start":[1743,12],"end":[1743,40],"bytes":[51286,51314]},"callee":null},"1744:10":{"kind":"call","span":{"start":[1744,10],"end":[1744,49],"bytes":[51338,51377]},"callee":null},"1747:12":{"kind":"call","span":{"start":[1747,12],"end":[1747,53],"bytes":[51393,51434]},"callee":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"1747:30":{"kind":"call","span":{"start":[1747,30],"end":[1747,52],"bytes":[51411,51433]},"callee":null},"1748:10":{"kind":"call","span":{"start":[1748,10],"end":[1748,46],"bytes":[51458,51494]},"callee":null}}},"github.com/benbjohnson/litestream.checkIntegrity":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.checkIntegrity","kind":"function","span":{"start":[1332,1],"end":[1366,2],"bytes":[39569,40477]},"signature":"github.com/benbjohnson/litestream.checkIntegrity","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1332,1],"end":[1332,89],"bytes":[39569,39657]}},{"name":"dbPath","type":"string","span":{"start":[1332,1],"end":[1332,89],"bytes":[39569,39657]}},{"name":"mode","type":"github.com/benbjohnson/litestream.IntegrityCheckMode","span":{"start":[1332,1],"end":[1332,89],"bytes":[39569,39657]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"1337:13":{"kind":"call","span":{"start":[1337,13],"end":[1337,39],"bytes":[39720,39746]},"callee":null},"1339:10":{"kind":"call","span":{"start":[1339,10],"end":[1339,66],"bytes":[39773,39829]},"callee":null},"1341:8":{"kind":"call","span":{"start":[1341,8],"end":[1341,35],"bytes":[39840,39867]},"callee":null},"1350:10":{"kind":"call","span":{"start":[1350,10],"end":[1350,66],"bytes":[40029,40085]},"callee":null},"1354:12":{"kind":"call","span":{"start":[1354,12],"end":[1354,53],"bytes":[40120,40161]},"callee":null},"1355:10":{"kind":"call","span":{"start":[1355,10],"end":[1355,48],"bytes":[40199,40237]},"callee":null},"1358:10":{"kind":"call","span":{"start":[1358,10],"end":[1358,58],"bytes":[40271,40319]},"callee":null},"1362:6":{"kind":"call","span":{"start":[1362,6],"end":[1362,32],"bytes":[40404,40430]},"callee":null},"1363:6":{"kind":"call","span":{"start":[1363,6],"end":[1363,32],"bytes":[40436,40462]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.checkIntegrity/github.com/benbjohnson/litestream.checkIntegrity.closure_1","kind":"function","span":{"start":[1341,1],"end":[1341,35],"bytes":[39833,39867]},"signature":"github.com/benbjohnson/litestream.checkIntegrity.closure_1","parameters":[],"body":{"1341:21":{"kind":"call","span":{"start":[1341,21],"end":[1341,31],"bytes":[39853,39863]},"callee":null}}}}},"github.com/benbjohnson/litestream.checkpointV3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.checkpointV3","kind":"function","span":{"start":[1320,1],"end":[1329,2],"bytes":[39277,39492]},"signature":"github.com/benbjohnson/litestream.checkpointV3","parameters":[{"name":"dbPath","type":"string","span":{"start":[1320,1],"end":[1320,41],"bytes":[39277,39317]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1321:13":{"kind":"call","span":{"start":[1321,13],"end":[1321,39],"bytes":[39330,39356]},"callee":null},"1325:8":{"kind":"call","span":{"start":[1325,8],"end":[1325,35],"bytes":[39397,39424]},"callee":null},"1327:11":{"kind":"call","span":{"start":[1327,11],"end":[1327,53],"bytes":[39436,39478]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.checkpointV3/github.com/benbjohnson/litestream.checkpointV3.closure_1","kind":"function","span":{"start":[1325,1],"end":[1325,35],"bytes":[39390,39424]},"signature":"github.com/benbjohnson/litestream.checkpointV3.closure_1","parameters":[],"body":{"1325:21":{"kind":"call","span":{"start":[1325,21],"end":[1325,31],"bytes":[39410,39420]},"callee":null}}}}},"github.com/benbjohnson/litestream.filterWALSegmentsV3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3","kind":"function","span":{"start":[1209,1],"end":[1221,2],"bytes":[36015,36369]},"signature":"github.com/benbjohnson/litestream.filterWALSegmentsV3","parameters":[{"name":"segments","type":"[]github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1209,1],"end":[1209,115],"bytes":[36015,36129]}},{"name":"snapshotIndex","type":"int","span":{"start":[1209,1],"end":[1209,115],"bytes":[36015,36129]}},{"name":"timestamp","type":"time.Time","span":{"start":[1209,1],"end":[1209,115],"bytes":[36015,36129]}}],"return_type":"[]github.com/benbjohnson/litestream.WALSegmentInfoV3","metrics":{"cyclomatic":4},"body":{"1215:29":{"kind":"call","span":{"start":[1215,29],"end":[1215,59],"bytes":[36270,36300]},"callee":null},"1215:7":{"kind":"call","span":{"start":[1215,7],"end":[1215,25],"bytes":[36248,36266]},"callee":null},"1218:12":{"kind":"call","span":{"start":[1218,12],"end":[1218,31],"bytes":[36330,36349]},"callee":null}}},"github.com/benbjohnson/litestream.findBestSnapshotV3":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3","kind":"function","span":{"start":[1192,1],"end":[1205,2],"bytes":[35554,35889]},"signature":"github.com/benbjohnson/litestream.findBestSnapshotV3","parameters":[{"name":"snapshots","type":"[]github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[1192,1],"end":[1192,91],"bytes":[35554,35644]}},{"name":"timestamp","type":"time.Time","span":{"start":[1192,1],"end":[1192,91],"bytes":[35554,35644]}}],"return_type":"*github.com/benbjohnson/litestream.SnapshotInfoV3","metrics":{"cyclomatic":5},"body":{"1193:5":{"kind":"call","span":{"start":[1193,5],"end":[1193,19],"bytes":[35649,35663]},"callee":null},"1196:5":{"kind":"call","span":{"start":[1196,5],"end":[1196,23],"bytes":[35691,35709]},"callee":null},"1197:21":{"kind":"call","span":{"start":[1197,21],"end":[1197,35],"bytes":[35732,35746]},"callee":null},"1199:11":{"kind":"call","span":{"start":[1199,11],"end":[1199,25],"bytes":[35763,35777]},"callee":null},"1200:7":{"kind":"call","span":{"start":[1200,7],"end":[1200,46],"bytes":[35803,35842]},"callee":null}}},"github.com/benbjohnson/litestream.restoreCandidateBetter":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter","kind":"function","span":{"start":[1699,1],"end":[1710,2],"bytes":[50021,50346]},"signature":"github.com/benbjohnson/litestream.restoreCandidateBetter","parameters":[{"name":"curr","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1699,1],"end":[1699,61],"bytes":[50021,50081]}},{"name":"next","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1699,1],"end":[1699,61],"bytes":[50021,50081]}}],"return_type":"bool","metrics":{"cyclomatic":4},"body":{"1709:9":{"kind":"call","span":{"start":[1709,9],"end":[1709,46],"bytes":[50307,50344]},"callee":null}}},"github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt":{"id":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","kind":"function","span":{"start":[1179,1],"end":[1187,2],"bytes":[35080,35361]},"signature":"github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","parameters":[{"name":"snapshots","type":"[]github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[1179,1],"end":[1179,62],"bytes":[35080,35141]}}],"metrics":{"cyclomatic":4},"body":{"1180:18":{"kind":"call","span":{"start":[1180,18],"end":[1180,32],"bytes":[35159,35173]},"callee":null},"1181:23":{"kind":"call","span":{"start":[1181,23],"end":[1181,37],"bytes":[35205,35219]},"callee":null},"1182:7":{"kind":"call","span":{"start":[1182,7],"end":[1182,59],"bytes":[35233,35285]},"callee":null}}}},"content_hash":"5dfbbc9a3eb6bbfb1922a8a17a47af6481e11432b2aeb8915dc60beec8f394db"},"replica_client.go":{"id":"can://go/litestream/replica_client.go","kind":"module","span":{"start":[1,1],"end":[168,1],"bytes":[0,6022]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\n\t\"github.com/superfly/ltx\"\n)\n\nvar ErrStopIter = errors.New(\"stop iterator\")\n\n// ReplicaClient represents client to connect to a Replica.\ntype ReplicaClient interface {\n\t// Type returns the type of client.\n\tType() string\n\n\t// Init initializes the replica client connection.\n\t// This may establish connections, validate configuration, etc.\n\t// Implementations should be idempotent (no-op if already initialized).\n\tInit(ctx context.Context) error\n\n\t// LTXFiles returns an iterator of all LTX files on the replica for a given level.\n\t// If seek is specified, the iterator start from the given TXID or the next available if not found.\n\t// If useMetadata is true, the iterator fetches accurate timestamps from metadata for timestamp-based restore.\n\t// When false, the iterator uses fast timestamps (LastModified/Created/ModTime) for normal operations.\n\tLTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error)\n\n\t// OpenLTXFile returns a reader that contains an LTX file at a given TXID.\n\t// If seek is specified, the reader will start at the given offset.\n\t// Returns an os.ErrNotFound error if the LTX file does not exist.\n\tOpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error)\n\n\t// WriteLTXFile writes an LTX file to the replica.\n\t// Returns metadata for the written file.\n\tWriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error)\n\n\t// DeleteLTXFiles deletes one or more LTX files.\n\tDeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error\n\n\t// DeleteAll deletes all files.\n\tDeleteAll(ctx context.Context) error\n\n\t// SetLogger sets the logger for the client.\n\tSetLogger(logger *slog.Logger)\n}\n\n// FindLTXFiles returns a list of files that match filter.\n// The useMetadata parameter is passed through to LTXFiles to control whether accurate timestamps\n// are fetched from metadata. When true (timestamp-based restore), accurate timestamps are required.\n// When false (normal operations), fast timestamps are sufficient.\nfunc FindLTXFiles(ctx context.Context, client ReplicaClient, level int, useMetadata bool, filter func(*ltx.FileInfo) (bool, error)) ([]*ltx.FileInfo, error) {\n\titr, err := client.LTXFiles(ctx, level, 0, useMetadata)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer func() { _ = itr.Close() }()\n\n\tvar a []*ltx.FileInfo\n\tfor itr.Next() {\n\t\titem := itr.Item()\n\n\t\tmatch, err := filter(item)\n\t\tif match {\n\t\t\ta = append(a, item)\n\t\t}\n\n\t\tif errors.Is(err, ErrStopIter) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn a, err\n\t\t}\n\t}\n\n\tif err := itr.Close(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn a, nil\n}\n\n// DefaultEstimatedPageIndexSize is size that is first fetched when fetching the page index.\n// If the fetch was smaller than the actual page index, another call is made to fetch the rest.\nconst DefaultEstimatedPageIndexSize = 32 * 1024 // 32KB\n\nfunc FetchPageIndex(ctx context.Context, client ReplicaClient, info *ltx.FileInfo) (map[uint32]ltx.PageIndexElem, error) {\n\trc, err := fetchPageIndexData(ctx, client, info)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rc.Close()\n\n\treturn ltx.DecodePageIndex(bufio.NewReader(rc), info.Level, info.MinTXID, info.MaxTXID)\n}\n\n// FetchLTXHeader reads \u0026 returns the LTX header for the given file info.\nfunc FetchLTXHeader(ctx context.Context, client ReplicaClient, info *ltx.FileInfo) (ltx.Header, error) {\n\trc, err := client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, 0, ltx.HeaderSize)\n\tif err != nil {\n\t\treturn ltx.Header{}, fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\tdefer rc.Close()\n\thdr, _, err := ltx.PeekHeader(rc)\n\tif err != nil {\n\t\treturn ltx.Header{}, fmt.Errorf(\"peek header: %w\", err)\n\t}\n\treturn hdr, nil\n}\n\n// fetchPageIndexData fetches a chunk of the end of the file to get the page index.\n// If the fetch was smaller than the actual page index, another call is made to fetch the rest.\nfunc fetchPageIndexData(ctx context.Context, client ReplicaClient, info *ltx.FileInfo) (io.ReadCloser, error) {\n\t// Fetch the end of the file to get the page index.\n\toffset := info.Size - DefaultEstimatedPageIndexSize\n\tif offset \u003c 0 {\n\t\toffset = 0\n\t}\n\n\tf, err := client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, offset, 0)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\tdefer f.Close()\n\n\t// If we have read the full size of the page index, return the page index block as a reader.\n\tb, err := io.ReadAll(f)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"read ltx page index: %w\", err)\n\t}\n\t// The replica may return fewer bytes than a page index footer occupies, for\n\t// example if the file is truncated or otherwise corrupt. Slicing the footer\n\t// off the end unchecked would index past the start of the buffer and panic.\n\tif len(b) \u003c ltx.TrailerSize+8 {\n\t\treturn nil, fmt.Errorf(\"ltx file too short to contain a page index: %d bytes\", len(b))\n\t}\n\n\tsize := binary.BigEndian.Uint64(b[len(b)-ltx.TrailerSize-8:])\n\tif off := len(b) - int(size) - ltx.TrailerSize - 8; off \u003e 0 {\n\t\treturn io.NopCloser(bytes.NewReader(b[off:])), nil\n\t}\n\n\t// Otherwise read the file from the start of the page index.\n\tf, err = client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, info.Size-ltx.TrailerSize-8-int64(size), 0)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\treturn f, nil\n}\n\n// FetchPage fetches and decodes a single page frame from an LTX file.\nfunc FetchPage(ctx context.Context, client ReplicaClient, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (ltx.PageHeader, []byte, error) {\n\tf, err := client.OpenLTXFile(ctx, level, minTXID, maxTXID, offset, size)\n\tif err != nil {\n\t\treturn ltx.PageHeader{}, nil, fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\tdefer f.Close()\n\n\tb, err := io.ReadAll(f)\n\tif err != nil {\n\t\treturn ltx.PageHeader{}, nil, fmt.Errorf(\"read ltx page frame: %w\", err)\n\t}\n\treturn ltx.DecodePageData(b)\n}\n","imports":[{"name":"bufio","path":"bufio","span":{"start":[4,1],"end":[4,9],"bytes":[29,37]}},{"name":"bytes","path":"bytes","span":{"start":[5,1],"end":[5,9],"bytes":[38,46]}},{"name":"context","path":"context","span":{"start":[6,1],"end":[6,11],"bytes":[47,57]}},{"name":"binary","path":"encoding/binary","span":{"start":[7,1],"end":[7,19],"bytes":[58,76]}},{"name":"errors","path":"errors","span":{"start":[8,1],"end":[8,10],"bytes":[77,86]}},{"name":"fmt","path":"fmt","span":{"start":[9,1],"end":[9,7],"bytes":[87,93]}},{"name":"io","path":"io","span":{"start":[10,1],"end":[10,6],"bytes":[94,99]}},{"name":"slog","path":"log/slog","span":{"start":[11,1],"end":[11,12],"bytes":[100,111]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[13,1],"end":[13,27],"bytes":[113,139]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient","kind":"interface","span":{"start":[19,1],"end":[51,2],"bytes":[250,1859]},"callables":{"github.com/benbjohnson/litestream.ReplicaClient.DeleteAll":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteAll","kind":"method","span":{"start":[47,1],"end":[47,38],"bytes":[1741,1778]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[47,1],"end":[47,38],"bytes":[1741,1778]}}],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[44,1],"end":[44,62],"bytes":[1645,1706]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[44,1],"end":[44,62],"bytes":[1645,1706]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[44,1],"end":[44,62],"bytes":[1645,1706]}}],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.Init":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Init","kind":"method","span":{"start":[26,1],"end":[26,33],"bytes":[524,556]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[26,1],"end":[26,33],"bytes":[524,556]}}],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.LTXFiles":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","kind":"method","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]}},{"name":"level","type":"int","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]}},{"name":"useMetadata","type":"bool","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"level","type":"int","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"offset","type":"int64","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"size","type":"int64","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.SetLogger":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger","kind":"method","span":{"start":[50,1],"end":[50,32],"bytes":[1826,1857]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[50,1],"end":[50,32],"bytes":[1826,1857]}}],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.Type":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","kind":"method","span":{"start":[21,1],"end":[21,15],"bytes":[318,332]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.Type","parameters":[],"return_type":"string","body":{}},"github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}},{"name":"level","type":"int","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}},{"name":"r","type":"io.Reader","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"body":{}}}}},"functions":{"github.com/benbjohnson/litestream.FetchLTXHeader":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader","kind":"function","span":{"start":[101,1],"end":[112,2],"bytes":[3422,3851]},"signature":"github.com/benbjohnson/litestream.FetchLTXHeader","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[101,1],"end":[101,105],"bytes":[3422,3526]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[101,1],"end":[101,105],"bytes":[3422,3526]}},{"name":"info","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[101,1],"end":[101,105],"bytes":[3422,3526]}}],"return_type":"(github.com/superfly/ltx.Header, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"102:13":{"kind":"call","span":{"start":[102,13],"end":[102,95],"bytes":[3539,3621]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"104:24":{"kind":"call","span":{"start":[104,24],"end":[104,60],"bytes":[3662,3698]},"callee":null},"106:8":{"kind":"call","span":{"start":[106,8],"end":[106,18],"bytes":[3709,3719]},"callee":null},"107:17":{"kind":"call","span":{"start":[107,17],"end":[107,35],"bytes":[3736,3754]},"callee":null},"109:24":{"kind":"call","span":{"start":[109,24],"end":[109,58],"bytes":[3795,3829]},"callee":null}}},"github.com/benbjohnson/litestream.FetchPage":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FetchPage","kind":"function","span":{"start":[155,1],"end":[167,2],"bytes":[5539,6021]},"signature":"github.com/benbjohnson/litestream.FetchPage","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"level","type":"int","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"offset","type":"int64","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"size","type":"int64","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}}],"return_type":"(github.com/superfly/ltx.PageHeader, []byte, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"156:12":{"kind":"call","span":{"start":[156,12],"end":[156,74],"bytes":[5700,5762]},"callee":null},"158:33":{"kind":"call","span":{"start":[158,33],"end":[158,69],"bytes":[5812,5848]},"callee":null},"160:8":{"kind":"call","span":{"start":[160,8],"end":[160,17],"bytes":[5859,5868]},"callee":null},"162:12":{"kind":"call","span":{"start":[162,12],"end":[162,25],"bytes":[5881,5894]},"callee":null},"164:33":{"kind":"call","span":{"start":[164,33],"end":[164,75],"bytes":[5944,5986]},"callee":null},"166:9":{"kind":"call","span":{"start":[166,9],"end":[166,30],"bytes":[5998,6019]},"callee":null}}},"github.com/benbjohnson/litestream.FetchPageIndex":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex","kind":"function","span":{"start":[90,1],"end":[98,2],"bytes":[3026,3346]},"signature":"github.com/benbjohnson/litestream.FetchPageIndex","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[90,1],"end":[90,123],"bytes":[3026,3148]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[90,1],"end":[90,123],"bytes":[3026,3148]}},{"name":"info","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[90,1],"end":[90,123],"bytes":[3026,3148]}}],"return_type":"(map[uint32]github.com/superfly/ltx.PageIndexElem, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"91:13":{"kind":"call","span":{"start":[91,13],"end":[91,50],"bytes":[3161,3198]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData"},"95:8":{"kind":"call","span":{"start":[95,8],"end":[95,18],"bytes":[3244,3254]},"callee":null},"97:29":{"kind":"call","span":{"start":[97,29],"end":[97,48],"bytes":[3284,3303]},"callee":null},"97:9":{"kind":"call","span":{"start":[97,9],"end":[97,89],"bytes":[3264,3344]},"callee":null}}},"github.com/benbjohnson/litestream.FindLTXFiles":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles","kind":"function","span":{"start":[57,1],"end":[84,2],"bytes":[2186,2778]},"signature":"github.com/benbjohnson/litestream.FindLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}},{"name":"level","type":"int","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}},{"name":"useMetadata","type":"bool","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}},{"name":"filter","type":"func(*github.com/superfly/ltx.FileInfo) (bool, error)","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}}],"return_type":"([]*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"58:14":{"kind":"call","span":{"start":[58,14],"end":[58,57],"bytes":[2358,2401]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"62:8":{"kind":"call","span":{"start":[62,8],"end":[62,36],"bytes":[2447,2475]},"callee":null},"65:6":{"kind":"call","span":{"start":[65,6],"end":[65,16],"bytes":[2505,2515]},"callee":null},"66:11":{"kind":"call","span":{"start":[66,11],"end":[66,21],"bytes":[2528,2538]},"callee":null},"68:17":{"kind":"call","span":{"start":[68,17],"end":[68,29],"bytes":[2556,2568]},"callee":null},"70:8":{"kind":"call","span":{"start":[70,8],"end":[70,23],"bytes":[2589,2604]},"callee":null},"73:6":{"kind":"call","span":{"start":[73,6],"end":[73,33],"bytes":[2615,2642]},"callee":null},"80:12":{"kind":"call","span":{"start":[80,12],"end":[80,23],"bytes":[2715,2726]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles/github.com/benbjohnson/litestream.FindLTXFiles.closure_1","kind":"function","span":{"start":[62,1],"end":[62,36],"bytes":[2440,2475]},"signature":"github.com/benbjohnson/litestream.FindLTXFiles.closure_1","parameters":[],"body":{"62:21":{"kind":"call","span":{"start":[62,21],"end":[62,32],"bytes":[2460,2471]},"callee":null}}}}},"github.com/benbjohnson/litestream.fetchPageIndexData":{"id":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","kind":"function","span":{"start":[116,1],"end":[152,2],"bytes":[4033,5466]},"signature":"github.com/benbjohnson/litestream.fetchPageIndexData","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[116,1],"end":[116,112],"bytes":[4033,4144]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[116,1],"end":[116,112],"bytes":[4033,4144]}},{"name":"info","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[116,1],"end":[116,112],"bytes":[4033,4144]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"123:12":{"kind":"call","span":{"start":[123,12],"end":[123,86],"bytes":[4296,4370]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"125:15":{"kind":"call","span":{"start":[125,15],"end":[125,51],"bytes":[4402,4438]},"callee":null},"127:8":{"kind":"call","span":{"start":[127,8],"end":[127,17],"bytes":[4449,4458]},"callee":null},"130:12":{"kind":"call","span":{"start":[130,12],"end":[130,25],"bytes":[4565,4578]},"callee":null},"132:15":{"kind":"call","span":{"start":[132,15],"end":[132,57],"bytes":[4610,4652]},"callee":null},"137:5":{"kind":"call","span":{"start":[137,5],"end":[137,11],"bytes":[4894,4900]},"callee":null},"138:15":{"kind":"call","span":{"start":[138,15],"end":[138,89],"bytes":[4937,5011]},"callee":null},"138:82":{"kind":"call","span":{"start":[138,82],"end":[138,88],"bytes":[5004,5010]},"callee":null},"141:10":{"kind":"call","span":{"start":[141,10],"end":[141,63],"bytes":[5025,5078]},"callee":null},"141:36":{"kind":"call","span":{"start":[141,36],"end":[141,42],"bytes":[5051,5057]},"callee":null},"142:12":{"kind":"call","span":{"start":[142,12],"end":[142,18],"bytes":[5090,5096]},"callee":null},"142:21":{"kind":"call","span":{"start":[142,21],"end":[142,30],"bytes":[5099,5108]},"callee":null},"143:10":{"kind":"call","span":{"start":[143,10],"end":[143,48],"bytes":[5151,5189]},"callee":null},"143:23":{"kind":"call","span":{"start":[143,23],"end":[143,47],"bytes":[5164,5188]},"callee":null},"147:103":{"kind":"call","span":{"start":[147,103],"end":[147,114],"bytes":[5363,5374]},"callee":null},"147:11":{"kind":"call","span":{"start":[147,11],"end":[147,118],"bytes":[5271,5378]},"callee":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"149:15":{"kind":"call","span":{"start":[149,15],"end":[149,51],"bytes":[5410,5446]},"callee":null}}}},"content_hash":"c57b00cfbdeb7e706a61acbdf3ca4d50075167c197082d38eea328b42a7388cb"},"replica_url.go":{"id":"can://go/litestream/replica_url.go","kind":"module","span":{"start":[1,1],"end":[441,1],"bytes":[0,12872]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"path\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n)\n\n// ReplicaClientFactory is a function that creates a ReplicaClient from URL components.\n// The userinfo parameter contains credentials from the URL (e.g., user:pass@host).\ntype ReplicaClientFactory func(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (ReplicaClient, error)\n\nvar (\n\treplicaClientFactories = make(map[string]ReplicaClientFactory)\n\treplicaClientFactoriesMu sync.RWMutex\n)\n\n// RegisterReplicaClientFactory registers a factory function for creating replica clients\n// for a given URL scheme. This is typically called from init() functions in backend packages.\nfunc RegisterReplicaClientFactory(scheme string, factory ReplicaClientFactory) {\n\treplicaClientFactoriesMu.Lock()\n\tdefer replicaClientFactoriesMu.Unlock()\n\treplicaClientFactories[scheme] = factory\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from a URL string.\n// The URL scheme determines which backend is used (s3, gs, abs, file, etc.).\nfunc NewReplicaClientFromURL(rawURL string) (ReplicaClient, error) {\n\tscheme, host, urlPath, query, userinfo, err := ParseReplicaURLWithQuery(rawURL)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Normalize webdavs to webdav\n\tfactoryScheme := scheme\n\tif factoryScheme == \"webdavs\" {\n\t\tfactoryScheme = \"webdav\"\n\t}\n\n\treplicaClientFactoriesMu.RLock()\n\tfactory, ok := replicaClientFactories[factoryScheme]\n\treplicaClientFactoriesMu.RUnlock()\n\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unsupported replica URL scheme: %q\", scheme)\n\t}\n\n\treturn factory(scheme, host, urlPath, query, userinfo)\n}\n\n// ReplicaTypeFromURL returns the replica type from a URL string.\n// Returns empty string if the URL is invalid or has no scheme.\nfunc ReplicaTypeFromURL(rawURL string) string {\n\tif !IsURL(rawURL) {\n\t\treturn \"\"\n\t}\n\tscheme, _, _, _ := ParseReplicaURL(rawURL)\n\tif scheme == \"\" {\n\t\treturn \"\"\n\t}\n\tif scheme == \"webdavs\" {\n\t\treturn \"webdav\"\n\t}\n\treturn scheme\n}\n\n// ParseReplicaURL parses a replica URL and returns the scheme, host, and path.\nfunc ParseReplicaURL(s string) (scheme, host, urlPath string, err error) {\n\tif strings.HasPrefix(strings.ToLower(s), \"s3://arn:\") {\n\t\tscheme, host, urlPath, _, err = parseS3AccessPointURL(s)\n\t\treturn scheme, host, urlPath, err\n\t}\n\n\tscheme, host, urlPath, _, _, err = ParseReplicaURLWithQuery(s)\n\treturn scheme, host, urlPath, err\n}\n\n// ParseReplicaURLWithQuery parses a replica URL and returns query parameters and userinfo.\nfunc ParseReplicaURLWithQuery(s string) (scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo, err error) {\n\t// Handle S3 Access Point ARNs which can't be parsed by standard url.Parse\n\tif strings.HasPrefix(strings.ToLower(s), \"s3://arn:\") {\n\t\tscheme, host, urlPath, query, err := parseS3AccessPointURL(s)\n\t\treturn scheme, host, urlPath, query, nil, err\n\t}\n\n\tu, err := url.Parse(s)\n\tif err != nil {\n\t\treturn \"\", \"\", \"\", nil, nil, err\n\t}\n\n\tswitch u.Scheme {\n\tcase \"file\":\n\t\tscheme, u.Scheme = u.Scheme, \"\"\n\t\t// Remove query params from path for file URLs\n\t\tu.RawQuery = \"\"\n\t\treturn scheme, \"\", path.Clean(u.String()), nil, nil, nil\n\n\tcase \"\":\n\t\treturn u.Scheme, u.Host, u.Path, nil, nil, fmt.Errorf(\"replica url scheme required: %s\", s)\n\n\tdefault:\n\t\treturn u.Scheme, u.Host, strings.TrimPrefix(path.Clean(u.Path), \"/\"), u.Query(), u.User, nil\n\t}\n}\n\n// parseS3AccessPointURL parses an S3 Access Point URL (s3://arn:...).\nfunc parseS3AccessPointURL(s string) (scheme, host, urlPath string, query url.Values, err error) {\n\tconst prefix = \"s3://\"\n\tif !strings.HasPrefix(strings.ToLower(s), prefix) {\n\t\treturn \"\", \"\", \"\", nil, fmt.Errorf(\"invalid s3 access point url: %s\", s)\n\t}\n\n\tarnWithPath := s[len(prefix):]\n\n\t// Split off query string if present\n\tvar queryStr string\n\tif idx := strings.IndexByte(arnWithPath, '?'); idx != -1 {\n\t\tqueryStr = arnWithPath[idx+1:]\n\t\tarnWithPath = arnWithPath[:idx]\n\t}\n\n\tbucket, key, err := splitS3AccessPointARN(arnWithPath)\n\tif err != nil {\n\t\treturn \"\", \"\", \"\", nil, err\n\t}\n\n\t// Parse query string if present\n\tif queryStr != \"\" {\n\t\tquery, err = url.ParseQuery(queryStr)\n\t\tif err != nil {\n\t\t\treturn \"\", \"\", \"\", nil, fmt.Errorf(\"parse query string: %w\", err)\n\t\t}\n\t}\n\n\treturn \"s3\", bucket, CleanReplicaURLPath(key), query, nil\n}\n\n// splitS3AccessPointARN splits an S3 Access Point ARN into bucket and key components.\nfunc splitS3AccessPointARN(s string) (bucket, key string, err error) {\n\tlower := strings.ToLower(s)\n\tconst marker = \":accesspoint/\"\n\tidx := strings.Index(lower, marker)\n\tif idx == -1 {\n\t\treturn \"\", \"\", fmt.Errorf(\"invalid s3 access point arn: %s\", s)\n\t}\n\n\tnameStart := idx + len(marker)\n\tif nameStart \u003e= len(s) {\n\t\treturn \"\", \"\", fmt.Errorf(\"invalid s3 access point arn: %s\", s)\n\t}\n\n\tremainder := s[nameStart:]\n\tslashIdx := strings.IndexByte(remainder, '/')\n\tif slashIdx == -1 {\n\t\treturn s, \"\", nil\n\t}\n\n\tbucketEnd := nameStart + slashIdx\n\tbucket = s[:bucketEnd]\n\tkey = remainder[slashIdx+1:]\n\treturn bucket, key, nil\n}\n\n// CleanReplicaURLPath cleans a URL path for use in replica storage.\nfunc CleanReplicaURLPath(p string) string {\n\tif p == \"\" {\n\t\treturn \"\"\n\t}\n\tcleaned := path.Clean(\"/\" + p)\n\tcleaned = strings.TrimPrefix(cleaned, \"/\")\n\tif cleaned == \".\" {\n\t\treturn \"\"\n\t}\n\treturn cleaned\n}\n\n// RegionFromS3ARN extracts the region from an S3 ARN.\nfunc RegionFromS3ARN(arn string) string {\n\tparts := strings.SplitN(arn, \":\", 6)\n\tif len(parts) \u003e= 4 {\n\t\treturn parts[3]\n\t}\n\treturn \"\"\n}\n\n// BoolQueryValue returns a boolean value from URL query parameters.\n// It checks multiple keys in order and returns the value and whether it was set.\nfunc BoolQueryValue(query url.Values, keys ...string) (value bool, ok bool) {\n\tif query == nil {\n\t\treturn false, false\n\t}\n\tfor _, key := range keys {\n\t\tif raw := query.Get(key); raw != \"\" {\n\t\t\tswitch strings.ToLower(raw) {\n\t\t\tcase \"true\", \"1\", \"t\", \"yes\":\n\t\t\t\treturn true, true\n\t\t\tcase \"false\", \"0\", \"f\", \"no\":\n\t\t\t\treturn false, true\n\t\t\tdefault:\n\t\t\t\treturn false, true\n\t\t\t}\n\t\t}\n\t}\n\treturn false, false\n}\n\n// IntQueryValue returns a positive integer value from URL query parameters.\n// It checks keys in order and returns the value and whether it was set.\n// Returns an error if a present value is not a positive integer.\nfunc IntQueryValue(query url.Values, keys ...string) (value int64, ok bool, err error) {\n\tif query == nil {\n\t\treturn 0, false, nil\n\t}\n\tfor _, key := range keys {\n\t\tif raw := query.Get(key); raw != \"\" {\n\t\t\tn, err := strconv.ParseInt(raw, 10, 64)\n\t\t\tif err != nil || n \u003c= 0 {\n\t\t\t\treturn 0, false, fmt.Errorf(\"invalid value for query parameter %q: %q (must be a positive integer)\", key, raw)\n\t\t\t}\n\t\t\treturn n, true, nil\n\t\t}\n\t}\n\treturn 0, false, nil\n}\n\n// IsHetznerEndpoint returns true if the endpoint is Hetzner object storage service.\nfunc IsHetznerEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".your-objectstorage.com\")\n}\n\n// IsTigrisEndpoint returns true if the endpoint is the Tigris object storage service.\nfunc IsTigrisEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn host == \"fly.storage.tigris.dev\" || host == \"t3.storage.dev\"\n}\n\n// IsGoogleCloudStorageEndpoint returns true if the endpoint is Google Cloud Storage.\nfunc IsGoogleCloudStorageEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\thost = strings.TrimSuffix(host, \".\")\n\n\tlabels := strings.Split(host, \".\")\n\tif len(labels) \u003c 3 ||\n\t\tlabels[len(labels)-2] != \"googleapis\" ||\n\t\tlabels[len(labels)-1] != \"com\" {\n\t\treturn false\n\t}\n\tfor _, label := range labels {\n\t\tif label == \"\" {\n\t\t\treturn false\n\t\t}\n\t}\n\tif len(labels) \u003e 3 {\n\t\tfor _, segment := range strings.Split(labels[1], \"-\") {\n\t\t\tif segment == \"storage\" {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\tfor _, segment := range strings.Split(labels[0], \"-\") {\n\t\tif segment == \"storage\" {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// IsDigitalOceanEndpoint returns true if the endpoint is Digital Ocean Spaces.\nfunc IsDigitalOceanEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".digitaloceanspaces.com\")\n}\n\n// IsBackblazeEndpoint returns true if the endpoint is Backblaze B2.\nfunc IsBackblazeEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".backblazeb2.com\")\n}\n\n// IsFilebaseEndpoint returns true if the endpoint is Filebase.\nfunc IsFilebaseEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn host == \"s3.filebase.com\"\n}\n\n// IsScalewayEndpoint returns true if the endpoint is Scaleway Object Storage.\nfunc IsScalewayEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".scw.cloud\")\n}\n\n// IsCloudflareR2Endpoint returns true if the endpoint is Cloudflare R2.\nfunc IsCloudflareR2Endpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".r2.cloudflarestorage.com\")\n}\n\n// IsSupabaseEndpoint returns true if the endpoint is Supabase Storage S3.\nfunc IsSupabaseEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".supabase.co\")\n}\n\n// IsMinIOEndpoint returns true if the endpoint appears to be MinIO or similar\n// (a custom endpoint with a port number that is not a known cloud provider).\nfunc IsMinIOEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\tif u.Port() == \"\" {\n\t\treturn false\n\t}\n\t// Exclude known cloud providers\n\tif strings.Contains(host, \".amazonaws.com\") ||\n\t\tstrings.Contains(host, \".digitaloceanspaces.com\") ||\n\t\tstrings.Contains(host, \".backblazeb2.com\") ||\n\t\tstrings.Contains(host, \".filebase.com\") ||\n\t\tstrings.Contains(host, \".scw.cloud\") ||\n\t\tstrings.Contains(host, \".r2.cloudflarestorage.com\") ||\n\t\tstrings.Contains(host, \"tigris.dev\") ||\n\t\tstrings.Contains(host, \"t3.storage.dev\") ||\n\t\tstrings.Contains(host, \".supabase.co\") ||\n\t\tstrings.HasSuffix(host, \".your-objectstorage.com\") ||\n\t\tstrings.HasSuffix(host, \".googleapis.com\") {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// IsLocalEndpoint returns true if the endpoint appears to be a local development\n// endpoint (localhost, 127.0.0.1, or private network addresses).\n// These endpoints typically use HTTP instead of HTTPS.\nfunc IsLocalEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\t// Check for common local/development hostnames\n\treturn host == \"localhost\" ||\n\t\thost == \"127.0.0.1\" ||\n\t\tstrings.HasPrefix(host, \"192.168.\") ||\n\t\tstrings.HasPrefix(host, \"10.\") ||\n\t\tstrings.HasPrefix(host, \"172.16.\") ||\n\t\tstrings.HasPrefix(host, \"172.17.\") ||\n\t\tstrings.HasPrefix(host, \"172.18.\") ||\n\t\tstrings.HasPrefix(host, \"172.19.\") ||\n\t\tstrings.HasPrefix(host, \"172.2\") || // 172.20-172.29\n\t\tstrings.HasPrefix(host, \"172.30.\") ||\n\t\tstrings.HasPrefix(host, \"172.31.\") ||\n\t\tstrings.HasSuffix(host, \".local\") ||\n\t\tstrings.HasSuffix(host, \".localhost\")\n}\n\n// EnsureEndpointScheme ensures an endpoint has an HTTP(S) scheme.\n// For local endpoints (localhost, private IPs), it defaults to http://.\n// For all other endpoints (cloud providers), it defaults to https://.\n// Returns the endpoint with scheme and a boolean indicating if a scheme was added.\nfunc EnsureEndpointScheme(endpoint string) (string, bool) {\n\tif endpoint == \"\" {\n\t\treturn \"\", false\n\t}\n\tif strings.HasPrefix(endpoint, \"http://\") || strings.HasPrefix(endpoint, \"https://\") {\n\t\treturn endpoint, false\n\t}\n\t// Default to HTTP for local development endpoints, HTTPS for everything else\n\tif IsLocalEndpoint(endpoint) {\n\t\treturn \"http://\" + endpoint, true\n\t}\n\treturn \"https://\" + endpoint, true\n}\n\nfunc parseEndpoint(endpoint string) (*url.URL, error) {\n\tendpoint = strings.TrimSpace(endpoint)\n\tif !strings.HasPrefix(strings.ToLower(endpoint), \"http://\") \u0026\u0026 !strings.HasPrefix(strings.ToLower(endpoint), \"https://\") {\n\t\tendpoint = \"//\" + endpoint\n\t}\n\tu, err := url.Parse(endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif u.User != nil {\n\t\treturn nil, fmt.Errorf(\"endpoint must not contain user information\")\n\t}\n\tif u.Hostname() == \"\" {\n\t\treturn nil, fmt.Errorf(\"endpoint hostname required\")\n\t}\n\tu.Host = strings.ToLower(u.Host)\n\treturn u, nil\n}\n\n// IsURL returns true if s appears to be a URL (has a scheme).\nvar isURLRegex = regexp.MustCompile(`^\\w+:\\/\\/`)\n\nfunc IsURL(s string) bool {\n\treturn isURLRegex.MatchString(s)\n}\n","imports":[{"name":"fmt","path":"fmt","span":{"start":[4,1],"end":[4,7],"bytes":[29,35]}},{"name":"url","path":"net/url","span":{"start":[5,1],"end":[5,11],"bytes":[36,46]}},{"name":"path","path":"path","span":{"start":[6,1],"end":[6,8],"bytes":[47,54]}},{"name":"regexp","path":"regexp","span":{"start":[7,1],"end":[7,10],"bytes":[55,64]}},{"name":"strconv","path":"strconv","span":{"start":[8,1],"end":[8,11],"bytes":[65,75]}},{"name":"strings","path":"strings","span":{"start":[9,1],"end":[9,11],"bytes":[76,86]}},{"name":"sync","path":"sync","span":{"start":[10,1],"end":[10,8],"bytes":[87,94]}}],"types":{"ReplicaClientFactory":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ReplicaClientFactory","kind":"struct","span":{"start":[15,1],"end":[15,126],"bytes":[270,395]},"callables":{}}},"functions":{"github.com/benbjohnson/litestream.BoolQueryValue":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue","kind":"function","span":{"start":[192,1],"end":[209,2],"bytes":[5585,5988]},"signature":"github.com/benbjohnson/litestream.BoolQueryValue","parameters":[{"name":"query","type":"net/url.Values","span":{"start":[192,1],"end":[192,78],"bytes":[5585,5662]}},{"name":"keys","type":"[]string","span":{"start":[192,1],"end":[192,78],"bytes":[5585,5662]},"is_variadic":true}],"return_type":"(bool, bool)","metrics":{"cyclomatic":8},"body":{"197:13":{"kind":"call","span":{"start":[197,13],"end":[197,27],"bytes":[5747,5761]},"callee":null},"198:11":{"kind":"call","span":{"start":[198,11],"end":[198,31],"bytes":[5785,5805]},"callee":null}}},"github.com/benbjohnson/litestream.CleanReplicaURLPath":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath","kind":"function","span":{"start":[169,1],"end":[179,2],"bytes":[5038,5240]},"signature":"github.com/benbjohnson/litestream.CleanReplicaURLPath","parameters":[{"name":"p","type":"string","span":{"start":[169,1],"end":[169,44],"bytes":[5038,5081]}}],"return_type":"string","metrics":{"cyclomatic":3},"body":{"173:13":{"kind":"call","span":{"start":[173,13],"end":[173,32],"bytes":[5123,5142]},"callee":null},"174:12":{"kind":"call","span":{"start":[174,12],"end":[174,44],"bytes":[5154,5186]},"callee":null}}},"github.com/benbjohnson/litestream.EnsureEndpointScheme":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","kind":"function","span":{"start":[402,1],"end":[414,2],"bytes":[11737,12143]},"signature":"github.com/benbjohnson/litestream.EnsureEndpointScheme","parameters":[{"name":"endpoint","type":"string","span":{"start":[402,1],"end":[402,60],"bytes":[11737,11796]}}],"return_type":"(string, bool)","metrics":{"cyclomatic":4},"body":{"406:47":{"kind":"call","span":{"start":[406,47],"end":[406,86],"bytes":[11886,11925]},"callee":null},"406:5":{"kind":"call","span":{"start":[406,5],"end":[406,43],"bytes":[11844,11882]},"callee":null},"410:5":{"kind":"call","span":{"start":[410,5],"end":[410,30],"bytes":[12039,12064]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint"}}},"github.com/benbjohnson/litestream.IntQueryValue":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","kind":"function","span":{"start":[214,1],"end":[228,2],"bytes":[6206,6653]},"signature":"github.com/benbjohnson/litestream.IntQueryValue","parameters":[{"name":"query","type":"net/url.Values","span":{"start":[214,1],"end":[214,89],"bytes":[6206,6294]}},{"name":"keys","type":"[]string","span":{"start":[214,1],"end":[214,89],"bytes":[6206,6294]},"is_variadic":true}],"return_type":"(int64, bool, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"219:13":{"kind":"call","span":{"start":[219,13],"end":[219,27],"bytes":[6380,6394]},"callee":null},"220:14":{"kind":"call","span":{"start":[220,14],"end":[220,43],"bytes":[6421,6450]},"callee":null},"222:22":{"kind":"call","span":{"start":[222,22],"end":[222,115],"bytes":[6501,6594]},"callee":null}}},"github.com/benbjohnson/litestream.IsBackblazeEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","kind":"function","span":{"start":[296,1],"end":[303,2],"bytes":[8359,8553]},"signature":"github.com/benbjohnson/litestream.IsBackblazeEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[296,1],"end":[296,49],"bytes":[8359,8407]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"297:12":{"kind":"call","span":{"start":[297,12],"end":[297,35],"bytes":[8419,8442]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"301:10":{"kind":"call","span":{"start":[301,10],"end":[301,22],"bytes":[8487,8499]},"callee":null},"302:9":{"kind":"call","span":{"start":[302,9],"end":[302,52],"bytes":[8508,8551]},"callee":null}}},"github.com/benbjohnson/litestream.IsCloudflareR2Endpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","kind":"function","span":{"start":[326,1],"end":[333,2],"bytes":[9137,9343]},"signature":"github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[326,1],"end":[326,52],"bytes":[9137,9188]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"327:12":{"kind":"call","span":{"start":[327,12],"end":[327,35],"bytes":[9200,9223]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"331:10":{"kind":"call","span":{"start":[331,10],"end":[331,22],"bytes":[9268,9280]},"callee":null},"332:9":{"kind":"call","span":{"start":[332,9],"end":[332,61],"bytes":[9289,9341]},"callee":null}}},"github.com/benbjohnson/litestream.IsDigitalOceanEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","kind":"function","span":{"start":[286,1],"end":[293,2],"bytes":[8084,8288]},"signature":"github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[286,1],"end":[286,52],"bytes":[8084,8135]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"287:12":{"kind":"call","span":{"start":[287,12],"end":[287,35],"bytes":[8147,8170]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"291:10":{"kind":"call","span":{"start":[291,10],"end":[291,22],"bytes":[8215,8227]},"callee":null},"292:9":{"kind":"call","span":{"start":[292,9],"end":[292,59],"bytes":[8236,8286]},"callee":null}}},"github.com/benbjohnson/litestream.IsFilebaseEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","kind":"function","span":{"start":[306,1],"end":[313,2],"bytes":[8619,8794]},"signature":"github.com/benbjohnson/litestream.IsFilebaseEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[306,1],"end":[306,48],"bytes":[8619,8666]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"307:12":{"kind":"call","span":{"start":[307,12],"end":[307,35],"bytes":[8678,8701]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"311:10":{"kind":"call","span":{"start":[311,10],"end":[311,22],"bytes":[8746,8758]},"callee":null}}},"github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","kind":"function","span":{"start":[251,1],"end":[283,2],"bytes":[7324,8002]},"signature":"github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[251,1],"end":[251,58],"bytes":[7324,7381]}}],"return_type":"bool","metrics":{"cyclomatic":10},"body":{"252:12":{"kind":"call","span":{"start":[252,12],"end":[252,35],"bytes":[7393,7416]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"256:10":{"kind":"call","span":{"start":[256,10],"end":[256,22],"bytes":[7461,7473]},"callee":null},"257:9":{"kind":"call","span":{"start":[257,9],"end":[257,38],"bytes":[7482,7511]},"callee":null},"259:12":{"kind":"call","span":{"start":[259,12],"end":[259,36],"bytes":[7524,7548]},"callee":null},"260:5":{"kind":"call","span":{"start":[260,5],"end":[260,16],"bytes":[7553,7564]},"callee":null},"261:10":{"kind":"call","span":{"start":[261,10],"end":[261,21],"bytes":[7581,7592]},"callee":null},"262:10":{"kind":"call","span":{"start":[262,10],"end":[262,21],"bytes":[7624,7635]},"callee":null},"270:5":{"kind":"call","span":{"start":[270,5],"end":[270,16],"bytes":[7746,7757]},"callee":null},"271:27":{"kind":"call","span":{"start":[271,27],"end":[271,56],"bytes":[7790,7819]},"callee":null},"277:26":{"kind":"call","span":{"start":[277,26],"end":[277,55],"bytes":[7905,7934]},"callee":null}}},"github.com/benbjohnson/litestream.IsHetznerEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","kind":"function","span":{"start":[231,1],"end":[238,2],"bytes":[6740,6939]},"signature":"github.com/benbjohnson/litestream.IsHetznerEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[231,1],"end":[231,47],"bytes":[6740,6786]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"232:12":{"kind":"call","span":{"start":[232,12],"end":[232,35],"bytes":[6798,6821]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"236:10":{"kind":"call","span":{"start":[236,10],"end":[236,22],"bytes":[6866,6878]},"callee":null},"237:9":{"kind":"call","span":{"start":[237,9],"end":[237,59],"bytes":[6887,6937]},"callee":null}}},"github.com/benbjohnson/litestream.IsLocalEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","kind":"function","span":{"start":[376,1],"end":[396,2],"bytes":[10746,11440]},"signature":"github.com/benbjohnson/litestream.IsLocalEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[376,1],"end":[376,45],"bytes":[10746,10790]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"377:12":{"kind":"call","span":{"start":[377,12],"end":[377,35],"bytes":[10802,10825]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"381:10":{"kind":"call","span":{"start":[381,10],"end":[381,22],"bytes":[10870,10882]},"callee":null},"385:3":{"kind":"call","span":{"start":[385,3],"end":[385,38],"bytes":[10990,11025]},"callee":null},"386:3":{"kind":"call","span":{"start":[386,3],"end":[386,33],"bytes":[11031,11061]},"callee":null},"387:3":{"kind":"call","span":{"start":[387,3],"end":[387,37],"bytes":[11067,11101]},"callee":null},"388:3":{"kind":"call","span":{"start":[388,3],"end":[388,37],"bytes":[11107,11141]},"callee":null},"389:3":{"kind":"call","span":{"start":[389,3],"end":[389,37],"bytes":[11147,11181]},"callee":null},"390:3":{"kind":"call","span":{"start":[390,3],"end":[390,37],"bytes":[11187,11221]},"callee":null},"391:3":{"kind":"call","span":{"start":[391,3],"end":[391,35],"bytes":[11227,11259]},"callee":null},"392:3":{"kind":"call","span":{"start":[392,3],"end":[392,37],"bytes":[11282,11316]},"callee":null},"393:3":{"kind":"call","span":{"start":[393,3],"end":[393,37],"bytes":[11322,11356]},"callee":null},"394:3":{"kind":"call","span":{"start":[394,3],"end":[394,36],"bytes":[11362,11395]},"callee":null},"395:3":{"kind":"call","span":{"start":[395,3],"end":[395,40],"bytes":[11401,11438]},"callee":null}}},"github.com/benbjohnson/litestream.IsMinIOEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","kind":"function","span":{"start":[347,1],"end":[371,2],"bytes":[9768,10540]},"signature":"github.com/benbjohnson/litestream.IsMinIOEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[347,1],"end":[347,45],"bytes":[9768,9812]}}],"return_type":"bool","metrics":{"cyclomatic":4},"body":{"348:12":{"kind":"call","span":{"start":[348,12],"end":[348,35],"bytes":[9824,9847]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"352:10":{"kind":"call","span":{"start":[352,10],"end":[352,22],"bytes":[9892,9904]},"callee":null},"353:5":{"kind":"call","span":{"start":[353,5],"end":[353,13],"bytes":[9909,9917]},"callee":null},"357:5":{"kind":"call","span":{"start":[357,5],"end":[357,45],"bytes":[9982,10022]},"callee":null},"358:3":{"kind":"call","span":{"start":[358,3],"end":[358,52],"bytes":[10028,10077]},"callee":null},"359:3":{"kind":"call","span":{"start":[359,3],"end":[359,45],"bytes":[10083,10125]},"callee":null},"360:3":{"kind":"call","span":{"start":[360,3],"end":[360,42],"bytes":[10131,10170]},"callee":null},"361:3":{"kind":"call","span":{"start":[361,3],"end":[361,39],"bytes":[10176,10212]},"callee":null},"362:3":{"kind":"call","span":{"start":[362,3],"end":[362,54],"bytes":[10218,10269]},"callee":null},"363:3":{"kind":"call","span":{"start":[363,3],"end":[363,39],"bytes":[10275,10311]},"callee":null},"364:3":{"kind":"call","span":{"start":[364,3],"end":[364,43],"bytes":[10317,10357]},"callee":null},"365:3":{"kind":"call","span":{"start":[365,3],"end":[365,41],"bytes":[10363,10401]},"callee":null},"366:3":{"kind":"call","span":{"start":[366,3],"end":[366,53],"bytes":[10407,10457]},"callee":null},"367:3":{"kind":"call","span":{"start":[367,3],"end":[367,45],"bytes":[10463,10505]},"callee":null}}},"github.com/benbjohnson/litestream.IsScalewayEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","kind":"function","span":{"start":[316,1],"end":[323,2],"bytes":[8875,9062]},"signature":"github.com/benbjohnson/litestream.IsScalewayEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[316,1],"end":[316,48],"bytes":[8875,8922]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"317:12":{"kind":"call","span":{"start":[317,12],"end":[317,35],"bytes":[8934,8957]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"321:10":{"kind":"call","span":{"start":[321,10],"end":[321,22],"bytes":[9002,9014]},"callee":null},"322:9":{"kind":"call","span":{"start":[322,9],"end":[322,46],"bytes":[9023,9060]},"callee":null}}},"github.com/benbjohnson/litestream.IsSupabaseEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","kind":"function","span":{"start":[336,1],"end":[343,2],"bytes":[9420,9609]},"signature":"github.com/benbjohnson/litestream.IsSupabaseEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[336,1],"end":[336,48],"bytes":[9420,9467]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"337:12":{"kind":"call","span":{"start":[337,12],"end":[337,35],"bytes":[9479,9502]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"341:10":{"kind":"call","span":{"start":[341,10],"end":[341,22],"bytes":[9547,9559]},"callee":null},"342:9":{"kind":"call","span":{"start":[342,9],"end":[342,48],"bytes":[9568,9607]},"callee":null}}},"github.com/benbjohnson/litestream.IsTigrisEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","kind":"function","span":{"start":[241,1],"end":[248,2],"bytes":[7028,7236]},"signature":"github.com/benbjohnson/litestream.IsTigrisEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[241,1],"end":[241,46],"bytes":[7028,7073]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"242:12":{"kind":"call","span":{"start":[242,12],"end":[242,35],"bytes":[7085,7108]},"callee":null},"246:10":{"kind":"call","span":{"start":[246,10],"end":[246,22],"bytes":[7153,7165]},"callee":null}}},"github.com/benbjohnson/litestream.IsURL":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL","kind":"function","span":{"start":[438,1],"end":[440,2],"bytes":[12808,12871]},"signature":"github.com/benbjohnson/litestream.IsURL","parameters":[{"name":"s","type":"string","span":{"start":[438,1],"end":[438,28],"bytes":[12808,12835]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"439:9":{"kind":"call","span":{"start":[439,9],"end":[439,34],"bytes":[12844,12869]},"callee":null}}},"github.com/benbjohnson/litestream.NewReplicaClientFromURL":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","kind":"function","span":{"start":[32,1],"end":[53,2],"bytes":[1048,1625]},"signature":"github.com/benbjohnson/litestream.NewReplicaClientFromURL","parameters":[{"name":"rawURL","type":"string","span":{"start":[32,1],"end":[32,69],"bytes":[1048,1116]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"33:49":{"kind":"call","span":{"start":[33,49],"end":[33,81],"bytes":[1165,1197]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery"},"44:2":{"kind":"call","span":{"start":[44,2],"end":[44,34],"bytes":[1359,1391]},"callee":null},"46:2":{"kind":"call","span":{"start":[46,2],"end":[46,36],"bytes":[1447,1481]},"callee":null},"49:15":{"kind":"call","span":{"start":[49,15],"end":[49,71],"bytes":[1507,1563]},"callee":null},"52:9":{"kind":"call","span":{"start":[52,9],"end":[52,56],"bytes":[1576,1623]},"callee":null}}},"github.com/benbjohnson/litestream.ParseReplicaURL":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","kind":"function","span":{"start":[72,1],"end":[80,2],"bytes":[2064,2395]},"signature":"github.com/benbjohnson/litestream.ParseReplicaURL","parameters":[{"name":"s","type":"string","span":{"start":[72,1],"end":[72,75],"bytes":[2064,2138]}}],"return_type":"(string, string, string, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"73:23":{"kind":"call","span":{"start":[73,23],"end":[73,41],"bytes":[2161,2179]},"callee":null},"73:5":{"kind":"call","span":{"start":[73,5],"end":[73,55],"bytes":[2143,2193]},"callee":null},"74:35":{"kind":"call","span":{"start":[74,35],"end":[74,59],"bytes":[2230,2254]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL"},"78:37":{"kind":"call","span":{"start":[78,37],"end":[78,64],"bytes":[2331,2358]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery"}}},"github.com/benbjohnson/litestream.ParseReplicaURLWithQuery":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","kind":"function","span":{"start":[83,1],"end":[108,2],"bytes":[2489,3352]},"signature":"github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","parameters":[{"name":"s","type":"string","span":{"start":[83,1],"end":[83,126],"bytes":[2489,2614]}}],"return_type":"(string, string, string, net/url.Values, *net/url.Userinfo, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"100:22":{"kind":"call","span":{"start":[100,22],"end":[100,44],"bytes":[3099,3121]},"callee":null},"100:33":{"kind":"call","span":{"start":[100,33],"end":[100,43],"bytes":[3110,3120]},"callee":null},"103:46":{"kind":"call","span":{"start":[103,46],"end":[103,94],"bytes":[3193,3241]},"callee":null},"106:28":{"kind":"call","span":{"start":[106,28],"end":[106,71],"bytes":[3280,3323]},"callee":null},"106:47":{"kind":"call","span":{"start":[106,47],"end":[106,65],"bytes":[3299,3317]},"callee":null},"106:73":{"kind":"call","span":{"start":[106,73],"end":[106,82],"bytes":[3325,3334]},"callee":null},"85:23":{"kind":"call","span":{"start":[85,23],"end":[85,41],"bytes":[2713,2731]},"callee":null},"85:5":{"kind":"call","span":{"start":[85,5],"end":[85,55],"bytes":[2695,2745]},"callee":null},"86:40":{"kind":"call","span":{"start":[86,40],"end":[86,64],"bytes":[2787,2811]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL"},"90:12":{"kind":"call","span":{"start":[90,12],"end":[90,24],"bytes":[2875,2887]},"callee":null}}},"github.com/benbjohnson/litestream.RegionFromS3ARN":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN","kind":"function","span":{"start":[182,1],"end":[188,2],"bytes":[5297,5432]},"signature":"github.com/benbjohnson/litestream.RegionFromS3ARN","parameters":[{"name":"arn","type":"string","span":{"start":[182,1],"end":[182,42],"bytes":[5297,5338]}}],"return_type":"string","metrics":{"cyclomatic":2},"body":{"183:11":{"kind":"call","span":{"start":[183,11],"end":[183,38],"bytes":[5349,5376]},"callee":null},"184:5":{"kind":"call","span":{"start":[184,5],"end":[184,15],"bytes":[5381,5391]},"callee":null}}},"github.com/benbjohnson/litestream.RegisterReplicaClientFactory":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","kind":"function","span":{"start":[24,1],"end":[28,2],"bytes":[696,894]},"signature":"github.com/benbjohnson/litestream.RegisterReplicaClientFactory","parameters":[{"name":"scheme","type":"string","span":{"start":[24,1],"end":[24,81],"bytes":[696,776]}},{"name":"factory","type":"github.com/benbjohnson/litestream.ReplicaClientFactory","span":{"start":[24,1],"end":[24,81],"bytes":[696,776]}}],"metrics":{"cyclomatic":1},"body":{"25:2":{"kind":"call","span":{"start":[25,2],"end":[25,33],"bytes":[778,809]},"callee":null},"26:8":{"kind":"call","span":{"start":[26,8],"end":[26,41],"bytes":[817,850]},"callee":null}}},"github.com/benbjohnson/litestream.ReplicaTypeFromURL":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL","kind":"function","span":{"start":[57,1],"end":[69,2],"bytes":[1757,1982]},"signature":"github.com/benbjohnson/litestream.ReplicaTypeFromURL","parameters":[{"name":"rawURL","type":"string","span":{"start":[57,1],"end":[57,48],"bytes":[1757,1804]}}],"return_type":"string","metrics":{"cyclomatic":4},"body":{"58:6":{"kind":"call","span":{"start":[58,6],"end":[58,19],"bytes":[1810,1823]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL"},"61:21":{"kind":"call","span":{"start":[61,21],"end":[61,44],"bytes":[1861,1884]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"}}},"github.com/benbjohnson/litestream.parseEndpoint":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","kind":"function","span":{"start":[416,1],"end":[433,2],"bytes":[12145,12693]},"signature":"github.com/benbjohnson/litestream.parseEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[416,1],"end":[416,56],"bytes":[12145,12200]}}],"return_type":"(*net/url.URL, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"417:13":{"kind":"call","span":{"start":[417,13],"end":[417,40],"bytes":[12213,12240]},"callee":null},"418:24":{"kind":"call","span":{"start":[418,24],"end":[418,49],"bytes":[12264,12289]},"callee":null},"418:6":{"kind":"call","span":{"start":[418,6],"end":[418,61],"bytes":[12246,12301]},"callee":null},"418:66":{"kind":"call","span":{"start":[418,66],"end":[418,122],"bytes":[12306,12362]},"callee":null},"418:84":{"kind":"call","span":{"start":[418,84],"end":[418,109],"bytes":[12324,12349]},"callee":null},"421:12":{"kind":"call","span":{"start":[421,12],"end":[421,31],"bytes":[12408,12427]},"callee":null},"426:15":{"kind":"call","span":{"start":[426,15],"end":[426,71],"bytes":[12500,12556]},"callee":null},"428:5":{"kind":"call","span":{"start":[428,5],"end":[428,17],"bytes":[12564,12576]},"callee":null},"429:15":{"kind":"call","span":{"start":[429,15],"end":[429,55],"bytes":[12599,12639]},"callee":null},"431:11":{"kind":"call","span":{"start":[431,11],"end":[431,34],"bytes":[12653,12676]},"callee":null}}},"github.com/benbjohnson/litestream.parseS3AccessPointURL":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","kind":"function","span":{"start":[111,1],"end":[140,2],"bytes":[3425,4260]},"signature":"github.com/benbjohnson/litestream.parseS3AccessPointURL","parameters":[{"name":"s","type":"string","span":{"start":[111,1],"end":[111,99],"bytes":[3425,3523]}}],"return_type":"(string, string, string, net/url.Values, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"113:24":{"kind":"call","span":{"start":[113,24],"end":[113,42],"bytes":[3571,3589]},"callee":null},"113:6":{"kind":"call","span":{"start":[113,6],"end":[113,51],"bytes":[3553,3598]},"callee":null},"114:27":{"kind":"call","span":{"start":[114,27],"end":[114,75],"bytes":[3627,3675]},"callee":null},"117:19":{"kind":"call","span":{"start":[117,19],"end":[117,30],"bytes":[3698,3709]},"callee":null},"121:12":{"kind":"call","span":{"start":[121,12],"end":[121,47],"bytes":[3783,3818]},"callee":null},"126:22":{"kind":"call","span":{"start":[126,22],"end":[126,56],"bytes":[3924,3958]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN"},"133:16":{"kind":"call","span":{"start":[133,16],"end":[133,40],"bytes":[4080,4104]},"callee":null},"135:28":{"kind":"call","span":{"start":[135,28],"end":[135,69],"bytes":[4150,4191]},"callee":null},"139:23":{"kind":"call","span":{"start":[139,23],"end":[139,47],"bytes":[4222,4246]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath"}}},"github.com/benbjohnson/litestream.splitS3AccessPointARN":{"id":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN","kind":"function","span":{"start":[143,1],"end":[166,2],"bytes":[4349,4967]},"signature":"github.com/benbjohnson/litestream.splitS3AccessPointARN","parameters":[{"name":"s","type":"string","span":{"start":[143,1],"end":[143,71],"bytes":[4349,4419]}}],"return_type":"(string, string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"144:11":{"kind":"call","span":{"start":[144,11],"end":[144,29],"bytes":[4430,4448]},"callee":null},"146:9":{"kind":"call","span":{"start":[146,9],"end":[146,37],"bytes":[4489,4517]},"callee":null},"148:18":{"kind":"call","span":{"start":[148,18],"end":[148,66],"bytes":[4551,4599]},"callee":null},"151:21":{"kind":"call","span":{"start":[151,21],"end":[151,32],"bytes":[4624,4635]},"callee":null},"152:18":{"kind":"call","span":{"start":[152,18],"end":[152,24],"bytes":[4653,4659]},"callee":null},"153:18":{"kind":"call","span":{"start":[153,18],"end":[153,66],"bytes":[4679,4727]},"callee":null},"157:14":{"kind":"call","span":{"start":[157,14],"end":[157,47],"bytes":[4773,4806]},"callee":null}}}},"content_hash":"3318488c0af38c6a7bbfc5a90fdc41b5a46c6c930a36298f5a909e5a1976d854"},"s3/leaser.go":{"id":"can://go/litestream/s3/leaser.go","kind":"module","span":{"start":[1,1],"end":[306,1],"bytes":[0,6926]},"package":"s3","source":"package s3\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\nconst (\n\tDefaultLeaseTTL = 30 * time.Second\n\tDefaultLeasePath = \"lock.json\"\n\tLeaserType = \"s3\"\n)\n\nvar (\n\t_ litestream.Leaser = (*Leaser)(nil)\n\n\tErrLeaseRequired = errors.New(\"lease required\")\n\tErrLeaseETagRequired = errors.New(\"lease etag required\")\n\tErrLeaseAlreadyReleased = errors.New(\"lease already released\")\n)\n\n// S3API is the interface for S3 operations needed by Leaser.\ntype S3API interface {\n\tGetObject(ctx context.Context, params *s3.GetObjectInput, optFns ...func(*s3.Options)) (*s3.GetObjectOutput, error)\n\tPutObject(ctx context.Context, params *s3.PutObjectInput, optFns ...func(*s3.Options)) (*s3.PutObjectOutput, error)\n\tDeleteObject(ctx context.Context, params *s3.DeleteObjectInput, optFns ...func(*s3.Options)) (*s3.DeleteObjectOutput, error)\n}\n\ntype Leaser struct {\n\ts3 S3API\n\tlogger *slog.Logger\n\n\tBucket string\n\tPath string\n\tTTL time.Duration\n\tOwner string\n}\n\nfunc NewLeaser() *Leaser {\n\towner, _ := os.Hostname()\n\tif owner == \"\" {\n\t\towner = fmt.Sprintf(\"pid-%d\", os.Getpid())\n\t} else {\n\t\towner = fmt.Sprintf(\"%s:%d\", owner, os.Getpid())\n\t}\n\n\treturn \u0026Leaser{\n\t\tlogger: slog.Default().WithGroup(\"s3-leaser\"),\n\t\tTTL: DefaultLeaseTTL,\n\t\tOwner: owner,\n\t}\n}\n\nfunc (l *Leaser) SetLogger(logger *slog.Logger) {\n\tl.logger = logger.WithGroup(\"s3-leaser\")\n}\n\nfunc (l *Leaser) Client() S3API {\n\treturn l.s3\n}\n\nfunc (l *Leaser) SetClient(client S3API) {\n\tl.s3 = client\n}\n\nfunc (l *Leaser) Type() string {\n\treturn LeaserType\n}\n\nfunc (l *Leaser) lockKey() string {\n\tif l.Path == \"\" {\n\t\treturn DefaultLeasePath\n\t}\n\treturn l.Path + \"/\" + DefaultLeasePath\n}\n\nfunc (l *Leaser) AcquireLease(ctx context.Context) (*litestream.Lease, error) {\n\texisting, etag, err := l.readLease(ctx)\n\tif err != nil \u0026\u0026 !errors.Is(err, os.ErrNotExist) {\n\t\treturn nil, fmt.Errorf(\"read existing lease: %w\", err)\n\t}\n\n\tif existing != nil \u0026\u0026 !existing.IsExpired() {\n\t\treturn nil, \u0026litestream.LeaseExistsError{\n\t\t\tOwner: existing.Owner,\n\t\t\tExpiresAt: existing.ExpiresAt,\n\t\t}\n\t}\n\n\tvar generation int64 = 1\n\tif existing != nil {\n\t\tgeneration = existing.Generation + 1\n\t}\n\n\tnewLease := \u0026litestream.Lease{\n\t\tGeneration: generation,\n\t\tExpiresAt: time.Now().Add(l.TTL),\n\t\tOwner: l.Owner,\n\t}\n\n\tnewETag, err := l.writeLease(ctx, newLease, etag)\n\tif err != nil {\n\t\tvar leaseErr *litestream.LeaseExistsError\n\t\tif errors.As(err, \u0026leaseErr) {\n\t\t\tif current, _, readErr := l.readLease(ctx); readErr == nil \u0026\u0026 current != nil {\n\t\t\t\treturn nil, \u0026litestream.LeaseExistsError{\n\t\t\t\t\tOwner: current.Owner,\n\t\t\t\t\tExpiresAt: current.ExpiresAt,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil, err\n\t}\n\n\tnewLease.ETag = newETag\n\tl.logger.Debug(\"lease acquired\",\n\t\t\"generation\", newLease.Generation,\n\t\t\"owner\", newLease.Owner,\n\t\t\"expires_at\", newLease.ExpiresAt,\n\t\t\"etag\", newLease.ETag)\n\n\treturn newLease, nil\n}\n\nfunc (l *Leaser) RenewLease(ctx context.Context, lease *litestream.Lease) (*litestream.Lease, error) {\n\tif lease == nil {\n\t\treturn nil, ErrLeaseRequired\n\t}\n\tif lease.ETag == \"\" {\n\t\treturn nil, ErrLeaseETagRequired\n\t}\n\n\tnewLease := \u0026litestream.Lease{\n\t\tGeneration: lease.Generation,\n\t\tExpiresAt: time.Now().Add(l.TTL),\n\t\tOwner: l.Owner,\n\t}\n\n\tnewETag, err := l.writeLease(ctx, newLease, lease.ETag)\n\tif err != nil {\n\t\tvar leaseErr *litestream.LeaseExistsError\n\t\tif errors.As(err, \u0026leaseErr) {\n\t\t\treturn nil, litestream.ErrLeaseNotHeld\n\t\t}\n\t\treturn nil, err\n\t}\n\n\tnewLease.ETag = newETag\n\tl.logger.Debug(\"lease renewed\",\n\t\t\"generation\", newLease.Generation,\n\t\t\"owner\", newLease.Owner,\n\t\t\"expires_at\", newLease.ExpiresAt,\n\t\t\"etag\", newLease.ETag)\n\n\treturn newLease, nil\n}\n\nfunc (l *Leaser) ReleaseLease(ctx context.Context, lease *litestream.Lease) error {\n\tif lease == nil {\n\t\treturn ErrLeaseRequired\n\t}\n\tif lease.ETag == \"\" {\n\t\treturn ErrLeaseETagRequired\n\t}\n\n\tkey := l.lockKey()\n\t_, err := l.s3.DeleteObject(ctx, \u0026s3.DeleteObjectInput{\n\t\tBucket: aws.String(l.Bucket),\n\t\tKey: aws.String(key),\n\t\tIfMatch: aws.String(lease.ETag),\n\t})\n\tif err != nil {\n\t\tif isNotExists(err) || isNotFoundError(err) {\n\t\t\treturn ErrLeaseAlreadyReleased\n\t\t}\n\t\tif isPreconditionFailed(err) {\n\t\t\treturn litestream.ErrLeaseNotHeld\n\t\t}\n\t\treturn fmt.Errorf(\"delete lease: %w\", err)\n\t}\n\n\tl.logger.Debug(\"lease released\",\n\t\t\"generation\", lease.Generation,\n\t\t\"owner\", lease.Owner)\n\n\treturn nil\n}\n\nfunc (l *Leaser) readLease(ctx context.Context) (*litestream.Lease, string, error) {\n\tkey := l.lockKey()\n\n\tout, err := l.s3.GetObject(ctx, \u0026s3.GetObjectInput{\n\t\tBucket: aws.String(l.Bucket),\n\t\tKey: aws.String(key),\n\t})\n\tif err != nil {\n\t\tif isNotExists(err) || isNotFoundError(err) {\n\t\t\treturn nil, \"\", os.ErrNotExist\n\t\t}\n\t\treturn nil, \"\", fmt.Errorf(\"get lock file: %w\", err)\n\t}\n\tdefer out.Body.Close()\n\n\tvar lease litestream.Lease\n\tif err := json.NewDecoder(out.Body).Decode(\u0026lease); err != nil {\n\t\treturn nil, \"\", fmt.Errorf(\"decode lock file: %w\", err)\n\t}\n\n\tetag := \"\"\n\tif out.ETag != nil {\n\t\tetag = *out.ETag\n\t}\n\tlease.ETag = etag\n\n\treturn \u0026lease, etag, nil\n}\n\nfunc (l *Leaser) writeLease(ctx context.Context, lease *litestream.Lease, etag string) (string, error) {\n\tkey := l.lockKey()\n\n\tdata, err := json.Marshal(lease)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"marshal lock file: %w\", err)\n\t}\n\n\tinput := \u0026s3.PutObjectInput{\n\t\tBucket: aws.String(l.Bucket),\n\t\tKey: aws.String(key),\n\t\tBody: bytes.NewReader(data),\n\t\tContentType: aws.String(\"application/json\"),\n\t}\n\n\tif etag == \"\" {\n\t\tinput.IfNoneMatch = aws.String(\"*\")\n\t} else {\n\t\tinput.IfMatch = aws.String(etag)\n\t}\n\n\tout, err := l.s3.PutObject(ctx, input)\n\tif err != nil {\n\t\tif isPreconditionFailed(err) {\n\t\t\treturn \"\", \u0026litestream.LeaseExistsError{}\n\t\t}\n\t\treturn \"\", fmt.Errorf(\"put lock file: %w\", err)\n\t}\n\n\tnewETag := \"\"\n\tif out.ETag != nil {\n\t\tnewETag = *out.ETag\n\t}\n\n\treturn newETag, nil\n}\n\nfunc isPreconditionFailed(err error) bool {\n\tvar apiErr smithy.APIError\n\tif errors.As(err, \u0026apiErr) {\n\t\tcode := apiErr.ErrorCode()\n\t\treturn code == \"PreconditionFailed\" || code == \"412\"\n\t}\n\n\tvar respErr *smithy.OperationError\n\tif errors.As(err, \u0026respErr) {\n\t\tif httpErr, ok := respErr.Err.(interface{ HTTPStatusCode() int }); ok {\n\t\t\treturn httpErr.HTTPStatusCode() == 412\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc isNotFoundError(err error) bool {\n\tvar apiErr smithy.APIError\n\tif errors.As(err, \u0026apiErr) {\n\t\tcode := apiErr.ErrorCode()\n\t\treturn code == \"NoSuchKey\" || code == \"NotFound\" || code == \"404\"\n\t}\n\n\tvar noSuchKey *types.NoSuchKey\n\tif errors.As(err, \u0026noSuchKey) {\n\t\treturn true\n\t}\n\n\tvar respErr *smithy.OperationError\n\tif errors.As(err, \u0026respErr) {\n\t\tif httpErr, ok := respErr.Err.(interface{ HTTPStatusCode() int }); ok {\n\t\t\treturn httpErr.HTTPStatusCode() == 404\n\t\t}\n\t}\n\n\treturn false\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[21,29]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[30,40]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[41,57]}},{"name":"errors","path":"errors","span":{"start":[7,1],"end":[7,10],"bytes":[58,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[75,86]}},{"name":"os","path":"os","span":{"start":[10,1],"end":[10,6],"bytes":[87,92]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[93,100]}},{"name":"aws","path":"github.com/aws/aws-sdk-go-v2/aws","span":{"start":[13,1],"end":[13,36],"bytes":[102,137]}},{"name":"s3","path":"github.com/aws/aws-sdk-go-v2/service/s3","span":{"start":[14,1],"end":[14,43],"bytes":[138,180]}},{"name":"types","path":"github.com/aws/aws-sdk-go-v2/service/s3/types","span":{"start":[15,1],"end":[15,49],"bytes":[181,229]}},{"name":"smithy-go","path":"github.com/aws/smithy-go","span":{"start":[16,1],"end":[16,28],"bytes":[230,257]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[18,1],"end":[18,37],"bytes":[259,295]}}],"types":{"Leaser":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser","kind":"struct","span":{"start":[42,1],"end":[50,2],"bytes":[1081,1206]},"callables":{"github.com/benbjohnson/litestream/s3.Leaser.AcquireLease":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","kind":"method","span":{"start":[90,1],"end":[136,2],"bytes":[1894,3088]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[90,1],"end":[90,80],"bytes":[1894,1973]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"110:15":{"kind":"call","span":{"start":[110,15],"end":[110,25],"bytes":[2454,2464]},"callee":null},"114:18":{"kind":"call","span":{"start":[114,18],"end":[114,51],"bytes":[2521,2554]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease"},"117:6":{"kind":"call","span":{"start":[117,6],"end":[117,31],"bytes":[2621,2646]},"callee":null},"118:30":{"kind":"call","span":{"start":[118,30],"end":[118,46],"bytes":[2678,2694]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease"},"129:2":{"kind":"call","span":{"start":[129,2],"end":[133,25],"bytes":[2906,3063]},"callee":null},"91:25":{"kind":"call","span":{"start":[91,25],"end":[91,41],"bytes":[1998,2014]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease"},"92:20":{"kind":"call","span":{"start":[92,20],"end":[92,50],"bytes":[2034,2064]},"callee":null},"93:15":{"kind":"call","span":{"start":[93,15],"end":[93,57],"bytes":[2081,2123]},"callee":null},"96:25":{"kind":"call","span":{"start":[96,25],"end":[96,45],"bytes":[2152,2172]},"callee":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired"}}},"github.com/benbjohnson/litestream/s3.Leaser.Client":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.Client","kind":"method","span":{"start":[71,1],"end":[73,2],"bytes":[1601,1649]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.Client","parameters":[],"return_type":"github.com/benbjohnson/litestream/s3.S3API","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","kind":"method","span":{"start":[171,1],"end":[200,2],"bytes":[3864,4562]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[171,1],"end":[171,84],"bytes":[3864,3947]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[171,1],"end":[171,84],"bytes":[3864,3947]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"179:9":{"kind":"call","span":{"start":[179,9],"end":[179,20],"bytes":[4061,4072]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey"},"180:12":{"kind":"call","span":{"start":[180,12],"end":[184,4],"bytes":[4084,4229]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.DeleteObject"},"181:12":{"kind":"call","span":{"start":[181,12],"end":[181,32],"bytes":[4141,4161]},"callee":null},"182:12":{"kind":"call","span":{"start":[182,12],"end":[182,27],"bytes":[4174,4189]},"callee":null},"183:12":{"kind":"call","span":{"start":[183,12],"end":[183,34],"bytes":[4202,4224]},"callee":null},"186:26":{"kind":"call","span":{"start":[186,26],"end":[186,46],"bytes":[4272,4292]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError"},"186:6":{"kind":"call","span":{"start":[186,6],"end":[186,22],"bytes":[4252,4268]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"189:6":{"kind":"call","span":{"start":[189,6],"end":[189,31],"bytes":[4338,4363]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed"},"192:10":{"kind":"call","span":{"start":[192,10],"end":[192,45],"bytes":[4416,4451]},"callee":null},"195:2":{"kind":"call","span":{"start":[195,2],"end":[197,24],"bytes":[4457,4547]},"callee":null}}},"github.com/benbjohnson/litestream/s3.Leaser.RenewLease":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease","kind":"method","span":{"start":[138,1],"end":[169,2],"bytes":[3090,3862]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.RenewLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[138,1],"end":[138,103],"bytes":[3090,3192]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[138,1],"end":[138,103],"bytes":[3090,3192]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"148:15":{"kind":"call","span":{"start":[148,15],"end":[148,25],"bytes":[3386,3396]},"callee":null},"152:18":{"kind":"call","span":{"start":[152,18],"end":[152,57],"bytes":[3453,3492]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease"},"155:6":{"kind":"call","span":{"start":[155,6],"end":[155,31],"bytes":[3559,3584]},"callee":null},"162:2":{"kind":"call","span":{"start":[162,2],"end":[166,25],"bytes":[3681,3837]},"callee":null}}},"github.com/benbjohnson/litestream/s3.Leaser.SetClient":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.SetClient","kind":"method","span":{"start":[75,1],"end":[77,2],"bytes":[1651,1710]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.SetClient","parameters":[{"name":"client","type":"github.com/benbjohnson/litestream/s3.S3API","span":{"start":[75,1],"end":[75,43],"bytes":[1651,1693]}}],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.Leaser.SetLogger":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.SetLogger","kind":"method","span":{"start":[67,1],"end":[69,2],"bytes":[1506,1599]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[67,1],"end":[67,50],"bytes":[1506,1555]}}],"metrics":{"cyclomatic":1},"body":{"68:13":{"kind":"call","span":{"start":[68,13],"end":[68,42],"bytes":[1568,1597]},"callee":null}}},"github.com/benbjohnson/litestream/s3.Leaser.Type":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.Type","kind":"method","span":{"start":[79,1],"end":[81,2],"bytes":[1712,1765]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.Leaser.lockKey":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey","kind":"method","span":{"start":[83,1],"end":[88,2],"bytes":[1767,1892]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.lockKey","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{}},"github.com/benbjohnson/litestream/s3.Leaser.readLease":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","kind":"method","span":{"start":[202,1],"end":[229,2],"bytes":[4564,5231]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.readLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[202,1],"end":[202,85],"bytes":[4564,4648]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, string, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"203:9":{"kind":"call","span":{"start":[203,9],"end":[203,20],"bytes":[4657,4668]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey"},"205:14":{"kind":"call","span":{"start":[205,14],"end":[208,4],"bytes":[4683,4785]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.GetObject"},"206:11":{"kind":"call","span":{"start":[206,11],"end":[206,31],"bytes":[4733,4753]},"callee":null},"207:11":{"kind":"call","span":{"start":[207,11],"end":[207,26],"bytes":[4765,4780]},"callee":null},"210:26":{"kind":"call","span":{"start":[210,26],"end":[210,46],"bytes":[4828,4848]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError"},"210:6":{"kind":"call","span":{"start":[210,6],"end":[210,22],"bytes":[4808,4824]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"213:19":{"kind":"call","span":{"start":[213,19],"end":[213,55],"bytes":[4907,4943]},"callee":null},"215:8":{"kind":"call","span":{"start":[215,8],"end":[215,24],"bytes":[4954,4970]},"callee":null},"218:12":{"kind":"call","span":{"start":[218,12],"end":[218,37],"bytes":[5011,5036]},"callee":null},"219:19":{"kind":"call","span":{"start":[219,19],"end":[219,58],"bytes":[5084,5123]},"callee":null}}},"github.com/benbjohnson/litestream/s3.Leaser.writeLease":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","kind":"method","span":{"start":[231,1],"end":[266,2],"bytes":[5233,6038]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.writeLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[231,1],"end":[231,105],"bytes":[5233,5337]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[231,1],"end":[231,105],"bytes":[5233,5337]}},{"name":"etag","type":"string","span":{"start":[231,1],"end":[231,105],"bytes":[5233,5337]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"232:9":{"kind":"call","span":{"start":[232,9],"end":[232,20],"bytes":[5346,5357]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey"},"234:15":{"kind":"call","span":{"start":[234,15],"end":[234,34],"bytes":[5373,5392]},"callee":null},"236:14":{"kind":"call","span":{"start":[236,14],"end":[236,54],"bytes":[5423,5463]},"callee":null},"240:16":{"kind":"call","span":{"start":[240,16],"end":[240,36],"bytes":[5513,5533]},"callee":null},"241:16":{"kind":"call","span":{"start":[241,16],"end":[241,31],"bytes":[5550,5565]},"callee":null},"242:16":{"kind":"call","span":{"start":[242,16],"end":[242,37],"bytes":[5582,5603]},"callee":null},"243:16":{"kind":"call","span":{"start":[243,16],"end":[243,46],"bytes":[5620,5650]},"callee":null},"247:23":{"kind":"call","span":{"start":[247,23],"end":[247,38],"bytes":[5695,5710]},"callee":null},"249:19":{"kind":"call","span":{"start":[249,19],"end":[249,35],"bytes":[5739,5755]},"callee":null},"252:14":{"kind":"call","span":{"start":[252,14],"end":[252,40],"bytes":[5773,5799]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.PutObject"},"254:6":{"kind":"call","span":{"start":[254,6],"end":[254,31],"bytes":[5822,5847]},"callee":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed"},"257:14":{"kind":"call","span":{"start":[257,14],"end":[257,50],"bytes":[5912,5948]},"callee":null}}}},"fields":{"Bucket":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/Bucket","kind":"field","type":"string","span":{"start":[46,1],"end":[46,15],"bytes":[1138,1152]}},"Owner":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/Owner","kind":"field","type":"string","span":{"start":[49,1],"end":[49,15],"bytes":[1190,1204]}},"Path":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/Path","kind":"field","type":"string","span":{"start":[47,1],"end":[47,15],"bytes":[1153,1167]}},"TTL":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/TTL","kind":"field","type":"time.Duration","span":{"start":[48,1],"end":[48,22],"bytes":[1168,1189]}},"logger":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[44,1],"end":[44,21],"bytes":[1116,1136]}},"s3":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/s3","kind":"field","type":"github.com/benbjohnson/litestream/s3.S3API","span":{"start":[43,1],"end":[43,14],"bytes":[1102,1115]}}}},"S3API":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API","kind":"interface","span":{"start":[36,1],"end":[40,2],"bytes":[695,1079]},"callables":{"github.com/benbjohnson/litestream/s3.S3API.DeleteObject":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.DeleteObject","kind":"method","span":{"start":[39,1],"end":[39,126],"bytes":[952,1077]},"signature":"github.com/benbjohnson/litestream/s3.S3API.DeleteObject","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[39,1],"end":[39,126],"bytes":[952,1077]}},{"name":"params","type":"*github.com/aws/aws-sdk-go-v2/service/s3.DeleteObjectInput","span":{"start":[39,1],"end":[39,126],"bytes":[952,1077]}},{"name":"optFns","type":"[]func(*github.com/aws/aws-sdk-go-v2/service/s3.Options)","span":{"start":[39,1],"end":[39,126],"bytes":[952,1077]},"is_variadic":true}],"return_type":"(*github.com/aws/aws-sdk-go-v2/service/s3.DeleteObjectOutput, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream/s3.S3API.GetObject":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.GetObject","kind":"method","span":{"start":[37,1],"end":[37,117],"bytes":[718,834]},"signature":"github.com/benbjohnson/litestream/s3.S3API.GetObject","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[37,1],"end":[37,117],"bytes":[718,834]}},{"name":"params","type":"*github.com/aws/aws-sdk-go-v2/service/s3.GetObjectInput","span":{"start":[37,1],"end":[37,117],"bytes":[718,834]}},{"name":"optFns","type":"[]func(*github.com/aws/aws-sdk-go-v2/service/s3.Options)","span":{"start":[37,1],"end":[37,117],"bytes":[718,834]},"is_variadic":true}],"return_type":"(*github.com/aws/aws-sdk-go-v2/service/s3.GetObjectOutput, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream/s3.S3API.PutObject":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.PutObject","kind":"method","span":{"start":[38,1],"end":[38,117],"bytes":[835,951]},"signature":"github.com/benbjohnson/litestream/s3.S3API.PutObject","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[38,1],"end":[38,117],"bytes":[835,951]}},{"name":"params","type":"*github.com/aws/aws-sdk-go-v2/service/s3.PutObjectInput","span":{"start":[38,1],"end":[38,117],"bytes":[835,951]}},{"name":"optFns","type":"[]func(*github.com/aws/aws-sdk-go-v2/service/s3.Options)","span":{"start":[38,1],"end":[38,117],"bytes":[835,951]},"is_variadic":true}],"return_type":"(*github.com/aws/aws-sdk-go-v2/service/s3.PutObjectOutput, error)","error_channel":["error"],"body":{}}}}},"functions":{"github.com/benbjohnson/litestream/s3.NewLeaser":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser","kind":"function","span":{"start":[52,1],"end":[65,2],"bytes":[1208,1504]},"signature":"github.com/benbjohnson/litestream/s3.NewLeaser","parameters":[],"return_type":"*github.com/benbjohnson/litestream/s3.Leaser","metrics":{"cyclomatic":2},"body":{"53:14":{"kind":"call","span":{"start":[53,14],"end":[53,27],"bytes":[1248,1261]},"callee":null},"55:11":{"kind":"call","span":{"start":[55,11],"end":[55,45],"bytes":[1290,1324]},"callee":null},"55:33":{"kind":"call","span":{"start":[55,33],"end":[55,44],"bytes":[1312,1323]},"callee":null},"57:11":{"kind":"call","span":{"start":[57,11],"end":[57,51],"bytes":[1345,1385]},"callee":null},"57:39":{"kind":"call","span":{"start":[57,39],"end":[57,50],"bytes":[1373,1384]},"callee":null},"61:11":{"kind":"call","span":{"start":[61,11],"end":[61,25],"bytes":[1417,1431]},"callee":null}}},"github.com/benbjohnson/litestream/s3.isNotFoundError":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError","kind":"function","span":{"start":[285,1],"end":[305,2],"bytes":[6438,6925]},"signature":"github.com/benbjohnson/litestream/s3.isNotFoundError","parameters":[{"name":"err","type":"error","span":{"start":[285,1],"end":[285,39],"bytes":[6438,6476]}}],"return_type":"bool","metrics":{"cyclomatic":5},"body":{"287:5":{"kind":"call","span":{"start":[287,5],"end":[287,28],"bytes":[6509,6532]},"callee":null},"288:11":{"kind":"call","span":{"start":[288,11],"end":[288,29],"bytes":[6545,6563]},"callee":null},"293:5":{"kind":"call","span":{"start":[293,5],"end":[293,31],"bytes":[6672,6698]},"callee":null},"298:5":{"kind":"call","span":{"start":[298,5],"end":[298,29],"bytes":[6759,6783]},"callee":null},"300:11":{"kind":"call","span":{"start":[300,11],"end":[300,35],"bytes":[6870,6894]},"callee":null}}},"github.com/benbjohnson/litestream/s3.isPreconditionFailed":{"id":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed","kind":"function","span":{"start":[268,1],"end":[283,2],"bytes":[6040,6436]},"signature":"github.com/benbjohnson/litestream/s3.isPreconditionFailed","parameters":[{"name":"err","type":"error","span":{"start":[268,1],"end":[268,44],"bytes":[6040,6083]}}],"return_type":"bool","metrics":{"cyclomatic":4},"body":{"270:5":{"kind":"call","span":{"start":[270,5],"end":[270,28],"bytes":[6116,6139]},"callee":null},"271:11":{"kind":"call","span":{"start":[271,11],"end":[271,29],"bytes":[6152,6170]},"callee":null},"276:5":{"kind":"call","span":{"start":[276,5],"end":[276,29],"bytes":[6270,6294]},"callee":null},"278:11":{"kind":"call","span":{"start":[278,11],"end":[278,35],"bytes":[6381,6405]},"callee":null}}}},"content_hash":"3afed52bb5e6a612b0bbc2455ed5859e2b178afbd4759edb491a0e127012b345"},"s3/replica_client.go":{"id":"can://go/litestream/s3/replica_client.go","kind":"module","span":{"start":[1,1],"end":[1894,1],"bytes":[0,58711]},"package":"s3","source":"package s3\n\nimport (\n\t\"bytes\"\n\t\"cmp\"\n\t\"context\"\n\t\"crypto/md5\"\n\t\"crypto/tls\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/ratelimit\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\tv4 \"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/s3/manager\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go\"\n\tsmithyxml \"github.com/aws/smithy-go/encoding/xml\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/errgroup\"\n\t\"golang.org/x/sync/semaphore\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"s3\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"s3\"\n\n// MetadataKeyTimestamp is the metadata key for storing LTX file timestamps in S3.\nconst MetadataKeyTimestamp = \"litestream-timestamp\"\n\n// MaxKeys is the number of keys S3 can operate on per batch.\nconst MaxKeys = 1000\n\n// DefaultRegion is the region used if one is not specified.\nconst DefaultRegion = \"us-east-1\"\n\n// DefaultMetadataConcurrency is the default number of concurrent HeadObject calls\n// for fetching accurate timestamps during timestamp-based restore.\n// S3 can handle 5,500+ HEAD requests per second per prefix.\nconst DefaultMetadataConcurrency = 50\n\n// DefaultR2Concurrency is the default number of concurrent multipart upload\n// parts for Cloudflare R2, which has strict concurrent upload limits.\nconst DefaultR2Concurrency = 2\n\n// DefaultTigrisConcurrency is the default number of concurrent multipart\n// upload parts for Tigris, which has strict concurrent upload limits.\nconst DefaultTigrisConcurrency = 2\n\n// DefaultTigrisPartSize is the default multipart upload part size for Tigris.\nconst DefaultTigrisPartSize = 16 * 1024 * 1024\n\n// contentMD5StackKey is used to pass the precomputed Content-MD5 checksum\n// through the middleware stack from Serialize to Finalize phase.\ntype contentMD5StackKey struct{}\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\nvar _ litestream.ReplicaClientV3 = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to S3.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\ts3 *s3.Client // s3 service\n\tuploader *manager.Uploader\n\tlogger *slog.Logger\n\n\t// AWS authentication keys.\n\tAccessKeyID string\n\tSecretAccessKey string\n\n\t// S3 bucket information\n\tRegion string\n\tBucket string\n\tPath string\n\tEndpoint string\n\tForcePathStyle bool\n\tSkipVerify bool\n\tSignPayload bool\n\tSignAcceptEncoding bool\n\tRequireContentMD5 bool\n\tStorageClass string\n\n\t// Upload configuration\n\tPartSize int64 // Part size for multipart uploads (default: 5MB)\n\tConcurrency int // Number of concurrent parts to upload (default: 5)\n\n\t// MetadataConcurrency controls parallel HeadObject calls for timestamp-based restore.\n\t// Higher values improve restore speed for large backup histories.\n\t// Default: 50 (S3 can handle 5,500+ HEAD/s per prefix)\n\tMetadataConcurrency int\n\n\t// Server-Side Encryption - Customer Provided Keys (SSE-C)\n\t// Works with all S3-compatible providers (AWS, MinIO, Exoscale, etc.)\n\tSSECustomerAlgorithm string // Must be \"AES256\" if set\n\tSSECustomerKey string // Base64-encoded 256-bit (32 byte) encryption key\n\tSSECustomerKeyMD5 string // Base64-encoded MD5 of key (auto-computed if not set)\n\n\t// Server-Side Encryption - AWS KMS (SSE-KMS)\n\t// Only works with AWS S3 (not S3-compatible providers)\n\tSSEKMSKeyID string // KMS key ID, ARN, or alias\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tRequireContentMD5: true,\n\t\tSignPayload: true,\n\t\tSignAcceptEncoding: true,\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\tvar (\n\t\tbucket string\n\t\tregion string\n\t\tendpoint string\n\t\tforcePathStyle bool\n\t\tskipVerify bool\n\t\tsignPayload bool\n\t\tsignPayloadSet bool\n\t\tsignAcceptEncoding bool\n\t\tsignAcceptEncodingSet bool\n\t\trequireMD5 bool\n\t\trequireMD5Set bool\n\t\tconcurrency int\n\t\tconcurrencySet bool\n\t\tpartSize int64\n\t\tstorageClass string\n\t)\n\n\t// Parse host for bucket and region\n\tif strings.HasPrefix(host, \"arn:\") {\n\t\tbucket = host\n\t\tregion = litestream.RegionFromS3ARN(host)\n\t} else {\n\t\tbucket, region, endpoint, forcePathStyle = ParseHost(host)\n\t}\n\n\t// Override with query parameters if provided\n\tif qEndpoint := query.Get(\"endpoint\"); qEndpoint != \"\" {\n\t\t// Ensure endpoint has a scheme (defaults to https:// for cloud, http:// for local)\n\t\tqEndpoint, _ = litestream.EnsureEndpointScheme(qEndpoint)\n\t\tendpoint = qEndpoint\n\t\t// Default to path style for custom endpoints unless explicitly set to false\n\t\tif v, ok := litestream.BoolQueryValue(query, \"forcePathStyle\", \"force-path-style\"); !ok || v {\n\t\t\tforcePathStyle = true\n\t\t}\n\t}\n\tif qRegion := query.Get(\"region\"); qRegion != \"\" {\n\t\tregion = qRegion\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"forcePathStyle\", \"force-path-style\"); ok {\n\t\tforcePathStyle = v\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"skipVerify\", \"skip-verify\"); ok {\n\t\tskipVerify = v\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"signPayload\", \"sign-payload\"); ok {\n\t\tsignPayload = v\n\t\tsignPayloadSet = true\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"signAcceptEncoding\", \"sign-accept-encoding\"); ok {\n\t\tsignAcceptEncoding = v\n\t\tsignAcceptEncodingSet = true\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"requireContentMD5\", \"require-content-md5\"); ok {\n\t\trequireMD5 = v\n\t\trequireMD5Set = true\n\t}\n\tif v, ok, err := litestream.IntQueryValue(query, \"concurrency\"); err != nil {\n\t\treturn nil, err\n\t} else if ok {\n\t\tconcurrency = int(v)\n\t\tconcurrencySet = true\n\t}\n\tif v, ok, err := litestream.IntQueryValue(query, \"partSize\", \"part-size\"); err != nil {\n\t\treturn nil, err\n\t} else if ok {\n\t\tpartSize = v\n\t}\n\tif v := query.Get(\"storageClass\"); v != \"\" {\n\t\tstorageClass = v\n\t} else if v := query.Get(\"storage-class\"); v != \"\" {\n\t\tstorageClass = v\n\t}\n\n\t// Ensure bucket is set\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for s3 replica URL\")\n\t}\n\n\t// Track if forcePathStyle was explicitly set via query parameter.\n\tforcePathStyleSet := query.Get(\"forcePathStyle\") != \"\" || query.Get(\"force-path-style\") != \"\"\n\n\t// Read authentication from environment variables\n\tif v := os.Getenv(\"AWS_ACCESS_KEY_ID\"); v != \"\" {\n\t\tclient.AccessKeyID = v\n\t} else if v := os.Getenv(\"LITESTREAM_ACCESS_KEY_ID\"); v != \"\" {\n\t\tclient.AccessKeyID = v\n\t}\n\tif v := os.Getenv(\"AWS_SECRET_ACCESS_KEY\"); v != \"\" {\n\t\tclient.SecretAccessKey = v\n\t} else if v := os.Getenv(\"LITESTREAM_SECRET_ACCESS_KEY\"); v != \"\" {\n\t\tclient.SecretAccessKey = v\n\t}\n\n\tif endpoint == \"\" {\n\t\tif v := os.Getenv(\"LITESTREAM_S3_ENDPOINT\"); v != \"\" {\n\t\t\tendpoint, _ = litestream.EnsureEndpointScheme(v)\n\t\t\tif !forcePathStyleSet {\n\t\t\t\tforcePathStyle = true\n\t\t\t}\n\t\t}\n\t}\n\n\t// Detect S3-compatible provider endpoints for applying appropriate defaults.\n\tisHetzner := litestream.IsHetznerEndpoint(endpoint)\n\tisTigris := litestream.IsTigrisEndpoint(endpoint)\n\tisDigitalOcean := litestream.IsDigitalOceanEndpoint(endpoint)\n\tisBackblaze := litestream.IsBackblazeEndpoint(endpoint)\n\tisFilebase := litestream.IsFilebaseEndpoint(endpoint)\n\tisScaleway := litestream.IsScalewayEndpoint(endpoint)\n\tisCloudflareR2 := litestream.IsCloudflareR2Endpoint(endpoint)\n\tisMinIO := litestream.IsMinIOEndpoint(endpoint)\n\tisSupabase := litestream.IsSupabaseEndpoint(endpoint)\n\n\t// Apply provider-specific defaults for S3-compatible providers.\n\tif isTigris {\n\t\t// Tigris: requires signed payloads, no MD5\n\t\tif !signPayloadSet {\n\t\t\tsignPayload, signPayloadSet = true, true\n\t\t}\n\t\tif !requireMD5Set {\n\t\t\trequireMD5, requireMD5Set = false, true\n\t\t}\n\t\tif !concurrencySet {\n\t\t\tclient.Concurrency = DefaultTigrisConcurrency\n\t\t}\n\t\tif partSize == 0 {\n\t\t\tclient.PartSize = DefaultTigrisPartSize\n\t\t}\n\t}\n\tif isHetzner || isDigitalOcean || isBackblaze || isFilebase || isScaleway || isCloudflareR2 || isMinIO || isSupabase {\n\t\t// All these providers require signed payloads (don't support UNSIGNED-PAYLOAD)\n\t\tif !signPayloadSet {\n\t\t\tsignPayload, signPayloadSet = true, true\n\t\t}\n\t}\n\tif !forcePathStyleSet {\n\t\t// Filebase, Backblaze B2, MinIO, and Supabase require path-style URLs\n\t\tif isFilebase || isBackblaze || isMinIO || isSupabase {\n\t\t\tforcePathStyle = true\n\t\t}\n\t}\n\tif isCloudflareR2 {\n\t\tclient.Concurrency = DefaultR2Concurrency\n\t}\n\n\t// Configure client\n\tclient.Bucket = bucket\n\tclient.Path = urlPath\n\tclient.Region = region\n\tclient.Endpoint = endpoint\n\tclient.ForcePathStyle = forcePathStyle\n\tclient.SkipVerify = skipVerify\n\n\tif signPayloadSet {\n\t\tclient.SignPayload = signPayload\n\t}\n\tif signAcceptEncodingSet {\n\t\tclient.SignAcceptEncoding = signAcceptEncoding\n\t}\n\tif requireMD5Set {\n\t\tclient.RequireContentMD5 = requireMD5\n\t}\n\tif concurrencySet {\n\t\tclient.Concurrency = concurrency\n\t}\n\tif partSize \u003e 0 {\n\t\tclient.PartSize = partSize\n\t}\n\tclient.StorageClass = storageClass\n\n\t// Parse SSE-C parameters from query string\n\tif v := query.Get(\"sseCustomerAlgorithm\"); v != \"\" {\n\t\tclient.SSECustomerAlgorithm = v\n\t} else if v := query.Get(\"sse-customer-algorithm\"); v != \"\" {\n\t\tclient.SSECustomerAlgorithm = v\n\t}\n\tif v := query.Get(\"sseCustomerKey\"); v != \"\" {\n\t\tclient.SSECustomerKey = v\n\t} else if v := query.Get(\"sse-customer-key\"); v != \"\" {\n\t\tclient.SSECustomerKey = v\n\t}\n\tif v := query.Get(\"sseCustomerKeyMD5\"); v != \"\" {\n\t\tclient.SSECustomerKeyMD5 = v\n\t} else if v := query.Get(\"sse-customer-key-md5\"); v != \"\" {\n\t\tclient.SSECustomerKeyMD5 = v\n\t}\n\n\t// Parse SSE-KMS parameters from query string\n\tif v := query.Get(\"sseKmsKeyId\"); v != \"\" {\n\t\tclient.SSEKMSKeyID = v\n\t} else if v := query.Get(\"sse-kms-key-id\"); v != \"\" {\n\t\tclient.SSEKMSKeyID = v\n\t}\n\n\treturn client, nil\n}\n\n// Type returns \"s3\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to S3. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) (err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.s3 != nil {\n\t\treturn nil\n\t}\n\n\t// Validate required configuration\n\tif c.Bucket == \"\" {\n\t\treturn fmt.Errorf(\"s3: bucket name is required\")\n\t}\n\n\t// Validate SSE configuration\n\tif err := c.validateSSEConfig(); err != nil {\n\t\treturn err\n\t}\n\n\t// Look up region if not specified and no endpoint is used.\n\t// Endpoints are typically used for non-S3 object stores and do not\n\t// necessarily require a region.\n\tregion := c.Region\n\tif region == \"\" {\n\t\tif c.Endpoint == \"\" {\n\t\t\tif region, err = c.findBucketRegion(ctx, c.Bucket); err != nil {\n\t\t\t\treturn fmt.Errorf(\"s3: cannot lookup bucket region: %w\", err)\n\t\t\t}\n\t\t} else {\n\t\t\tregion = DefaultRegion // default for non-S3 object stores\n\t\t}\n\t}\n\n\t// Create HTTP client with 24 hour timeout for long-running operations\n\thttpClient := \u0026http.Client{\n\t\tTimeout: 24 * time.Hour,\n\t}\n\n\t// Always configure custom HTTP Transport with controlled keepalive settings\n\t// to reduce idle CPU usage from default transport's aggressive keepalives.\n\t// See: https://github.com/benbjohnson/litestream/issues/992\n\thttpClient.Transport = \u0026http.Transport{\n\t\tProxy: http.ProxyFromEnvironment,\n\t\tDialContext: (\u0026net.Dialer{\n\t\t\tTimeout: 30 * time.Second,\n\t\t\tKeepAlive: 30 * time.Second,\n\t\t}).DialContext,\n\t\tForceAttemptHTTP2: true,\n\t\tMaxIdleConns: 100,\n\t\tIdleConnTimeout: 90 * time.Second,\n\t\tTLSHandshakeTimeout: 10 * time.Second,\n\t\tExpectContinueTimeout: 1 * time.Second,\n\t}\n\n\t// Configure TLS to skip verification if requested\n\tif c.SkipVerify {\n\t\thttpClient.Transport.(*http.Transport).TLSClientConfig = \u0026tls.Config{\n\t\t\tInsecureSkipVerify: true,\n\t\t}\n\t}\n\n\t// Build configuration options\n\tconfigOpts := []func(*config.LoadOptions) error{\n\t\tconfig.WithRegion(region),\n\t\tconfig.WithRetryer(newTransportRetryer),\n\t}\n\n\t// Add HTTP client with proper timeout\n\tconfigOpts = append(configOpts, config.WithHTTPClient(httpClient))\n\n\t// Add static credentials if provided, otherwise use default credential chain\n\t// Default credential chain includes:\n\t// - Environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)\n\t// - Shared credentials file (~/.aws/credentials)\n\t// - EC2 Instance Profile credentials\n\t// - ECS Task Role credentials\n\t// - Web Identity Token credentials (for EKS)\n\tif c.AccessKeyID != \"\" \u0026\u0026 c.SecretAccessKey != \"\" {\n\t\tconfigOpts = append(configOpts, config.WithCredentialsProvider(\n\t\t\tcredentials.NewStaticCredentialsProvider(c.AccessKeyID, c.SecretAccessKey, \"\"),\n\t\t))\n\t}\n\n\t// Enable AWS SDK debug logging if LITESTREAM_S3_DEBUG is set.\n\t// Useful for debugging S3-compatible providers (signing issues, request/response bodies).\n\t// Supports comma-separated values: signing,request,retries\n\t// Values: signing, request, request-with-body, response, response-with-body, retries, all\n\tif logMode := parseS3DebugEnv(); logMode != 0 {\n\t\tconfigOpts = append(configOpts, config.WithClientLogMode(logMode))\n\t}\n\n\t// Load AWS configuration\n\tcfg, err := config.LoadDefaultConfig(ctx, configOpts...)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"s3: cannot load aws config: %w\", err)\n\t}\n\n\t// Create S3 client options\n\ts3Opts := []func(*s3.Options){\n\t\tfunc(o *s3.Options) {\n\t\t\to.UsePathStyle = c.ForcePathStyle\n\t\t\to.UseARNRegion = true\n\t\t\t// Add User-Agent and optional middleware.\n\t\t\to.APIOptions = append(o.APIOptions, c.middlewareOption())\n\t\t},\n\t}\n\n\t// S3-compatible providers (Tigris, Backblaze B2, MinIO, Filebase, etc.) don't\n\t// support aws-chunked content encoding used by default checksum calculation\n\t// in AWS SDK Go v2 v1.73.0+. Disable automatic checksum calculation and\n\t// response checksum validation for all custom endpoints.\n\t// See: https://github.com/benbjohnson/litestream/issues/918\n\t// See: https://github.com/benbjohnson/litestream/issues/947\n\tif c.Endpoint != \"\" {\n\t\ts3Opts = append(s3Opts, func(o *s3.Options) {\n\t\t\to.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired\n\t\t\to.ResponseChecksumValidation = aws.ResponseChecksumValidationWhenRequired\n\t\t})\n\t}\n\n\t// Add custom endpoint if specified\n\tc.configureEndpoint(\u0026s3Opts)\n\n\t// Create S3 client\n\tc.s3 = s3.NewFromConfig(cfg, s3Opts...)\n\n\t// Configure uploader with custom options if specified\n\tuploaderOpts := []func(*manager.Uploader){}\n\n\t// For S3-compatible providers, disable automatic checksum calculation on the Uploader.\n\t// The S3 client's RequestChecksumCalculation setting only affects single-part uploads.\n\t// Multipart uploads via the Uploader require this separate setting (added in s3/manager v1.20.0).\n\t// See: https://github.com/benbjohnson/litestream/issues/948\n\t// See: https://github.com/aws/aws-sdk-go-v2/issues/3007\n\tif c.Endpoint != \"\" {\n\t\tuploaderOpts = append(uploaderOpts, func(u *manager.Uploader) {\n\t\t\tu.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired\n\t\t})\n\t}\n\n\tif c.PartSize \u003e 0 {\n\t\tuploaderOpts = append(uploaderOpts, func(u *manager.Uploader) {\n\t\t\tu.PartSize = c.PartSize\n\t\t})\n\t}\n\tif c.Concurrency \u003e 0 {\n\t\tuploaderOpts = append(uploaderOpts, func(u *manager.Uploader) {\n\t\t\tu.Concurrency = c.Concurrency\n\t\t})\n\t}\n\tc.uploader = manager.NewUploader(c.s3, uploaderOpts...)\n\n\treturn nil\n}\n\n// configureEndpoint adds custom endpoint configuration to S3 client options if needed.\nfunc (c *ReplicaClient) configureEndpoint(opts *[]func(*s3.Options)) {\n\tif c.Endpoint != \"\" {\n\t\t*opts = append(*opts, func(o *s3.Options) {\n\t\t\to.UsePathStyle = c.ForcePathStyle\n\n\t\t\tendpoint := c.Endpoint\n\t\t\t// Add scheme if not present\n\t\t\tif !strings.HasPrefix(endpoint, \"http://\") \u0026\u0026 !strings.HasPrefix(endpoint, \"https://\") {\n\t\t\t\tendpoint = \"https://\" + endpoint\n\t\t\t}\n\n\t\t\to.BaseEndpoint = aws.String(endpoint)\n\t\t\t// For MinIO and other S3-compatible services\n\t\t\tif strings.HasPrefix(endpoint, \"http://\") {\n\t\t\t\to.EndpointOptions.DisableHTTPS = true\n\t\t\t}\n\t\t})\n\t}\n}\n\n// validateSSEConfig validates server-side encryption configuration.\nfunc (c *ReplicaClient) validateSSEConfig() error {\n\t// Check mutual exclusivity: SSE-C and SSE-KMS cannot both be set\n\tif c.SSECustomerKey != \"\" \u0026\u0026 c.SSEKMSKeyID != \"\" {\n\t\treturn fmt.Errorf(\"s3: cannot use both sse-customer-key and sse-kms-key-id; they are mutually exclusive\")\n\t}\n\n\t// Validate SSE-C configuration\n\tif c.SSECustomerKey != \"\" {\n\t\t// Algorithm must be AES256 (or default to it)\n\t\tif c.SSECustomerAlgorithm == \"\" {\n\t\t\tc.SSECustomerAlgorithm = \"AES256\"\n\t\t} else if c.SSECustomerAlgorithm != \"AES256\" {\n\t\t\treturn fmt.Errorf(\"s3: sse-customer-algorithm must be AES256, got %q\", c.SSECustomerAlgorithm)\n\t\t}\n\n\t\t// Validate key is valid base64 and correct length (256 bits = 32 bytes)\n\t\tkeyBytes, err := base64.StdEncoding.DecodeString(c.SSECustomerKey)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"s3: sse-customer-key must be valid base64: %w\", err)\n\t\t}\n\t\tif len(keyBytes) != 32 {\n\t\t\treturn fmt.Errorf(\"s3: sse-customer-key must be 256-bit (32 bytes) when decoded, got %d bytes\", len(keyBytes))\n\t\t}\n\n\t\t// Auto-compute MD5 if not provided\n\t\tif c.SSECustomerKeyMD5 == \"\" {\n\t\t\tsum := md5.Sum(keyBytes)\n\t\t\tc.SSECustomerKeyMD5 = base64.StdEncoding.EncodeToString(sum[:])\n\t\t}\n\n\t\t// SSE-C requires HTTPS (except for localhost/private networks for testing)\n\t\tif c.Endpoint != \"\" {\n\t\t\tendpoint := c.Endpoint\n\t\t\tif !strings.HasPrefix(endpoint, \"http://\") \u0026\u0026 !strings.HasPrefix(endpoint, \"https://\") {\n\t\t\t\tendpoint = \"https://\" + endpoint\n\t\t\t}\n\t\t\tif strings.HasPrefix(endpoint, \"http://\") {\n\t\t\t\tu, err := url.Parse(endpoint)\n\t\t\t\tif err == nil {\n\t\t\t\t\thost := u.Hostname()\n\t\t\t\t\t// Allow localhost by name\n\t\t\t\t\tif host == \"localhost\" {\n\t\t\t\t\t\t// OK - localhost is allowed\n\t\t\t\t\t} else if ip := net.ParseIP(host); ip != nil \u0026\u0026 (ip.IsLoopback() || ip.IsPrivate()) {\n\t\t\t\t\t\t// OK - loopback (127.x.x.x) or private RFC1918 ranges (10.x, 172.16-31.x, 192.168.x)\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn fmt.Errorf(\"s3: sse-customer-key requires HTTPS endpoint (HTTP only allowed for localhost/private networks)\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// transportRetryMaxAttempts caps total attempts per operation; exponential\n// backoff between attempts still bounds request rate during outages.\nconst transportRetryMaxAttempts = 10\n\n// newTransportRetryer returns a retryer that keeps retrying through sustained\n// object-store transport flaps. The SDK's default token bucket (and the\n// adaptive mode previously configured here) only refills retry quota on\n// successful responses, so a sustained provider flap drains it to zero and\n// every subsequent operation fails fast (\"retry quota exceeded, 0 available\")\n// precisely when retrying matters most for a replication tool.\nfunc newTransportRetryer() aws.Retryer {\n\treturn retry.NewStandard(func(o *retry.StandardOptions) {\n\t\to.MaxAttempts = transportRetryMaxAttempts\n\t\to.RateLimiter = ratelimit.None\n\t\t// S3-compatible providers (observed: Tigris) load-shed with HTTP 408\n\t\t// and api error code \"RequestCanceled\", neither of which the SDK\n\t\t// classifies as retryable by default. Genuine client-side context\n\t\t// cancellation stays non-retryable via the standard retryer's\n\t\t// canceled-context check, which runs before these.\n\t\to.Retryables = append(o.Retryables,\n\t\t\tretry.RetryableHTTPStatusCode{Codes: map[int]struct{}{\n\t\t\t\thttp.StatusRequestTimeout: {},\n\t\t\t}},\n\t\t\tretry.RetryableErrorCode{Codes: map[string]struct{}{\n\t\t\t\t\"RequestCanceled\": {},\n\t\t\t}},\n\t\t)\n\t})\n}\n\n// findBucketRegion looks up the AWS region for a bucket. Returns blank if non-S3.\nfunc (c *ReplicaClient) findBucketRegion(ctx context.Context, bucket string) (string, error) {\n\t// Build a config with credentials but no region\n\tconfigOpts := []func(*config.LoadOptions) error{\n\t\tconfig.WithRetryer(newTransportRetryer),\n\t}\n\n\t// Add static credentials if provided\n\tif c.AccessKeyID != \"\" \u0026\u0026 c.SecretAccessKey != \"\" {\n\t\tconfigOpts = append(configOpts, config.WithCredentialsProvider(\n\t\t\tcredentials.NewStaticCredentialsProvider(c.AccessKeyID, c.SecretAccessKey, \"\"),\n\t\t))\n\t}\n\n\t// Load AWS configuration\n\tcfg, err := config.LoadDefaultConfig(ctx, configOpts...)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"s3: cannot load aws config for region lookup: %w\", err)\n\t}\n\n\t// Use default region for initial region lookup\n\tcfg.Region = DefaultRegion\n\n\t// Create S3 client options\n\ts3Opts := []func(*s3.Options){}\n\n\t// Configure custom endpoint for region lookup\n\tc.configureEndpoint(\u0026s3Opts)\n\n\tclient := s3.NewFromConfig(cfg, s3Opts...)\n\n\t// Get bucket location\n\tout, err := client.GetBucketLocation(ctx, \u0026s3.GetBucketLocationInput{\n\t\tBucket: aws.String(bucket),\n\t})\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Convert location constraint to region\n\tif out.LocationConstraint == \"\" {\n\t\treturn DefaultRegion, nil\n\t}\n\treturn string(out.LocationConstraint), nil\n}\n\n// LTXFiles returns an iterator over all LTX files on the replica for the given level.\n// When useMetadata is true, fetches accurate timestamps from S3 metadata via HeadObject.\n// This uses parallel batched requests (controlled by MetadataConcurrency) to avoid hangs\n// with large backup histories (see issue #930).\n// When false, uses fast LastModified timestamps from LIST operation.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn newFileIterator(ctx, c, level, seek, useMetadata), nil\n}\n\n// OpenLTXFile returns a reader for an LTX file\n// Returns os.ErrNotExist if no matching index/offset is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar rangeStr string\n\tif size \u003e 0 {\n\t\trangeStr = fmt.Sprintf(\"bytes=%d-%d\", offset, offset+size-1)\n\t} else {\n\t\trangeStr = fmt.Sprintf(\"bytes=%d-\", offset)\n\t}\n\n\t// Build the key from the file info\n\tfilename := ltx.FormatFilename(minTXID, maxTXID)\n\tkey := c.Path + \"/\" + fmt.Sprintf(\"%04x/%s\", level, filename)\n\n\tinput := \u0026s3.GetObjectInput{\n\t\tBucket: aws.String(c.Bucket),\n\t\tKey: aws.String(key),\n\t\tRange: aws.String(rangeStr),\n\t}\n\n\t// Add SSE-C parameters if configured (required for reading SSE-C encrypted objects)\n\t// Note: SSE-KMS does not require parameters on read - decryption is automatic\n\tif c.SSECustomerKey != \"\" {\n\t\tinput.SSECustomerAlgorithm = aws.String(c.SSECustomerAlgorithm)\n\t\tinput.SSECustomerKey = aws.String(c.SSECustomerKey)\n\t\tinput.SSECustomerKeyMD5 = aws.String(c.SSECustomerKeyMD5)\n\t}\n\n\tout, err := c.s3.GetObject(ctx, input)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"s3: get object %s: %w\", key, err)\n\t}\n\treturn out.Body, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\n// Extracts timestamp from LTX header and stores it in S3 metadata to preserve original creation time.\n// Objects smaller than the part size are written with a single PutObject call\n// to avoid the multipart upload manager's 5 MiB part buffers (issue #1327).\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := ltx.FormatFilename(minTXID, maxTXID)\n\tkey := c.Path + \"/\" + fmt.Sprintf(\"%04x/%s\", level, filename)\n\n\tpartSize := int64(manager.DefaultUploadPartSize)\n\tif c.PartSize \u003e 0 {\n\t\tpartSize = c.PartSize\n\t}\n\n\t// The uploader rejects part sizes below the SDK minimum on every upload.\n\t// Fail identically here so the single-put path cannot mask the\n\t// misconfiguration for small objects.\n\tif partSize \u003c manager.MinUploadPartSize {\n\t\treturn nil, fmt.Errorf(\"s3: upload to %s: part size must be at least %d bytes\", key, manager.MinUploadPartSize)\n\t}\n\n\tsize, timestamp, etag, err := c.uploadLTX(ctx, key, r, partSize)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(size))\n\n\t// ETag indicates successful upload\n\tif etag == nil {\n\t\treturn nil, fmt.Errorf(\"s3: upload failed: no ETag returned\")\n\t}\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: size,\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// uploadLTX uploads LTX data from r to key, choosing between a single\n// PutObject and the multipart uploader based on the object size.\nfunc (c *ReplicaClient) uploadLTX(ctx context.Context, key string, r io.Reader, partSize int64) (int64, time.Time, *string, error) {\n\t// The L0 replication path passes the local LTX file, so the size is\n\t// known up front and the body stays seekable for SDK retries.\n\tif rs, ok := r.(io.ReadSeeker); ok {\n\t\tif start, err := rs.Seek(0, io.SeekCurrent); err == nil {\n\t\t\treturn c.uploadSizedLTX(ctx, key, rs, start, partSize)\n\t\t}\n\t\t// Reader does not support seeking (e.g. piped file descriptor);\n\t\t// nothing has been consumed, so treat it as an unsized stream.\n\t}\n\treturn c.uploadStreamedLTX(ctx, key, r, partSize)\n}\n\n// uploadSizedLTX uploads from a seekable reader whose size is known.\nfunc (c *ReplicaClient) uploadSizedLTX(ctx context.Context, key string, rs io.ReadSeeker, start, partSize int64) (int64, time.Time, *string, error) {\n\tend, err := rs.Seek(0, io.SeekEnd)\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: size ltx file %s: %w\", key, err)\n\t}\n\tsize := end - start\n\tif _, err := rs.Seek(start, io.SeekStart); err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: rewind ltx file %s: %w\", key, err)\n\t}\n\n\t// Extract timestamp from LTX header, then rewind so the upload sees the\n\t// full file.\n\thdr, _, err := ltx.PeekHeader(rs)\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\tif _, err := rs.Seek(start, io.SeekStart); err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: rewind ltx file %s: %w\", key, err)\n\t}\n\n\tinput := c.putObjectInput(key, timestamp)\n\tinput.Body = rs\n\n\tif size \u003c partSize {\n\t\tinput.ContentLength = aws.Int64(size)\n\t\tout, err := c.s3.PutObject(ctx, input)\n\t\tif err != nil {\n\t\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: put object %s: %w\", key, err)\n\t\t}\n\t\treturn size, timestamp, out.ETag, nil\n\t}\n\n\t// At or above the part size the uploader splits the seekable body into\n\t// section readers without copying it into part buffers.\n\tout, err := c.uploader.Upload(ctx, input)\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: upload to %s: %w\", key, err)\n\t}\n\treturn size, timestamp, out.ETag, nil\n}\n\n// uploadStreamedLTX uploads from a reader of unknown size, buffering up to\n// the part size to determine whether the object fits in a single PutObject.\nfunc (c *ReplicaClient) uploadStreamedLTX(ctx context.Context, key string, r io.Reader, partSize int64) (int64, time.Time, *string, error) {\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\thdr, _, err := ltx.PeekHeader(io.TeeReader(r, \u0026buf))\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\tif _, err := io.CopyN(\u0026buf, r, partSize-int64(buf.Len())); err != nil \u0026\u0026 !errors.Is(err, io.EOF) {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: buffer ltx stream %s: %w\", key, err)\n\t}\n\n\tinput := c.putObjectInput(key, timestamp)\n\n\t// Reaching EOF before the part size means the whole object is buffered.\n\tif size := int64(buf.Len()); size \u003c partSize {\n\t\tinput.Body = bytes.NewReader(buf.Bytes())\n\t\tinput.ContentLength = aws.Int64(size)\n\t\tout, err := c.s3.PutObject(ctx, input)\n\t\tif err != nil {\n\t\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: put object %s: %w\", key, err)\n\t\t}\n\t\treturn size, timestamp, out.ETag, nil\n\t}\n\n\t// Combine buffered prefix with rest of reader so nothing is re-read.\n\trc := internal.NewReadCounter(io.MultiReader(bytes.NewReader(buf.Bytes()), r))\n\tinput.Body = rc\n\tout, err := c.uploader.Upload(ctx, input)\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: upload to %s: %w\", key, err)\n\t}\n\treturn rc.N(), timestamp, out.ETag, nil\n}\n\n// putObjectInput returns a PutObjectInput populated with the client's write\n// parameters so the single-put and multipart paths stay in parity.\nfunc (c *ReplicaClient) putObjectInput(key string, timestamp time.Time) *s3.PutObjectInput {\n\tinput := \u0026s3.PutObjectInput{\n\t\tBucket: aws.String(c.Bucket),\n\t\tKey: aws.String(key),\n\t\t// Store timestamp in S3 metadata for accurate timestamp retrieval\n\t\tMetadata: map[string]string{\n\t\t\tMetadataKeyTimestamp: timestamp.Format(time.RFC3339Nano),\n\t\t},\n\t}\n\tif c.StorageClass != \"\" {\n\t\tinput.StorageClass = types.StorageClass(c.StorageClass)\n\t}\n\n\t// Add SSE-C parameters if configured\n\tif c.SSECustomerKey != \"\" {\n\t\tinput.SSECustomerAlgorithm = aws.String(c.SSECustomerAlgorithm)\n\t\tinput.SSECustomerKey = aws.String(c.SSECustomerKey)\n\t\tinput.SSECustomerKeyMD5 = aws.String(c.SSECustomerKeyMD5)\n\t}\n\n\t// Add SSE-KMS parameters if configured\n\tif c.SSEKMSKeyID != \"\" {\n\t\tinput.ServerSideEncryption = types.ServerSideEncryptionAwsKms\n\t\tinput.SSEKMSKeyId = aws.String(c.SSEKMSKeyID)\n\t}\n\n\treturn input\n}\n\nfunc (c *ReplicaClient) middlewareOption() func(*middleware.Stack) error {\n\treturn func(stack *middleware.Stack) error {\n\t\tif c.RequireContentMD5 {\n\t\t\tif err := stack.Serialize.Add(\n\t\t\t\tmiddleware.SerializeMiddlewareFunc(\n\t\t\t\t\t\"LitestreamComputeDeleteContentMD5\",\n\t\t\t\t\tfunc(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\t\t\t\t\t\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif middleware.GetOperationName(ctx) != \"DeleteObjects\" {\n\t\t\t\t\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinput, ok := in.Parameters.(*s3.DeleteObjectsInput)\n\t\t\t\t\t\tif !ok || input == nil || input.Delete == nil || len(input.Delete.Objects) == 0 {\n\t\t\t\t\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchecksum, err := computeDeleteObjectsContentMD5(input.Delete)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn out, metadata, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif checksum != \"\" {\n\t\t\t\t\t\t\tctx = middleware.WithStackValue(ctx, contentMD5StackKey{}, checksum)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t\tmiddleware.Before,\n\t\t\t); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif err := stack.Build.Add(\n\t\t\tmiddleware.BuildMiddlewareFunc(\n\t\t\t\t\"LitestreamUserAgent\",\n\t\t\t\tfunc(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\t\t\t\t\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n\t\t\t\t) {\n\t\t\t\t\tif req, ok := in.Request.(*smithyhttp.Request); ok {\n\t\t\t\t\t\tcurrent := req.Header.Get(\"User-Agent\")\n\t\t\t\t\t\tif current == \"\" {\n\t\t\t\t\t\t\treq.Header.Set(\"User-Agent\", \"litestream\")\n\t\t\t\t\t\t} else if !strings.Contains(current, \"litestream\") {\n\t\t\t\t\t\t\treq.Header.Set(\"User-Agent\", \"litestream \"+current)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn next.HandleBuild(ctx, in)\n\t\t\t\t},\n\t\t\t),\n\t\t\tmiddleware.After,\n\t\t); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif litestream.IsTigrisEndpoint(c.Endpoint) {\n\t\t\tif err := stack.Build.Add(\n\t\t\t\tmiddleware.BuildMiddlewareFunc(\n\t\t\t\t\t\"LitestreamTigrisConsistent\",\n\t\t\t\t\tfunc(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\t\t\t\t\t\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif req, ok := in.Request.(*smithyhttp.Request); ok {\n\t\t\t\t\t\t\treq.Header.Set(\"X-Tigris-Consistent\", \"true\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next.HandleBuild(ctx, in)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t\tmiddleware.After,\n\t\t\t); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif !c.SignAcceptEncoding || litestream.IsGoogleCloudStorageEndpoint(c.Endpoint) {\n\t\t\tif err := stack.Finalize.Insert(\n\t\t\t\tmiddleware.FinalizeMiddlewareFunc(\n\t\t\t\t\t\"LitestreamRemoveAcceptEncoding\",\n\t\t\t\t\tfunc(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\t\t\t\t\t\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif req, ok := in.Request.(*smithyhttp.Request); ok {\n\t\t\t\t\t\t\treq.Header.Del(\"Accept-Encoding\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t\t\"Signing\",\n\t\t\t\tmiddleware.Before,\n\t\t\t); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Many S3-compatible providers (e.g. Filebase) do not support SigV4\n\t\t// payload hashing. Switching to unsigned payload matches the behavior\n\t\t// of the AWS SDK v1 client used in Litestream v0.3.x and restores\n\t\t// compatibility.\n\t\tif !c.SignPayload {\n\t\t\t_ = v4.RemoveComputePayloadSHA256Middleware(stack)\n\t\t\tif err := v4.AddUnsignedPayloadMiddleware(stack); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t_ = v4.RemoveContentSHA256HeaderMiddleware(stack)\n\t\t\tif err := v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Disable AWS SDK v2's trailing checksum middleware which uses\n\t\t// aws-chunked encoding. This is required for:\n\t\t// 1. UNSIGNED-PAYLOAD requests (aws-chunked + UNSIGNED-PAYLOAD is rejected by AWS)\n\t\t// 2. S3-compatible providers (Filebase, MinIO, Backblaze B2, etc.) that don't\n\t\t// support aws-chunked encoding at all\n\t\t// See: https://github.com/aws/aws-sdk-go-v2/discussions/2960\n\t\t// See: https://github.com/benbjohnson/litestream/issues/895\n\t\tif !c.SignPayload || c.Endpoint != \"\" {\n\t\t\tstack.Finalize.Remove(\"addInputChecksumTrailer\")\n\t\t}\n\n\t\t// Add debug logging middleware at the end of Finalize phase\n\t\t// so all headers (including X-Tigris-Consistent) are set\n\t\tif err := stack.Finalize.Add(\n\t\t\tmiddleware.FinalizeMiddlewareFunc(\n\t\t\t\t\"LitestreamDebugLogging\",\n\t\t\t\tfunc(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\t\t\t\t\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n\t\t\t\t) {\n\t\t\t\t\tif req, ok := in.Request.(*smithyhttp.Request); ok {\n\t\t\t\t\t\tc.logger.Debug(\"s3 request\",\n\t\t\t\t\t\t\t\"method\", req.Method,\n\t\t\t\t\t\t\t\"url\", req.URL.String(),\n\t\t\t\t\t\t\t\"x-tigris-consistent\", req.Header.Get(\"X-Tigris-Consistent\"),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t},\n\t\t\t),\n\t\t\tmiddleware.After,\n\t\t); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif !c.RequireContentMD5 {\n\t\t\treturn nil\n\t\t}\n\n\t\tmd5Middleware := func() middleware.FinalizeMiddleware {\n\t\t\treturn middleware.FinalizeMiddlewareFunc(\n\t\t\t\t\"LitestreamDeleteContentMD5\",\n\t\t\t\tfunc(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\t\t\t\t\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n\t\t\t\t) {\n\t\t\t\t\tif middleware.GetOperationName(ctx) != \"DeleteObjects\" {\n\t\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t\t}\n\n\t\t\t\t\tchecksum, _ := middleware.GetStackValue(ctx, contentMD5StackKey{}).(string)\n\t\t\t\t\tif checksum == \"\" {\n\t\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t\t}\n\n\t\t\t\t\treq, ok := in.Request.(*smithyhttp.Request)\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t\t}\n\t\t\t\t\tif req.Header.Get(\"Content-MD5\") == \"\" {\n\t\t\t\t\t\treq.Header.Set(\"Content-MD5\", checksum)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\n\t\t// Try to insert before AWS's checksum middleware for optimal ordering.\n\t\t// If that middleware doesn't exist (e.g., different SDK version), add at the end.\n\t\t// Our middleware checks if Content-MD5 is already set, so order is not critical.\n\t\tif err := stack.Finalize.Insert(md5Middleware(), \"AWSChecksum:ComputeInputPayloadChecksum\", middleware.Before); err != nil {\n\t\t\tif err := stack.Finalize.Add(md5Middleware(), middleware.After); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t}\n}\n\nfunc computeDeleteObjectsContentMD5(deleteInput *types.Delete) (string, error) {\n\tif deleteInput == nil {\n\t\treturn \"\", nil\n\t}\n\n\tpayload, err := marshalDeleteObjects(deleteInput)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif len(payload) == 0 {\n\t\treturn \"\", nil\n\t}\n\n\tsum := md5.Sum(payload)\n\treturn base64.StdEncoding.EncodeToString(sum[:]), nil\n}\n\nfunc marshalDeleteObjects(deleteInput *types.Delete) ([]byte, error) {\n\tif deleteInput == nil {\n\t\treturn nil, nil\n\t}\n\n\tvar buf bytes.Buffer\n\tencoder := smithyxml.NewEncoder(\u0026buf)\n\troot := smithyxml.StartElement{\n\t\tName: smithyxml.Name{\n\t\t\tLocal: \"Delete\",\n\t\t},\n\t\tAttr: []smithyxml.Attr{\n\t\t\tsmithyxml.NewNamespaceAttribute(\"\", \"http://s3.amazonaws.com/doc/2006-03-01/\"),\n\t\t},\n\t}\n\n\tif err := encodeDeleteDocument(deleteInput, encoder.RootElement(root)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn encoder.Bytes(), nil\n}\n\nfunc encodeDeleteDocument(v *types.Delete, value smithyxml.Value) error {\n\tdefer value.Close()\n\tif v.Objects != nil {\n\t\troot := smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"Object\",\n\t\t\t},\n\t\t}\n\t\tel := value.FlattenedElement(root)\n\t\tif err := encodeObjectIdentifierList(v.Objects, el); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif v.Quiet != nil {\n\t\troot := smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"Quiet\",\n\t\t\t},\n\t\t}\n\t\tel := value.MemberElement(root)\n\t\tel.Boolean(*v.Quiet)\n\t}\n\treturn nil\n}\n\nfunc encodeObjectIdentifierList(v []types.ObjectIdentifier, value smithyxml.Value) error {\n\tif !value.IsFlattened() {\n\t\tdefer value.Close()\n\t}\n\n\tarray := value.Array()\n\tfor i := range v {\n\t\tmember := array.Member()\n\t\tif err := encodeObjectIdentifier(\u0026v[i], member); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// encodeObjectIdentifier mirrors the AWS SDK's XML serializer for DeleteObjects.\n// This ensures our precomputed Content-MD5 matches the actual request body.\n// Includes all ObjectIdentifier fields as of AWS SDK v2 (2024).\nfunc encodeObjectIdentifier(v *types.ObjectIdentifier, value smithyxml.Value) error {\n\tdefer value.Close()\n\tif v.ETag != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"ETag\",\n\t\t\t},\n\t\t})\n\t\tel.String(*v.ETag)\n\t}\n\tif v.Key != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"Key\",\n\t\t\t},\n\t\t})\n\t\tel.String(*v.Key)\n\t}\n\tif v.LastModifiedTime != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"LastModifiedTime\",\n\t\t\t},\n\t\t})\n\t\tel.String(smithytime.FormatHTTPDate(*v.LastModifiedTime))\n\t}\n\tif v.Size != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"Size\",\n\t\t\t},\n\t\t})\n\t\tel.Long(*v.Size)\n\t}\n\tif v.VersionId != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"VersionId\",\n\t\t\t},\n\t\t})\n\t\tel.String(*v.VersionId)\n\t}\n\treturn nil\n}\n\n// DeleteLTXFiles deletes one or more LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\n\t// Convert file infos to object identifiers\n\tobjIDs := make([]types.ObjectIdentifier, 0, len(a))\n\tfor _, info := range a {\n\t\tfilename := ltx.FormatFilename(info.MinTXID, info.MaxTXID)\n\t\tkey := c.Path + \"/\" + fmt.Sprintf(\"%04x/%s\", info.Level, filename)\n\t\tobjIDs = append(objIDs, types.ObjectIdentifier{Key: aws.String(key)})\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"key\", key)\n\t}\n\n\t// Delete in batches\n\tfor len(objIDs) \u003e 0 {\n\t\tn := min(len(objIDs), MaxKeys)\n\n\t\tc.logger.Debug(\"deleting ltx files batch\", \"count\", n)\n\n\t\tstart := time.Now()\n\t\tout, err := c.s3.DeleteObjects(ctx, \u0026s3.DeleteObjectsInput{\n\t\t\tBucket: aws.String(c.Bucket),\n\t\t\tDelete: \u0026types.Delete{Objects: objIDs[:n]},\n\t\t})\n\t\tduration := time.Since(start)\n\t\tinternal.OperationDurationHistogramVec.WithLabelValues(ReplicaClientType, \"DELETE\").Observe(duration.Seconds())\n\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"s3: delete batch of %d objects: %w\", n, err)\n\t\t}\n\n\t\tdeleted := 0\n\t\tif out != nil {\n\t\t\tdeleted = len(out.Deleted)\n\t\t}\n\t\tc.logger.Debug(\"delete batch completed\",\n\t\t\t\"requested\", n,\n\t\t\t\"deleted\", deleted,\n\t\t\t\"errors\", len(out.Errors),\n\t\t\t\"duration_ms\", duration.Milliseconds())\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Add(float64(deleted))\n\n\t\tif len(out.Errors) \u003e 0 {\n\t\t\tfor i, e := range out.Errors {\n\t\t\t\tcode := aws.ToString(e.Code)\n\t\t\t\tinternal.OperationErrorCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\", code).Inc()\n\n\t\t\t\tif i \u003c 5 {\n\t\t\t\t\tc.logger.Warn(\"delete object failed\",\n\t\t\t\t\t\t\"key\", aws.ToString(e.Key),\n\t\t\t\t\t\t\"code\", code,\n\t\t\t\t\t\t\"message\", aws.ToString(e.Message))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif len(out.Errors) \u003e 5 {\n\t\t\t\tc.logger.Warn(\"additional delete errors suppressed\", \"count\", len(out.Errors)-5)\n\t\t\t}\n\t\t}\n\n\t\tif err := deleteOutputError(out); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjIDs = objIDs[n:]\n\t}\n\n\treturn nil\n}\n\n// DeleteAll deletes all files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tvar objIDs []types.ObjectIdentifier\n\n\t// Create paginator for listing objects\n\tpaginator := s3.NewListObjectsV2Paginator(c.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(c.Bucket),\n\t\tPrefix: aws.String(c.Path + \"/\"),\n\t})\n\n\t// Iterate through all pages\n\tfor paginator.HasMorePages() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"s3: list objects page: %w\", err)\n\t\t}\n\n\t\t// Collect object identifiers\n\t\tfor _, obj := range page.Contents {\n\t\t\tobjIDs = append(objIDs, types.ObjectIdentifier{Key: obj.Key})\n\t\t}\n\t}\n\n\t// Delete all collected objects in batches\n\tfor len(objIDs) \u003e 0 {\n\t\tn := min(len(objIDs), MaxKeys)\n\n\t\tout, err := c.s3.DeleteObjects(ctx, \u0026s3.DeleteObjectsInput{\n\t\t\tBucket: aws.String(c.Bucket),\n\t\t\tDelete: \u0026types.Delete{Objects: objIDs[:n], Quiet: aws.Bool(true)},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"s3: delete all batch of %d objects: %w\", n, err)\n\t\t} else if err := deleteOutputError(out); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjIDs = objIDs[n:]\n\t}\n\n\treturn nil\n}\n\n// GenerationsV3 returns a list of v0.3.x generation IDs in the replica.\nfunc (c *ReplicaClient) GenerationsV3(ctx context.Context) ([]string, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tprefix := litestream.GenerationsPathV3(c.Path) + \"/\"\n\n\t// Use CommonPrefixes with delimiter to list \"directories\"\n\tpaginator := s3.NewListObjectsV2Paginator(c.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(c.Bucket),\n\t\tPrefix: aws.String(prefix),\n\t\tDelimiter: aws.String(\"/\"),\n\t})\n\n\tvar generations []string\n\tfor paginator.HasMorePages() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"s3: list generations: %w\", err)\n\t\t}\n\n\t\tfor _, cp := range page.CommonPrefixes {\n\t\t\t// Extract generation ID from prefix (e.g., \"path/generations/abc123def456/\" -\u003e \"abc123def456\")\n\t\t\tp := aws.ToString(cp.Prefix)\n\t\t\tp = strings.TrimPrefix(p, prefix)\n\t\t\tp = strings.TrimSuffix(p, \"/\")\n\t\t\tif litestream.IsGenerationIDV3(p) {\n\t\t\t\tgenerations = append(generations, p)\n\t\t\t}\n\t\t}\n\t}\n\n\tslices.Sort(generations)\n\treturn generations, nil\n}\n\n// SnapshotsV3 returns snapshots for a generation, sorted by index.\nfunc (c *ReplicaClient) SnapshotsV3(ctx context.Context, generation string) ([]litestream.SnapshotInfoV3, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tprefix := litestream.SnapshotsPathV3(c.Path, generation) + \"/\"\n\n\tpaginator := s3.NewListObjectsV2Paginator(c.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(c.Bucket),\n\t\tPrefix: aws.String(prefix),\n\t})\n\n\tvar snapshots []litestream.SnapshotInfoV3\n\tfor paginator.HasMorePages() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"s3: list snapshots: %w\", err)\n\t\t}\n\n\t\tfor _, obj := range page.Contents {\n\t\t\tkey := path.Base(aws.ToString(obj.Key))\n\t\t\tindex, err := litestream.ParseSnapshotFilenameV3(key)\n\t\t\tif err != nil {\n\t\t\t\tcontinue // skip invalid filenames\n\t\t\t}\n\n\t\t\tsnapshots = append(snapshots, litestream.SnapshotInfoV3{\n\t\t\t\tGeneration: generation,\n\t\t\t\tIndex: index,\n\t\t\t\tSize: aws.ToInt64(obj.Size),\n\t\t\t\tCreatedAt: aws.ToTime(obj.LastModified).UTC(),\n\t\t\t})\n\t\t}\n\t}\n\n\tslices.SortFunc(snapshots, func(a, b litestream.SnapshotInfoV3) int {\n\t\treturn a.Index - b.Index\n\t})\n\treturn snapshots, nil\n}\n\n// WALSegmentsV3 returns WAL segments for a generation, sorted by index then offset.\nfunc (c *ReplicaClient) WALSegmentsV3(ctx context.Context, generation string) ([]litestream.WALSegmentInfoV3, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tprefix := litestream.WALPathV3(c.Path, generation) + \"/\"\n\n\tpaginator := s3.NewListObjectsV2Paginator(c.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(c.Bucket),\n\t\tPrefix: aws.String(prefix),\n\t})\n\n\tvar segments []litestream.WALSegmentInfoV3\n\tfor paginator.HasMorePages() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"s3: list wal segments: %w\", err)\n\t\t}\n\n\t\tfor _, obj := range page.Contents {\n\t\t\tkey := path.Base(aws.ToString(obj.Key))\n\t\t\tindex, offset, err := litestream.ParseWALSegmentFilenameV3(key)\n\t\t\tif err != nil {\n\t\t\t\tcontinue // skip invalid filenames\n\t\t\t}\n\n\t\t\tsegments = append(segments, litestream.WALSegmentInfoV3{\n\t\t\t\tGeneration: generation,\n\t\t\t\tIndex: index,\n\t\t\t\tOffset: offset,\n\t\t\t\tSize: aws.ToInt64(obj.Size),\n\t\t\t\tCreatedAt: aws.ToTime(obj.LastModified).UTC(),\n\t\t\t})\n\t\t}\n\t}\n\n\tslices.SortFunc(segments, func(a, b litestream.WALSegmentInfoV3) int {\n\t\tif a.Index != b.Index {\n\t\t\treturn a.Index - b.Index\n\t\t}\n\t\treturn cmp.Compare(a.Offset, b.Offset)\n\t})\n\treturn segments, nil\n}\n\n// OpenSnapshotV3 opens a v0.3.x snapshot file for reading.\n// The returned reader provides LZ4-decompressed data.\nfunc (c *ReplicaClient) OpenSnapshotV3(ctx context.Context, generation string, index int) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.SnapshotPathV3(c.Path, generation, index)\n\n\tinput := \u0026s3.GetObjectInput{\n\t\tBucket: aws.String(c.Bucket),\n\t\tKey: aws.String(key),\n\t}\n\n\t// Add SSE-C parameters if configured\n\tif c.SSECustomerKey != \"\" {\n\t\tinput.SSECustomerAlgorithm = aws.String(c.SSECustomerAlgorithm)\n\t\tinput.SSECustomerKey = aws.String(c.SSECustomerKey)\n\t\tinput.SSECustomerKeyMD5 = aws.String(c.SSECustomerKeyMD5)\n\t}\n\n\tout, err := c.s3.GetObject(ctx, input)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"s3: get snapshot %s: %w\", key, err)\n\t}\n\n\treturn internal.NewLZ4Reader(out.Body), nil\n}\n\n// OpenWALSegmentV3 opens a v0.3.x WAL segment file for reading.\n// The returned reader provides LZ4-decompressed data.\nfunc (c *ReplicaClient) OpenWALSegmentV3(ctx context.Context, generation string, index int, offset int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.WALSegmentPathV3(c.Path, generation, index, offset)\n\n\tinput := \u0026s3.GetObjectInput{\n\t\tBucket: aws.String(c.Bucket),\n\t\tKey: aws.String(key),\n\t}\n\n\t// Add SSE-C parameters if configured\n\tif c.SSECustomerKey != \"\" {\n\t\tinput.SSECustomerAlgorithm = aws.String(c.SSECustomerAlgorithm)\n\t\tinput.SSECustomerKey = aws.String(c.SSECustomerKey)\n\t\tinput.SSECustomerKeyMD5 = aws.String(c.SSECustomerKeyMD5)\n\t}\n\n\tout, err := c.s3.GetObject(ctx, input)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"s3: get wal segment %s: %w\", key, err)\n\t}\n\n\treturn internal.NewLZ4Reader(out.Body), nil\n}\n\n// fileIterator represents an iterator over LTX files in S3.\ntype fileIterator struct {\n\tctx context.Context\n\tcancel context.CancelFunc\n\tclient *ReplicaClient\n\tlevel int\n\tseek ltx.TXID\n\tprefix string\n\n\tuseMetadata bool // When true, fetch accurate timestamps from metadata\n\tmetadataCache map[string]time.Time // key -\u003e timestamp cache for batch fetches\n\n\tpaginator *s3.ListObjectsV2Paginator\n\tpage *s3.ListObjectsV2Output\n\tpageIndex int\n\n\tclosed bool\n\terr error\n\tinfo *ltx.FileInfo\n}\n\nfunc newFileIterator(ctx context.Context, client *ReplicaClient, level int, seek ltx.TXID, useMetadata bool) *fileIterator {\n\tctx, cancel := context.WithCancel(ctx)\n\n\tprefix := client.Path + \"/\" + fmt.Sprintf(\"%04x/\", level)\n\titr := \u0026fileIterator{\n\t\tctx: ctx,\n\t\tcancel: cancel,\n\t\tclient: client,\n\t\tlevel: level,\n\t\tseek: seek,\n\t\tprefix: prefix,\n\t\tuseMetadata: useMetadata,\n\t\tmetadataCache: make(map[string]time.Time),\n\t}\n\n\t// Create paginator for listing objects with level prefix\n\titr.paginator = s3.NewListObjectsV2Paginator(client.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(client.Bucket),\n\t\tPrefix: aws.String(prefix),\n\t})\n\n\treturn itr\n}\n\n// fetchMetadataBatch fetches timestamps from S3 metadata for a batch of keys in parallel.\nfunc (itr *fileIterator) fetchMetadataBatch(keys []string) error {\n\tif len(keys) == 0 {\n\t\treturn nil\n\t}\n\n\t// Determine concurrency limit\n\tconcurrency := itr.client.MetadataConcurrency\n\tif concurrency \u003c= 0 {\n\t\tconcurrency = DefaultMetadataConcurrency\n\t}\n\n\t// Pre-allocate results map to avoid lock contention during writes\n\tresults := make(map[string]time.Time, len(keys))\n\tvar mu sync.Mutex\n\n\t// Use x/sync/semaphore for precise concurrency control with context support\n\tsem := semaphore.NewWeighted(int64(concurrency))\n\tg, ctx := errgroup.WithContext(itr.ctx)\n\n\tfor _, key := range keys {\n\t\tkey := key // capture for goroutine\n\n\t\tg.Go(func() error {\n\t\t\t// Acquire semaphore slot (blocking with context cancellation)\n\t\t\tif err := sem.Acquire(ctx, 1); err != nil {\n\t\t\t\treturn err // context cancelled\n\t\t\t}\n\t\t\tdefer sem.Release(1)\n\n\t\t\theadInput := \u0026s3.HeadObjectInput{\n\t\t\t\tBucket: aws.String(itr.client.Bucket),\n\t\t\t\tKey: aws.String(key),\n\t\t\t}\n\n\t\t\t// Add SSE-C parameters if configured (required for reading SSE-C encrypted objects)\n\t\t\t// Note: SSE-KMS does not require parameters on HeadObject - access is automatic\n\t\t\tif itr.client.SSECustomerKey != \"\" {\n\t\t\t\theadInput.SSECustomerAlgorithm = aws.String(itr.client.SSECustomerAlgorithm)\n\t\t\t\theadInput.SSECustomerKey = aws.String(itr.client.SSECustomerKey)\n\t\t\t\theadInput.SSECustomerKeyMD5 = aws.String(itr.client.SSECustomerKeyMD5)\n\t\t\t}\n\n\t\t\thead, err := itr.client.s3.HeadObject(ctx, headInput)\n\t\t\tif err != nil {\n\t\t\t\t// Non-fatal: file might not have metadata, use LastModified\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif head.Metadata != nil {\n\t\t\t\tif ts, ok := head.Metadata[MetadataKeyTimestamp]; ok {\n\t\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, ts); err == nil {\n\t\t\t\t\t\tmu.Lock()\n\t\t\t\t\t\tresults[key] = parsed\n\t\t\t\t\t\tmu.Unlock()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t}\n\n\tif err := g.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\t// Merge results into cache\n\tfor k, v := range results {\n\t\titr.metadataCache[k] = v\n\t}\n\treturn nil\n}\n\n// Close stops iteration and returns any error that occurred during iteration.\nfunc (itr *fileIterator) Close() (err error) {\n\titr.closed = true\n\titr.cancel()\n\treturn itr.err\n}\n\n// Next returns the next file. Returns false when no more files are available.\nfunc (itr *fileIterator) Next() bool {\n\tif itr.closed || itr.err != nil {\n\t\treturn false\n\t}\n\n\t// Process objects until we find a valid LTX file\n\tfor {\n\t\t// Load next page if needed\n\t\tif itr.page == nil || itr.pageIndex \u003e= len(itr.page.Contents) {\n\t\t\tif !itr.paginator.HasMorePages() {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tvar err error\n\t\t\titr.page, err = itr.paginator.NextPage(itr.ctx)\n\t\t\tif err != nil {\n\t\t\t\titr.err = err\n\t\t\t\treturn false\n\t\t\t}\n\t\t\titr.pageIndex = 0\n\n\t\t\t// Log page contents for debugging.\n\t\t\tif len(itr.page.Contents) \u003e 0 {\n\t\t\t\tkeys := make([]string, 0, len(itr.page.Contents))\n\t\t\t\tfor _, obj := range itr.page.Contents {\n\t\t\t\t\tkeys = append(keys, path.Base(aws.ToString(obj.Key)))\n\t\t\t\t}\n\t\t\t\titr.client.logger.Debug(\"s3 LIST page\", \"prefix\", itr.prefix, \"keys\", keys)\n\t\t\t}\n\n\t\t\t// Batch fetch metadata for the entire page when useMetadata is true.\n\t\t\t// This uses parallel HeadObject calls controlled by MetadataConcurrency\n\t\t\t// to avoid the O(N) sequential calls that caused restore hangs (issue #930).\n\t\t\tif itr.useMetadata \u0026\u0026 len(itr.page.Contents) \u003e 0 {\n\t\t\t\tkeys := make([]string, 0, len(itr.page.Contents))\n\t\t\t\tfor _, obj := range itr.page.Contents {\n\t\t\t\t\tkeys = append(keys, aws.ToString(obj.Key))\n\t\t\t\t}\n\t\t\t\tif err := itr.fetchMetadataBatch(keys); err != nil {\n\t\t\t\t\titr.err = err\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process current object\n\t\tif itr.pageIndex \u003c len(itr.page.Contents) {\n\t\t\tobj := itr.page.Contents[itr.pageIndex]\n\t\t\titr.pageIndex++\n\n\t\t\t// Extract file info from key\n\t\t\tfullKey := aws.ToString(obj.Key)\n\t\t\tkey := path.Base(fullKey)\n\t\t\tminTXID, maxTXID, err := ltx.ParseFilename(key)\n\t\t\tif err != nil {\n\t\t\t\tcontinue // Skip non-LTX files\n\t\t\t}\n\n\t\t\t// Build file info\n\t\t\tinfo := \u0026ltx.FileInfo{\n\t\t\t\tLevel: itr.level,\n\t\t\t\tMinTXID: minTXID,\n\t\t\t\tMaxTXID: maxTXID,\n\t\t\t}\n\n\t\t\t// Skip if below seek TXID\n\t\t\tif info.MinTXID \u003c itr.seek {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Skip if wrong level\n\t\t\tif info.Level != itr.level {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Set file info\n\t\t\tinfo.Size = aws.ToInt64(obj.Size)\n\n\t\t\t// Use cached metadata timestamp if available (from batch fetch),\n\t\t\t// otherwise fallback to LastModified from LIST operation.\n\t\t\tif itr.useMetadata {\n\t\t\t\tif ts, ok := itr.metadataCache[fullKey]; ok {\n\t\t\t\t\tinfo.CreatedAt = ts\n\t\t\t\t} else {\n\t\t\t\t\tinfo.CreatedAt = aws.ToTime(obj.LastModified).UTC()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinfo.CreatedAt = aws.ToTime(obj.LastModified).UTC()\n\t\t\t}\n\n\t\t\titr.info = info\n\t\t\treturn true\n\t\t}\n\t}\n}\n\n// Item returns the metadata for the current file.\nfunc (itr *fileIterator) Item() *ltx.FileInfo {\n\treturn itr.info\n}\n\n// Err returns any error that occurred during iteration.\nfunc (itr *fileIterator) Err() error {\n\treturn itr.err\n}\n\n// ParseURL parses an S3 URL into its host and path parts.\n// If endpoint is set, it can override the host.\nfunc ParseURL(s, endpoint string) (bucket, region, key string, err error) {\n\tu, err := url.Parse(s)\n\tif err != nil {\n\t\treturn \"\", \"\", \"\", err\n\t}\n\n\tif u.Scheme != \"s3\" {\n\t\treturn \"\", \"\", \"\", fmt.Errorf(\"s3: invalid url scheme\")\n\t}\n\n\t// Special handling for filebase.com\n\tif u.Host == \"filebase.com\" {\n\t\tparts := strings.SplitN(strings.TrimPrefix(u.Path, \"/\"), \"/\", 2)\n\t\tif len(parts) == 0 {\n\t\t\treturn \"\", \"\", \"\", fmt.Errorf(\"s3: bucket required\")\n\t\t}\n\t\tbucket = parts[0]\n\t\tif len(parts) \u003e 1 {\n\t\t\tkey = parts[1]\n\t\t}\n\t\treturn bucket, \"\", key, nil\n\t}\n\n\t// For other hosts, check if it's a special endpoint\n\tbucket, region, _, _ = ParseHost(u.Host)\n\tif bucket == \"\" {\n\t\tbucket = u.Host\n\t}\n\n\tkey = strings.TrimPrefix(u.Path, \"/\")\n\treturn bucket, region, key, nil\n}\n\n// ParseHost parses the host/endpoint for an S3-like storage system.\n// Endpoints: https://docs.aws.amazon.com/general/latest/gr/s3.html\nfunc ParseHost(host string) (bucket, region, endpoint string, forcePathStyle bool) {\n\t// Check for MinIO-style hosts (bucket.host:port)\n\tif strings.Contains(host, \":\") \u0026\u0026 !strings.Contains(host, \".com\") {\n\t\tparts := strings.SplitN(host, \".\", 2)\n\t\tif len(parts) == 2 {\n\t\t\t// Extract bucket from bucket.host:port format\n\t\t\tbucket = parts[0]\n\t\t\tendpoint = \"http://\" + parts[1]\n\t\t\treturn bucket, DefaultRegion, endpoint, true\n\t\t}\n\t\t// No bucket in host, just host:port\n\t\treturn \"\", \"\", \"http://\" + host, true\n\t}\n\n\t// Check common object storage providers\n\t// Check for AWS S3 URLs first\n\tif a := awsS3Regex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tif len(a) \u003e 2 \u0026\u0026 a[2] != \"\" {\n\t\t\tregion = a[2]\n\t\t}\n\t\treturn bucket, region, \"\", false\n\t} else if a := digitaloceanRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tregion = a[2]\n\t\treturn bucket, region, fmt.Sprintf(\"https://%s.digitaloceanspaces.com\", region), false\n\t} else if a := backblazeRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tregion = a[2]\n\t\tbucket = a[1]\n\t\tendpoint = fmt.Sprintf(\"https://s3.%s.backblazeb2.com\", region)\n\t\treturn bucket, region, endpoint, true\n\t} else if a := filebaseRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tendpoint = \"s3.filebase.com\"\n\t\treturn bucket, \"\", endpoint, false\n\t} else if a := scalewayRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tregion = a[2]\n\t\tbucket = a[1]\n\t\tendpoint = fmt.Sprintf(\"s3.%s.scw.cloud\", region)\n\t\treturn bucket, region, endpoint, false\n\t}\n\n\t// For standard S3, the host is the bucket name\n\treturn host, \"\", \"\", false\n}\n\nvar (\n\tawsS3Regex = regexp.MustCompile(`^(.+)\\.s3(?:\\.([^.]+))?\\.amazonaws\\.com$`)\n\tdigitaloceanRegex = regexp.MustCompile(`^(?:(.+)\\.)?([^.]+)\\.digitaloceanspaces.com$`)\n\tbackblazeRegex = regexp.MustCompile(`^(?:(.+)\\.)?s3.([^.]+)\\.backblazeb2.com$`)\n\tfilebaseRegex = regexp.MustCompile(`^(?:(.+)\\.)?s3.filebase.com$`)\n\tscalewayRegex = regexp.MustCompile(`^(?:(.+)\\.)?s3.([^.]+)\\.scw\\.cloud$`)\n)\n\nfunc isNotExists(err error) bool {\n\tvar apiErr smithy.APIError\n\tif errors.As(err, \u0026apiErr) {\n\t\treturn apiErr.ErrorCode() == \"NoSuchKey\"\n\t}\n\treturn false\n}\n\nfunc deleteOutputError(out *s3.DeleteObjectsOutput) error {\n\tif len(out.Errors) == 0 {\n\t\treturn nil\n\t}\n\n\t// Build generic error\n\tvar b strings.Builder\n\tb.WriteString(\"failed to delete files:\")\n\tfor _, err := range out.Errors {\n\t\tfmt.Fprintf(\u0026b, \"\\n%s: %s\", aws.ToString(err.Key), aws.ToString(err.Message))\n\t}\n\treturn errors.New(b.String())\n}\n\n// parseS3DebugEnv parses the LITESTREAM_S3_DEBUG environment variable and returns\n// the corresponding AWS SDK ClientLogMode. Supports comma-separated values.\nfunc parseS3DebugEnv() aws.ClientLogMode {\n\tv := os.Getenv(\"LITESTREAM_S3_DEBUG\")\n\tif v == \"\" {\n\t\treturn 0\n\t}\n\n\tvar logMode aws.ClientLogMode\n\tfor _, mode := range strings.Split(v, \",\") {\n\t\tswitch strings.ToLower(strings.TrimSpace(mode)) {\n\t\tcase \"signing\":\n\t\t\tlogMode |= aws.LogSigning\n\t\tcase \"request\":\n\t\t\tlogMode |= aws.LogRequest\n\t\tcase \"request-with-body\":\n\t\t\tlogMode |= aws.LogRequestWithBody\n\t\tcase \"response\":\n\t\t\tlogMode |= aws.LogResponse\n\t\tcase \"response-with-body\":\n\t\t\tlogMode |= aws.LogResponseWithBody\n\t\tcase \"retries\":\n\t\t\tlogMode |= aws.LogRetries\n\t\tcase \"all\":\n\t\t\tlogMode |= aws.LogSigning | aws.LogRequest | aws.LogRequestWithBody |\n\t\t\t\taws.LogResponse | aws.LogResponseWithBody | aws.LogRetries\n\t\tdefault:\n\t\t\tslog.Warn(\"unknown LITESTREAM_S3_DEBUG value, expected: signing, request, request-with-body, response, response-with-body, retries, all\", \"value\", mode)\n\t\t}\n\t}\n\treturn logMode\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[21,29]}},{"name":"cmp","path":"cmp","span":{"start":[5,1],"end":[5,7],"bytes":[30,36]}},{"name":"context","path":"context","span":{"start":[6,1],"end":[6,11],"bytes":[37,47]}},{"name":"md5","path":"crypto/md5","span":{"start":[7,1],"end":[7,14],"bytes":[48,61]}},{"name":"tls","path":"crypto/tls","span":{"start":[8,1],"end":[8,14],"bytes":[62,75]}},{"name":"base64","path":"encoding/base64","span":{"start":[9,1],"end":[9,19],"bytes":[76,94]}},{"name":"errors","path":"errors","span":{"start":[10,1],"end":[10,10],"bytes":[95,104]}},{"name":"fmt","path":"fmt","span":{"start":[11,1],"end":[11,7],"bytes":[105,111]}},{"name":"io","path":"io","span":{"start":[12,1],"end":[12,6],"bytes":[112,117]}},{"name":"slog","path":"log/slog","span":{"start":[13,1],"end":[13,12],"bytes":[118,129]}},{"name":"net","path":"net","span":{"start":[14,1],"end":[14,7],"bytes":[130,136]}},{"name":"http","path":"net/http","span":{"start":[15,1],"end":[15,12],"bytes":[137,148]}},{"name":"url","path":"net/url","span":{"start":[16,1],"end":[16,11],"bytes":[149,159]}},{"name":"os","path":"os","span":{"start":[17,1],"end":[17,6],"bytes":[160,165]}},{"name":"path","path":"path","span":{"start":[18,1],"end":[18,8],"bytes":[166,173]}},{"name":"regexp","path":"regexp","span":{"start":[19,1],"end":[19,10],"bytes":[174,183]}},{"name":"slices","path":"slices","span":{"start":[20,1],"end":[20,10],"bytes":[184,193]}},{"name":"strings","path":"strings","span":{"start":[21,1],"end":[21,11],"bytes":[194,204]}},{"name":"sync","path":"sync","span":{"start":[22,1],"end":[22,8],"bytes":[205,212]}},{"name":"time","path":"time","span":{"start":[23,1],"end":[23,8],"bytes":[213,220]}},{"name":"aws","path":"github.com/aws/aws-sdk-go-v2/aws","span":{"start":[25,1],"end":[25,36],"bytes":[222,257]}},{"name":"ratelimit","path":"github.com/aws/aws-sdk-go-v2/aws/ratelimit","span":{"start":[26,1],"end":[26,46],"bytes":[258,303]}},{"name":"retry","path":"github.com/aws/aws-sdk-go-v2/aws/retry","span":{"start":[27,1],"end":[27,42],"bytes":[304,345]}},{"name":"v4","path":"github.com/aws/aws-sdk-go-v2/aws/signer/v4","alias":"v4","span":{"start":[28,1],"end":[28,49],"bytes":[346,394]}},{"name":"config","path":"github.com/aws/aws-sdk-go-v2/config","span":{"start":[29,1],"end":[29,39],"bytes":[395,433]}},{"name":"credentials","path":"github.com/aws/aws-sdk-go-v2/credentials","span":{"start":[30,1],"end":[30,44],"bytes":[434,477]}},{"name":"manager","path":"github.com/aws/aws-sdk-go-v2/feature/s3/manager","span":{"start":[31,1],"end":[31,51],"bytes":[478,528]}},{"name":"s3","path":"github.com/aws/aws-sdk-go-v2/service/s3","span":{"start":[32,1],"end":[32,43],"bytes":[529,571]}},{"name":"types","path":"github.com/aws/aws-sdk-go-v2/service/s3/types","span":{"start":[33,1],"end":[33,49],"bytes":[572,620]}},{"name":"smithy-go","path":"github.com/aws/smithy-go","span":{"start":[34,1],"end":[34,28],"bytes":[621,648]}},{"name":"xml","path":"github.com/aws/smithy-go/encoding/xml","alias":"smithyxml","span":{"start":[35,1],"end":[35,51],"bytes":[649,699]}},{"name":"middleware","path":"github.com/aws/smithy-go/middleware","span":{"start":[36,1],"end":[36,39],"bytes":[700,738]}},{"name":"time","path":"github.com/aws/smithy-go/time","alias":"smithytime","span":{"start":[37,1],"end":[37,44],"bytes":[739,782]}},{"name":"http","path":"github.com/aws/smithy-go/transport/http","alias":"smithyhttp","span":{"start":[38,1],"end":[38,54],"bytes":[783,836]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[39,1],"end":[39,27],"bytes":[837,863]}},{"name":"errgroup","path":"golang.org/x/sync/errgroup","span":{"start":[40,1],"end":[40,30],"bytes":[864,893]}},{"name":"semaphore","path":"golang.org/x/sync/semaphore","span":{"start":[41,1],"end":[41,31],"bytes":[894,924]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[43,1],"end":[43,37],"bytes":[926,962]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[44,1],"end":[44,46],"bytes":[963,1008]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient","kind":"struct","span":{"start":[87,1],"end":[127,2],"bytes":[2592,4007]},"callables":{"github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","kind":"method","span":{"start":[1282,1],"end":[1326,2],"bytes":[41353,42491]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1282,1],"end":[1282,63],"bytes":[41353,41415]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"1283:12":{"kind":"call","span":{"start":[1283,12],"end":[1283,23],"bytes":[41427,41438]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1290:15":{"kind":"call","span":{"start":[1290,15],"end":[1293,4],"bytes":[41563,41693]},"callee":null},"1291:11":{"kind":"call","span":{"start":[1291,11],"end":[1291,31],"bytes":[41632,41652]},"callee":null},"1292:11":{"kind":"call","span":{"start":[1292,11],"end":[1292,35],"bytes":[41664,41688]},"callee":null},"1296:6":{"kind":"call","span":{"start":[1296,6],"end":[1296,30],"bytes":[41730,41754]},"callee":null},"1297:16":{"kind":"call","span":{"start":[1297,16],"end":[1297,39],"bytes":[41772,41795]},"callee":null},"1299:11":{"kind":"call","span":{"start":[1299,11],"end":[1299,55],"bytes":[41824,41868]},"callee":null},"1304:13":{"kind":"call","span":{"start":[1304,13],"end":[1304,65],"bytes":[41956,42008]},"callee":null},"1309:6":{"kind":"call","span":{"start":[1309,6],"end":[1309,17],"bytes":[42066,42077]},"callee":null},"1310:12":{"kind":"call","span":{"start":[1310,12],"end":[1310,23],"bytes":[42095,42106]},"callee":null},"1310:8":{"kind":"call","span":{"start":[1310,8],"end":[1310,33],"bytes":[42091,42116]},"callee":null},"1312:15":{"kind":"call","span":{"start":[1312,15],"end":[1315,5],"bytes":[42132,42287]},"callee":null},"1313:12":{"kind":"call","span":{"start":[1313,12],"end":[1313,32],"bytes":[42191,42211]},"callee":null},"1314:54":{"kind":"call","span":{"start":[1314,54],"end":[1314,68],"bytes":[42266,42280]},"callee":null},"1317:11":{"kind":"call","span":{"start":[1317,11],"end":[1317,71],"bytes":[42316,42376]},"callee":null},"1318:20":{"kind":"call","span":{"start":[1318,20],"end":[1318,42],"bytes":[42396,42418]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[1206,1],"end":[1279,2],"bytes":[39234,41319]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1206,1],"end":[1206,87],"bytes":[39234,39320]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[1206,1],"end":[1206,87],"bytes":[39234,39320]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"1207:12":{"kind":"call","span":{"start":[1207,12],"end":[1207,23],"bytes":[39332,39343]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1211:5":{"kind":"call","span":{"start":[1211,5],"end":[1211,11],"bytes":[39379,39385]},"callee":null},"1216:12":{"kind":"call","span":{"start":[1216,12],"end":[1216,53],"bytes":[39466,39507]},"callee":null},"1216:46":{"kind":"call","span":{"start":[1216,46],"end":[1216,52],"bytes":[39500,39506]},"callee":null},"1218:15":{"kind":"call","span":{"start":[1218,15],"end":[1218,61],"bytes":[39548,39594]},"callee":null},"1219:25":{"kind":"call","span":{"start":[1219,25],"end":[1219,69],"bytes":[39619,39663]},"callee":null},"1220:12":{"kind":"call","span":{"start":[1220,12],"end":[1220,72],"bytes":[39675,39735]},"callee":null},"1220:55":{"kind":"call","span":{"start":[1220,55],"end":[1220,70],"bytes":[39718,39733]},"callee":null},"1222:3":{"kind":"call","span":{"start":[1222,3],"end":[1222,121],"bytes":[39739,39857]},"callee":null},"1226:6":{"kind":"call","span":{"start":[1226,6],"end":[1226,17],"bytes":[39889,39900]},"callee":null},"1227:12":{"kind":"call","span":{"start":[1227,12],"end":[1227,23],"bytes":[39918,39929]},"callee":null},"1227:8":{"kind":"call","span":{"start":[1227,8],"end":[1227,33],"bytes":[39914,39939]},"callee":null},"1229:3":{"kind":"call","span":{"start":[1229,3],"end":[1229,57],"bytes":[39943,39997]},"callee":null},"1231:12":{"kind":"call","span":{"start":[1231,12],"end":[1231,22],"bytes":[40010,40020]},"callee":null},"1232:15":{"kind":"call","span":{"start":[1232,15],"end":[1235,5],"bytes":[40035,40167]},"callee":null},"1233:12":{"kind":"call","span":{"start":[1233,12],"end":[1233,32],"bytes":[40094,40114]},"callee":null},"1236:15":{"kind":"call","span":{"start":[1236,15],"end":[1236,32],"bytes":[40182,40199]},"callee":null},"1237:3":{"kind":"call","span":{"start":[1237,3],"end":[1237,86],"bytes":[40202,40285]},"callee":null},"1237:95":{"kind":"call","span":{"start":[1237,95],"end":[1237,113],"bytes":[40294,40312]},"callee":null},"1240:11":{"kind":"call","span":{"start":[1240,11],"end":[1240,67],"bytes":[40343,40399]},"callee":null},"1245:14":{"kind":"call","span":{"start":[1245,14],"end":[1245,30],"bytes":[40451,40467]},"callee":null},"1247:3":{"kind":"call","span":{"start":[1247,3],"end":[1251,43],"bytes":[40474,40629]},"callee":null},"1250:14":{"kind":"call","span":{"start":[1250,14],"end":[1250,29],"bytes":[40570,40585]},"callee":null},"1251:19":{"kind":"call","span":{"start":[1251,19],"end":[1251,42],"bytes":[40605,40628]},"callee":null},"1252:3":{"kind":"call","span":{"start":[1252,3],"end":[1252,81],"bytes":[40632,40710]},"callee":null},"1252:86":{"kind":"call","span":{"start":[1252,86],"end":[1252,102],"bytes":[40715,40731]},"callee":null},"1254:6":{"kind":"call","span":{"start":[1254,6],"end":[1254,21],"bytes":[40739,40754]},"callee":null},"1256:13":{"kind":"call","span":{"start":[1256,13],"end":[1256,33],"bytes":[40807,40827]},"callee":null},"1257:5":{"kind":"call","span":{"start":[1257,5],"end":[1257,89],"bytes":[40832,40916]},"callee":null},"1260:6":{"kind":"call","span":{"start":[1260,6],"end":[1263,42],"bytes":[40944,41077]},"callee":null},"1261:14":{"kind":"call","span":{"start":[1261,14],"end":[1261,33],"bytes":[40995,41014]},"callee":null},"1263:18":{"kind":"call","span":{"start":[1263,18],"end":[1263,41],"bytes":[41053,41076]},"callee":null},"1266:7":{"kind":"call","span":{"start":[1266,7],"end":[1266,22],"bytes":[41095,41110]},"callee":null},"1267:5":{"kind":"call","span":{"start":[1267,5],"end":[1267,85],"bytes":[41121,41201]},"callee":null},"1267:67":{"kind":"call","span":{"start":[1267,67],"end":[1267,82],"bytes":[41183,41198]},"callee":null},"1271:13":{"kind":"call","span":{"start":[1271,13],"end":[1271,35],"bytes":[41224,41246]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","kind":"method","span":{"start":[1329,1],"end":[1363,2],"bytes":[42566,43564]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1329,1],"end":[1329,79],"bytes":[42566,42644]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1330:12":{"kind":"call","span":{"start":[1330,12],"end":[1330,23],"bytes":[42656,42667]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1334:12":{"kind":"call","span":{"start":[1334,12],"end":[1334,48],"bytes":[42715,42751]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.GenerationsPathV3"},"1337:15":{"kind":"call","span":{"start":[1337,15],"end":[1341,4],"bytes":[42833,42993]},"callee":null},"1338:14":{"kind":"call","span":{"start":[1338,14],"end":[1338,34],"bytes":[42905,42925]},"callee":null},"1339:14":{"kind":"call","span":{"start":[1339,14],"end":[1339,32],"bytes":[42940,42958]},"callee":null},"1340:14":{"kind":"call","span":{"start":[1340,14],"end":[1340,29],"bytes":[42973,42988]},"callee":null},"1344:6":{"kind":"call","span":{"start":[1344,6],"end":[1344,30],"bytes":[43026,43050]},"callee":null},"1345:16":{"kind":"call","span":{"start":[1345,16],"end":[1345,39],"bytes":[43068,43091]},"callee":null},"1347:16":{"kind":"call","span":{"start":[1347,16],"end":[1347,59],"bytes":[43125,43168]},"callee":null},"1352:9":{"kind":"call","span":{"start":[1352,9],"end":[1352,32],"bytes":[43324,43347]},"callee":null},"1353:8":{"kind":"call","span":{"start":[1353,8],"end":[1353,37],"bytes":[43355,43384]},"callee":null},"1354:8":{"kind":"call","span":{"start":[1354,8],"end":[1354,34],"bytes":[43392,43418]},"callee":null},"1355:7":{"kind":"call","span":{"start":[1355,7],"end":[1355,37],"bytes":[43425,43455]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3"},"1356:19":{"kind":"call","span":{"start":[1356,19],"end":[1356,41],"bytes":[43476,43498]},"callee":null},"1361:2":{"kind":"call","span":{"start":[1361,2],"end":[1361,26],"bytes":[43513,43537]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.Init":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","kind":"method","span":{"start":[352,1],"end":[504,2],"bytes":[10937,16109]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[352,1],"end":[352,64],"bytes":[10937,11000]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":15},"body":{"353:2":{"kind":"call","span":{"start":[353,2],"end":[353,13],"bytes":[11002,11013]},"callee":null},"354:8":{"kind":"call","span":{"start":[354,8],"end":[354,21],"bytes":[11021,11034]},"callee":null},"362:10":{"kind":"call","span":{"start":[362,10],"end":[362,51],"bytes":[11137,11178]},"callee":null},"366:12":{"kind":"call","span":{"start":[366,12],"end":[366,33],"bytes":[11225,11246]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig"},"376:21":{"kind":"call","span":{"start":[376,21],"end":[376,54],"bytes":[11525,11558]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion"},"377:12":{"kind":"call","span":{"start":[377,12],"end":[377,66],"bytes":[11584,11638]},"callee":null},"414:3":{"kind":"call","span":{"start":[414,3],"end":[414,28],"bytes":[12719,12744]},"callee":null},"415:3":{"kind":"call","span":{"start":[415,3],"end":[415,42],"bytes":[12748,12787]},"callee":null},"419:15":{"kind":"call","span":{"start":[419,15],"end":[419,68],"bytes":[12847,12900]},"callee":null},"419:34":{"kind":"call","span":{"start":[419,34],"end":[419,67],"bytes":[12866,12899]},"callee":null},"429:16":{"kind":"call","span":{"start":[429,16],"end":[431,5],"bytes":[13328,13466]},"callee":null},"429:35":{"kind":"call","span":{"start":[429,35],"end":[431,4],"bytes":[13347,13465]},"callee":null},"430:4":{"kind":"call","span":{"start":[430,4],"end":[430,82],"bytes":[13382,13460]},"callee":null},"438:16":{"kind":"call","span":{"start":[438,16],"end":[438,33],"bytes":[13795,13812]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv"},"439:16":{"kind":"call","span":{"start":[439,16],"end":[439,69],"bytes":[13844,13897]},"callee":null},"439:35":{"kind":"call","span":{"start":[439,35],"end":[439,68],"bytes":[13863,13896]},"callee":null},"443:14":{"kind":"call","span":{"start":[443,14],"end":[443,58],"bytes":[13942,13986]},"callee":null},"445:10":{"kind":"call","span":{"start":[445,10],"end":[445,59],"bytes":[14013,14062]},"callee":null},"465:12":{"kind":"call","span":{"start":[465,12],"end":[468,5],"bytes":[14779,14974]},"callee":null},"472:2":{"kind":"call","span":{"start":[472,2],"end":[472,30],"bytes":[15017,15045]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint"},"475:9":{"kind":"call","span":{"start":[475,9],"end":[475,41],"bytes":[15076,15108]},"callee":null},"486:18":{"kind":"call","span":{"start":[486,18],"end":[488,5],"bytes":[15650,15780]},"callee":null},"492:18":{"kind":"call","span":{"start":[492,18],"end":[494,5],"bytes":[15823,15903]},"callee":null},"497:18":{"kind":"call","span":{"start":[497,18],"end":[499,5],"bytes":[15948,16034]},"callee":null},"501:15":{"kind":"call","span":{"start":[501,15],"end":[501,57],"bytes":[16052,16094]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_1","kind":"function","span":{"start":[450,1],"end":[455,5],"bytes":[14128,14325]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_1","parameters":[{"name":"o","type":"*github.com/aws/aws-sdk-go-v2/service/s3.Options","span":{"start":[450,1],"end":[450,24],"bytes":[14128,14151]}}],"body":{"454:19":{"kind":"call","span":{"start":[454,19],"end":[454,61],"bytes":[14278,14320]},"callee":null},"454:40":{"kind":"call","span":{"start":[454,40],"end":[454,60],"bytes":[14299,14319]},"callee":null}}},"closure_2":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_2","kind":"function","span":{"start":[465,1],"end":[468,5],"bytes":[14768,14974]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_2","parameters":[{"name":"o","type":"*github.com/aws/aws-sdk-go-v2/service/s3.Options","span":{"start":[465,1],"end":[465,48],"bytes":[14768,14815]}}],"body":{}},"closure_3":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_3","kind":"function","span":{"start":[486,1],"end":[488,5],"bytes":[15633,15780]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_3","parameters":[{"name":"u","type":"*github.com/aws/aws-sdk-go-v2/feature/s3/manager.Uploader","span":{"start":[486,1],"end":[486,66],"bytes":[15633,15698]}}],"body":{}},"closure_4":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_4","kind":"function","span":{"start":[492,1],"end":[494,5],"bytes":[15806,15903]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_4","parameters":[{"name":"u","type":"*github.com/aws/aws-sdk-go-v2/feature/s3/manager.Uploader","span":{"start":[492,1],"end":[492,66],"bytes":[15806,15871]}}],"body":{}},"closure_5":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_5","kind":"function","span":{"start":[497,1],"end":[499,5],"bytes":[15931,16034]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_5","parameters":[{"name":"u","type":"*github.com/aws/aws-sdk-go-v2/feature/s3/manager.Uploader","span":{"start":[497,1],"end":[497,66],"bytes":[15931,15996]}}],"body":{}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles","kind":"method","span":{"start":[665,1],"end":[670,2],"bytes":[21965,22213]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[665,1],"end":[665,126],"bytes":[21965,22090]}},{"name":"level","type":"int","span":{"start":[665,1],"end":[665,126],"bytes":[21965,22090]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[665,1],"end":[665,126],"bytes":[21965,22090]}},{"name":"useMetadata","type":"bool","span":{"start":[665,1],"end":[665,126],"bytes":[21965,22090]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"666:12":{"kind":"call","span":{"start":[666,12],"end":[666,23],"bytes":[22102,22113]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"669:9":{"kind":"call","span":{"start":[669,9],"end":[669,58],"bytes":[22157,22206]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[674,1],"end":[712,2],"bytes":[22327,23541]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"level","type":"int","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"offset","type":"int64","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"size","type":"int64","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"675:12":{"kind":"call","span":{"start":[675,12],"end":[675,23],"bytes":[22478,22489]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"681:14":{"kind":"call","span":{"start":[681,14],"end":[681,63],"bytes":[22575,22624]},"callee":null},"683:14":{"kind":"call","span":{"start":[683,14],"end":[683,46],"bytes":[22648,22680]},"callee":null},"687:14":{"kind":"call","span":{"start":[687,14],"end":[687,50],"bytes":[22735,22771]},"callee":null},"688:24":{"kind":"call","span":{"start":[688,24],"end":[688,63],"bytes":[22795,22834]},"callee":null},"691:11":{"kind":"call","span":{"start":[691,11],"end":[691,31],"bytes":[22876,22896]},"callee":null},"692:11":{"kind":"call","span":{"start":[692,11],"end":[692,26],"bytes":[22908,22923]},"callee":null},"693:11":{"kind":"call","span":{"start":[693,11],"end":[693,31],"bytes":[22935,22955]},"callee":null},"699:32":{"kind":"call","span":{"start":[699,32],"end":[699,66],"bytes":[23187,23221]},"callee":null},"700:26":{"kind":"call","span":{"start":[700,26],"end":[700,54],"bytes":[23247,23275]},"callee":null},"701:29":{"kind":"call","span":{"start":[701,29],"end":[701,60],"bytes":[23304,23335]},"callee":null},"704:14":{"kind":"call","span":{"start":[704,14],"end":[704,40],"bytes":[23353,23379]},"callee":null},"706:6":{"kind":"call","span":{"start":[706,6],"end":[706,22],"bytes":[23402,23418]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"709:15":{"kind":"call","span":{"start":[709,15],"end":[709,60],"bytes":[23469,23514]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","kind":"method","span":{"start":[1455,1],"end":[1483,2],"bytes":[46180,46988]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1455,1],"end":[1455,115],"bytes":[46180,46294]}},{"name":"generation","type":"string","span":{"start":[1455,1],"end":[1455,115],"bytes":[46180,46294]}},{"name":"index","type":"int","span":{"start":[1455,1],"end":[1455,115],"bytes":[46180,46294]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"1456:12":{"kind":"call","span":{"start":[1456,12],"end":[1456,23],"bytes":[46306,46317]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1460:9":{"kind":"call","span":{"start":[1460,9],"end":[1460,61],"bytes":[46362,46414]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3"},"1463:11":{"kind":"call","span":{"start":[1463,11],"end":[1463,31],"bytes":[46456,46476]},"callee":null},"1464:11":{"kind":"call","span":{"start":[1464,11],"end":[1464,26],"bytes":[46488,46503]},"callee":null},"1469:32":{"kind":"call","span":{"start":[1469,32],"end":[1469,66],"bytes":[46608,46642]},"callee":null},"1470:26":{"kind":"call","span":{"start":[1470,26],"end":[1470,54],"bytes":[46668,46696]},"callee":null},"1471:29":{"kind":"call","span":{"start":[1471,29],"end":[1471,60],"bytes":[46725,46756]},"callee":null},"1474:14":{"kind":"call","span":{"start":[1474,14],"end":[1474,40],"bytes":[46774,46800]},"callee":null},"1476:6":{"kind":"call","span":{"start":[1476,6],"end":[1476,22],"bytes":[46823,46839]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"1479:15":{"kind":"call","span":{"start":[1479,15],"end":[1479,62],"bytes":[46890,46937]},"callee":null},"1482:9":{"kind":"call","span":{"start":[1482,9],"end":[1482,40],"bytes":[46950,46981]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","kind":"method","span":{"start":[1487,1],"end":[1515,2],"bytes":[47110,47947]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1487,1],"end":[1487,131],"bytes":[47110,47240]}},{"name":"generation","type":"string","span":{"start":[1487,1],"end":[1487,131],"bytes":[47110,47240]}},{"name":"index","type":"int","span":{"start":[1487,1],"end":[1487,131],"bytes":[47110,47240]}},{"name":"offset","type":"int64","span":{"start":[1487,1],"end":[1487,131],"bytes":[47110,47240]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"1488:12":{"kind":"call","span":{"start":[1488,12],"end":[1488,23],"bytes":[47252,47263]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1492:9":{"kind":"call","span":{"start":[1492,9],"end":[1492,71],"bytes":[47308,47370]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3"},"1495:11":{"kind":"call","span":{"start":[1495,11],"end":[1495,31],"bytes":[47412,47432]},"callee":null},"1496:11":{"kind":"call","span":{"start":[1496,11],"end":[1496,26],"bytes":[47444,47459]},"callee":null},"1501:32":{"kind":"call","span":{"start":[1501,32],"end":[1501,66],"bytes":[47564,47598]},"callee":null},"1502:26":{"kind":"call","span":{"start":[1502,26],"end":[1502,54],"bytes":[47624,47652]},"callee":null},"1503:29":{"kind":"call","span":{"start":[1503,29],"end":[1503,60],"bytes":[47681,47712]},"callee":null},"1506:14":{"kind":"call","span":{"start":[1506,14],"end":[1506,40],"bytes":[47730,47756]},"callee":null},"1508:6":{"kind":"call","span":{"start":[1508,6],"end":[1508,22],"bytes":[47779,47795]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"1511:15":{"kind":"call","span":{"start":[1511,15],"end":[1511,65],"bytes":[47846,47896]},"callee":null},"1514:9":{"kind":"call","span":{"start":[1514,9],"end":[1514,40],"bytes":[47909,47940]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.SetLogger":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SetLogger","kind":"method","span":{"start":[139,1],"end":[141,2],"bytes":[4292,4398]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[139,1],"end":[139,57],"bytes":[4292,4348]}}],"metrics":{"cyclomatic":1},"body":{"140:13":{"kind":"call","span":{"start":[140,13],"end":[140,48],"bytes":[4361,4396]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","kind":"method","span":{"start":[1366,1],"end":[1405,2],"bytes":[43634,44751]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1366,1],"end":[1366,115],"bytes":[43634,43748]}},{"name":"generation","type":"string","span":{"start":[1366,1],"end":[1366,115],"bytes":[43634,43748]}}],"return_type":"([]github.com/benbjohnson/litestream.SnapshotInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1367:12":{"kind":"call","span":{"start":[1367,12],"end":[1367,23],"bytes":[43760,43771]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1371:12":{"kind":"call","span":{"start":[1371,12],"end":[1371,58],"bytes":[43819,43865]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3"},"1373:15":{"kind":"call","span":{"start":[1373,15],"end":[1376,4],"bytes":[43887,44011]},"callee":null},"1374:11":{"kind":"call","span":{"start":[1374,11],"end":[1374,31],"bytes":[43956,43976]},"callee":null},"1375:11":{"kind":"call","span":{"start":[1375,11],"end":[1375,29],"bytes":[43988,44006]},"callee":null},"1379:6":{"kind":"call","span":{"start":[1379,6],"end":[1379,30],"bytes":[44061,44085]},"callee":null},"1380:16":{"kind":"call","span":{"start":[1380,16],"end":[1380,39],"bytes":[44103,44126]},"callee":null},"1382:16":{"kind":"call","span":{"start":[1382,16],"end":[1382,57],"bytes":[44160,44201]},"callee":null},"1386:11":{"kind":"call","span":{"start":[1386,11],"end":[1386,43],"bytes":[44255,44287]},"callee":null},"1386:21":{"kind":"call","span":{"start":[1386,21],"end":[1386,42],"bytes":[44265,44286]},"callee":null},"1387:18":{"kind":"call","span":{"start":[1387,18],"end":[1387,57],"bytes":[44305,44344]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3"},"1392:16":{"kind":"call","span":{"start":[1392,16],"end":[1397,6],"bytes":[44424,44616]},"callee":null},"1395:17":{"kind":"call","span":{"start":[1395,17],"end":[1395,38],"bytes":[44536,44557]},"callee":null},"1396:17":{"kind":"call","span":{"start":[1396,17],"end":[1396,45],"bytes":[44575,44603]},"callee":null},"1401:2":{"kind":"call","span":{"start":[1401,2],"end":[1403,4],"bytes":[44626,44726]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3.closure_1","kind":"function","span":{"start":[1401,1],"end":[1403,4],"bytes":[44625,44726]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3.closure_1","parameters":[{"name":"a","type":"github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[1401,1],"end":[1401,71],"bytes":[44625,44695]}},{"name":"b","type":"github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[1401,1],"end":[1401,71],"bytes":[44625,44695]}}],"return_type":"int","body":{}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.Type":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Type","kind":"method","span":{"start":[347,1],"end":[349,2],"bytes":[10796,10863]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","kind":"method","span":{"start":[1408,1],"end":[1451,2],"bytes":[44838,46063]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1408,1],"end":[1408,119],"bytes":[44838,44956]}},{"name":"generation","type":"string","span":{"start":[1408,1],"end":[1408,119],"bytes":[44838,44956]}}],"return_type":"([]github.com/benbjohnson/litestream.WALSegmentInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"1409:12":{"kind":"call","span":{"start":[1409,12],"end":[1409,23],"bytes":[44968,44979]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1413:12":{"kind":"call","span":{"start":[1413,12],"end":[1413,52],"bytes":[45027,45067]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALPathV3"},"1415:15":{"kind":"call","span":{"start":[1415,15],"end":[1418,4],"bytes":[45089,45213]},"callee":null},"1416:11":{"kind":"call","span":{"start":[1416,11],"end":[1416,31],"bytes":[45158,45178]},"callee":null},"1417:11":{"kind":"call","span":{"start":[1417,11],"end":[1417,29],"bytes":[45190,45208]},"callee":null},"1421:6":{"kind":"call","span":{"start":[1421,6],"end":[1421,30],"bytes":[45264,45288]},"callee":null},"1422:16":{"kind":"call","span":{"start":[1422,16],"end":[1422,39],"bytes":[45306,45329]},"callee":null},"1424:16":{"kind":"call","span":{"start":[1424,16],"end":[1424,60],"bytes":[45363,45407]},"callee":null},"1428:11":{"kind":"call","span":{"start":[1428,11],"end":[1428,43],"bytes":[45461,45493]},"callee":null},"1428:21":{"kind":"call","span":{"start":[1428,21],"end":[1428,42],"bytes":[45471,45492]},"callee":null},"1429:26":{"kind":"call","span":{"start":[1429,26],"end":[1429,67],"bytes":[45519,45560]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3"},"1434:15":{"kind":"call","span":{"start":[1434,15],"end":[1440,6],"bytes":[45639,45856]},"callee":null},"1438:17":{"kind":"call","span":{"start":[1438,17],"end":[1438,38],"bytes":[45776,45797]},"callee":null},"1439:17":{"kind":"call","span":{"start":[1439,17],"end":[1439,45],"bytes":[45815,45843]},"callee":null},"1444:2":{"kind":"call","span":{"start":[1444,2],"end":[1449,4],"bytes":[45866,46039]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3.closure_1","kind":"function","span":{"start":[1444,1],"end":[1449,4],"bytes":[45865,46039]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3.closure_1","parameters":[{"name":"a","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1444,1],"end":[1444,72],"bytes":[45865,45936]}},{"name":"b","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1444,1],"end":[1444,72],"bytes":[45865,45936]}}],"return_type":"int","body":{"1448:10":{"kind":"call","span":{"start":[1448,10],"end":[1448,41],"bytes":[46004,46035]},"callee":null}}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[718,1],"end":[758,2],"bytes":[23853,25147]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}},{"name":"level","type":"int","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}},{"name":"r","type":"io.Reader","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"719:12":{"kind":"call","span":{"start":[719,12],"end":[719,23],"bytes":[23998,24009]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"723:14":{"kind":"call","span":{"start":[723,14],"end":[723,50],"bytes":[24059,24095]},"callee":null},"724:24":{"kind":"call","span":{"start":[724,24],"end":[724,63],"bytes":[24119,24158]},"callee":null},"726:14":{"kind":"call","span":{"start":[726,14],"end":[726,50],"bytes":[24173,24209]},"callee":null},"735:15":{"kind":"call","span":{"start":[735,15],"end":[735,114],"bytes":[24496,24595]},"callee":null},"738:32":{"kind":"call","span":{"start":[738,32],"end":[738,66],"bytes":[24631,24665]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX"},"743:2":{"kind":"call","span":{"start":[743,2],"end":[743,77],"bytes":[24706,24781]},"callee":null},"744:2":{"kind":"call","span":{"start":[744,2],"end":[744,77],"bytes":[24789,24864]},"callee":null},"744:82":{"kind":"call","span":{"start":[744,82],"end":[744,95],"bytes":[24869,24882]},"callee":null},"748:15":{"kind":"call","span":{"start":[748,15],"end":[748,64],"bytes":[24954,25003]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint","kind":"method","span":{"start":[507,1],"end":[525,2],"bytes":[16199,16763]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint","parameters":[{"name":"opts","type":"*[]func(*github.com/aws/aws-sdk-go-v2/service/s3.Options)","span":{"start":[507,1],"end":[507,71],"bytes":[16199,16269]}}],"metrics":{"cyclomatic":4},"body":{"509:11":{"kind":"call","span":{"start":[509,11],"end":[523,5],"bytes":[16303,16758]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1","kind":"function","span":{"start":[509,1],"end":[523,5],"bytes":[16293,16758]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1","parameters":[{"name":"o","type":"*github.com/aws/aws-sdk-go-v2/service/s3.Options","span":{"start":[509,1],"end":[509,46],"bytes":[16293,16338]}}],"body":{"514:51":{"kind":"call","span":{"start":[514,51],"end":[514,90],"bytes":[16485,16524]},"callee":null},"514:8":{"kind":"call","span":{"start":[514,8],"end":[514,46],"bytes":[16442,16480]},"callee":null},"518:21":{"kind":"call","span":{"start":[518,21],"end":[518,41],"bytes":[16590,16610]},"callee":null},"520:7":{"kind":"call","span":{"start":[520,7],"end":[520,45],"bytes":[16666,16704]},"callee":null}}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","kind":"method","span":{"start":[615,1],"end":[658,2],"bytes":[20313,21577]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[615,1],"end":[615,95],"bytes":[20313,20407]}},{"name":"bucket","type":"string","span":{"start":[615,1],"end":[615,95],"bytes":[20313,20407]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"618:3":{"kind":"call","span":{"start":[618,3],"end":[618,42],"bytes":[20510,20549]},"callee":null},"623:16":{"kind":"call","span":{"start":[623,16],"end":[625,5],"bytes":[20662,20800]},"callee":null},"623:35":{"kind":"call","span":{"start":[623,35],"end":[625,4],"bytes":[20681,20799]},"callee":null},"624:4":{"kind":"call","span":{"start":[624,4],"end":[624,82],"bytes":[20716,20794]},"callee":null},"629:14":{"kind":"call","span":{"start":[629,14],"end":[629,58],"bytes":[20845,20889]},"callee":null},"631:14":{"kind":"call","span":{"start":[631,14],"end":[631,81],"bytes":[20920,20987]},"callee":null},"641:2":{"kind":"call","span":{"start":[641,2],"end":[641,30],"bytes":[21182,21210]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint"},"643:12":{"kind":"call","span":{"start":[643,12],"end":[643,44],"bytes":[21223,21255]},"callee":null},"646:14":{"kind":"call","span":{"start":[646,14],"end":[648,4],"bytes":[21294,21385]},"callee":null},"647:11":{"kind":"call","span":{"start":[647,11],"end":[647,29],"bytes":[21362,21380]},"callee":null},"657:9":{"kind":"call","span":{"start":[657,9],"end":[657,39],"bytes":[21540,21570]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption","kind":"method","span":{"start":[887,1],"end":[1075,2],"bytes":[30071,36313]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption","parameters":[],"return_type":"func(*github.com/aws/smithy-go/middleware.Stack) error","metrics":{"cyclomatic":30},"body":{},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1","kind":"function","span":{"start":[888,1],"end":[1074,3],"bytes":[30146,36311]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1","parameters":[{"name":"stack","type":"*github.com/aws/smithy-go/middleware.Stack","span":{"start":[888,1],"end":[888,46],"bytes":[30146,30191]}}],"return_type":"error","error_channel":["error"],"body":{"1006:4":{"kind":"call","span":{"start":[1006,4],"end":[1006,52],"bytes":[34113,34161]},"callee":null},"1011:13":{"kind":"call","span":{"start":[1011,13],"end":[1028,4],"bytes":[34302,34885]},"callee":null},"1012:4":{"kind":"call","span":{"start":[1012,4],"end":[1026,5],"bytes":[34325,34859]},"callee":null},"1067:13":{"kind":"call","span":{"start":[1067,13],"end":[1067,113],"bytes":[36075,36175]},"callee":null},"1067:35":{"kind":"call","span":{"start":[1067,35],"end":[1067,50],"bytes":[36097,36112]},"callee":null},"1068:14":{"kind":"call","span":{"start":[1068,14],"end":[1068,67],"bytes":[36203,36256]},"callee":null},"1068:33":{"kind":"call","span":{"start":[1068,33],"end":[1068,48],"bytes":[36222,36237]},"callee":null},"890:14":{"kind":"call","span":{"start":[890,14],"end":[917,5],"bytes":[30232,31162]},"callee":null},"891:5":{"kind":"call","span":{"start":[891,5],"end":[915,6],"bytes":[30257,31133]},"callee":null},"922:13":{"kind":"call","span":{"start":[922,13],"end":[940,4],"bytes":[31214,31850]},"callee":null},"923:4":{"kind":"call","span":{"start":[923,4],"end":[938,5],"bytes":[31234,31824]},"callee":null},"944:6":{"kind":"call","span":{"start":[944,6],"end":[944,45],"bytes":[31889,31928]},"callee":null},"945:14":{"kind":"call","span":{"start":[945,14],"end":[958,5],"bytes":[31944,32405]},"callee":null},"946:5":{"kind":"call","span":{"start":[946,5],"end":[956,6],"bytes":[31965,32377]},"callee":null},"963:31":{"kind":"call","span":{"start":[963,31],"end":[963,82],"bytes":[32475,32526]},"callee":null},"964:14":{"kind":"call","span":{"start":[964,14],"end":[978,5],"bytes":[32542,33032]},"callee":null},"965:5":{"kind":"call","span":{"start":[965,5],"end":[975,6],"bytes":[32569,32988]},"callee":null},"988:8":{"kind":"call","span":{"start":[988,8],"end":[988,54],"bytes":[33334,33380]},"callee":null},"989:14":{"kind":"call","span":{"start":[989,14],"end":[989,52],"bytes":[33394,33432]},"callee":null},"992:8":{"kind":"call","span":{"start":[992,8],"end":[992,53],"bytes":[33474,33519]},"callee":null},"993:14":{"kind":"call","span":{"start":[993,14],"end":[993,56],"bytes":[33533,33575]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1","kind":"function","span":{"start":[893,1],"end":[914,8],"bytes":[30335,31127]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[893,1],"end":[893,97],"bytes":[30335,30431]}},{"name":"in","type":"github.com/aws/smithy-go/middleware.SerializeInput","span":{"start":[893,1],"end":[893,97],"bytes":[30335,30431]}},{"name":"next","type":"github.com/aws/smithy-go/middleware.SerializeHandler","span":{"start":[893,1],"end":[893,97],"bytes":[30335,30431]}}],"return_type":"(github.com/aws/smithy-go/middleware.SerializeOutput, github.com/aws/smithy-go/middleware.Metadata, error)","error_channel":["error"],"body":{"896:10":{"kind":"call","span":{"start":[896,10],"end":[896,42],"bytes":[30529,30561]},"callee":null},"897:15":{"kind":"call","span":{"start":[897,15],"end":[897,44],"bytes":[30597,30626]},"callee":null},"901:56":{"kind":"call","span":{"start":[901,56],"end":[901,81],"bytes":[30749,30774]},"callee":null},"902:15":{"kind":"call","span":{"start":[902,15],"end":[902,44],"bytes":[30796,30825]},"callee":null},"905:24":{"kind":"call","span":{"start":[905,24],"end":[905,68],"bytes":[30858,30902]},"callee":null},"910:14":{"kind":"call","span":{"start":[910,14],"end":[910,76],"bytes":[31005,31067]},"callee":null},"913:14":{"kind":"call","span":{"start":[913,14],"end":[913,43],"bytes":[31090,31119]},"callee":null}}},"closure_2":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2","kind":"function","span":{"start":[925,1],"end":[937,7],"bytes":[31293,31819]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[925,1],"end":[925,88],"bytes":[31293,31380]}},{"name":"in","type":"github.com/aws/smithy-go/middleware.BuildInput","span":{"start":[925,1],"end":[925,88],"bytes":[31293,31380]}},{"name":"next","type":"github.com/aws/smithy-go/middleware.BuildHandler","span":{"start":[925,1],"end":[925,88],"bytes":[31293,31380]}}],"return_type":"(github.com/aws/smithy-go/middleware.BuildOutput, github.com/aws/smithy-go/middleware.Metadata, error)","error_channel":["error"],"body":{"929:18":{"kind":"call","span":{"start":[929,18],"end":[929,46],"bytes":[31538,31566]},"callee":null},"931:8":{"kind":"call","span":{"start":[931,8],"end":[931,50],"bytes":[31599,31641]},"callee":null},"932:18":{"kind":"call","span":{"start":[932,18],"end":[932,57],"bytes":[31659,31698]},"callee":null},"933:8":{"kind":"call","span":{"start":[933,8],"end":[933,59],"bytes":[31708,31759]},"callee":null},"936:13":{"kind":"call","span":{"start":[936,13],"end":[936,38],"bytes":[31787,31812]},"callee":null}}},"closure_3":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_3","kind":"function","span":{"start":[948,1],"end":[955,8],"bytes":[32032,32371]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[948,1],"end":[948,89],"bytes":[32032,32120]}},{"name":"in","type":"github.com/aws/smithy-go/middleware.BuildInput","span":{"start":[948,1],"end":[948,89],"bytes":[32032,32120]}},{"name":"next","type":"github.com/aws/smithy-go/middleware.BuildHandler","span":{"start":[948,1],"end":[948,89],"bytes":[32032,32120]}}],"return_type":"(github.com/aws/smithy-go/middleware.BuildOutput, github.com/aws/smithy-go/middleware.Metadata, error)","error_channel":["error"],"body":{"952:8":{"kind":"call","span":{"start":[952,8],"end":[952,53],"bytes":[32271,32316]},"callee":null},"954:14":{"kind":"call","span":{"start":[954,14],"end":[954,39],"bytes":[32338,32363]},"callee":null}}},"closure_4":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_4","kind":"function","span":{"start":[967,1],"end":[974,8],"bytes":[32643,32982]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_4","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[967,1],"end":[967,95],"bytes":[32643,32737]}},{"name":"in","type":"github.com/aws/smithy-go/middleware.FinalizeInput","span":{"start":[967,1],"end":[967,95],"bytes":[32643,32737]}},{"name":"next","type":"github.com/aws/smithy-go/middleware.FinalizeHandler","span":{"start":[967,1],"end":[967,95],"bytes":[32643,32737]}}],"return_type":"(github.com/aws/smithy-go/middleware.FinalizeOutput, github.com/aws/smithy-go/middleware.Metadata, error)","error_channel":["error"],"body":{"971:8":{"kind":"call","span":{"start":[971,8],"end":[971,41],"bytes":[32891,32924]},"callee":null},"973:14":{"kind":"call","span":{"start":[973,14],"end":[973,42],"bytes":[32946,32974]},"callee":null}}},"closure_5":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5","kind":"function","span":{"start":[1014,1],"end":[1025,7],"bytes":[34390,34854]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1014,1],"end":[1014,94],"bytes":[34390,34483]}},{"name":"in","type":"github.com/aws/smithy-go/middleware.FinalizeInput","span":{"start":[1014,1],"end":[1014,94],"bytes":[34390,34483]}},{"name":"next","type":"github.com/aws/smithy-go/middleware.FinalizeHandler","span":{"start":[1014,1],"end":[1014,94],"bytes":[34390,34483]}}],"return_type":"(github.com/aws/smithy-go/middleware.FinalizeOutput, github.com/aws/smithy-go/middleware.Metadata, error)","error_channel":["error"],"body":{"1018:7":{"kind":"call","span":{"start":[1018,7],"end":[1022,8],"bytes":[34633,34799]},"callee":null},"1020:15":{"kind":"call","span":{"start":[1020,15],"end":[1020,31],"bytes":[34705,34721]},"callee":null},"1021:31":{"kind":"call","span":{"start":[1021,31],"end":[1021,68],"bytes":[34753,34790]},"callee":null},"1024:13":{"kind":"call","span":{"start":[1024,13],"end":[1024,41],"bytes":[34819,34847]},"callee":null}}},"closure_6":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6","kind":"function","span":{"start":[1036,1],"end":[1062,4],"bytes":[34966,35818]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6","parameters":[],"return_type":"github.com/aws/smithy-go/middleware.FinalizeMiddleware","body":{"1037:11":{"kind":"call","span":{"start":[1037,11],"end":[1061,5],"bytes":[35034,35814]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1","kind":"function","span":{"start":[1039,1],"end":[1060,7],"bytes":[35103,35809]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1039,1],"end":[1039,94],"bytes":[35103,35196]}},{"name":"in","type":"github.com/aws/smithy-go/middleware.FinalizeInput","span":{"start":[1039,1],"end":[1039,94],"bytes":[35103,35196]}},{"name":"next","type":"github.com/aws/smithy-go/middleware.FinalizeHandler","span":{"start":[1039,1],"end":[1039,94],"bytes":[35103,35196]}}],"return_type":"(github.com/aws/smithy-go/middleware.FinalizeOutput, github.com/aws/smithy-go/middleware.Metadata, error)","error_channel":["error"],"body":{"1042:9":{"kind":"call","span":{"start":[1042,9],"end":[1042,41],"bytes":[35290,35322]},"callee":null},"1043:14":{"kind":"call","span":{"start":[1043,14],"end":[1043,42],"bytes":[35357,35385]},"callee":null},"1046:21":{"kind":"call","span":{"start":[1046,21],"end":[1046,72],"bytes":[35414,35465]},"callee":null},"1048:14":{"kind":"call","span":{"start":[1048,14],"end":[1048,42],"bytes":[35513,35541]},"callee":null},"1053:14":{"kind":"call","span":{"start":[1053,14],"end":[1053,42],"bytes":[35626,35654]},"callee":null},"1055:9":{"kind":"call","span":{"start":[1055,9],"end":[1055,38],"bytes":[35670,35699]},"callee":null},"1056:7":{"kind":"call","span":{"start":[1056,7],"end":[1056,46],"bytes":[35714,35753]},"callee":null},"1059:13":{"kind":"call","span":{"start":[1059,13],"end":[1059,41],"bytes":[35774,35802]},"callee":null}}}}}}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","kind":"method","span":{"start":[858,1],"end":[885,2],"bytes":[29179,30069]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","parameters":[{"name":"key","type":"string","span":{"start":[858,1],"end":[858,93],"bytes":[29179,29271]}},{"name":"timestamp","type":"time.Time","span":{"start":[858,1],"end":[858,93],"bytes":[29179,29271]}}],"return_type":"*github.com/aws/aws-sdk-go-v2/service/s3.PutObjectInput","metrics":{"cyclomatic":4},"body":{"860:11":{"kind":"call","span":{"start":[860,11],"end":[860,31],"bytes":[29312,29332]},"callee":null},"861:11":{"kind":"call","span":{"start":[861,11],"end":[861,26],"bytes":[29344,29359]},"callee":null},"864:26":{"kind":"call","span":{"start":[864,26],"end":[864,60],"bytes":[29486,29520]},"callee":null},"868:24":{"kind":"call","span":{"start":[868,24],"end":[868,58],"bytes":[29580,29614]},"callee":null},"873:32":{"kind":"call","span":{"start":[873,32],"end":[873,66],"bytes":[29718,29752]},"callee":null},"874:26":{"kind":"call","span":{"start":[874,26],"end":[874,54],"bytes":[29778,29806]},"callee":null},"875:29":{"kind":"call","span":{"start":[875,29],"end":[875,60],"bytes":[29835,29866]},"callee":null},"881:23":{"kind":"call","span":{"start":[881,23],"end":[881,48],"bytes":[30024,30049]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","kind":"method","span":{"start":[762,1],"end":[773,2],"bytes":[25286,25901]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[762,1],"end":[762,133],"bytes":[25286,25418]}},{"name":"key","type":"string","span":{"start":[762,1],"end":[762,133],"bytes":[25286,25418]}},{"name":"r","type":"io.Reader","span":{"start":[762,1],"end":[762,133],"bytes":[25286,25418]}},{"name":"partSize","type":"int64","span":{"start":[762,1],"end":[762,133],"bytes":[25286,25418]}}],"return_type":"(int64, time.Time, *string, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"766:20":{"kind":"call","span":{"start":[766,20],"end":[766,46],"bytes":[25610,25636]},"callee":null},"767:11":{"kind":"call","span":{"start":[767,11],"end":[767,58],"bytes":[25661,25708]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX"},"772:9":{"kind":"call","span":{"start":[772,9],"end":[772,51],"bytes":[25857,25899]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","kind":"method","span":{"start":[776,1],"end":[816,2],"bytes":[25973,27460]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}},{"name":"key","type":"string","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}},{"name":"rs","type":"io.ReadSeeker","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}},{"name":"start","type":"int64","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}},{"name":"partSize","type":"int64","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}}],"return_type":"(int64, time.Time, *string, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"777:14":{"kind":"call","span":{"start":[777,14],"end":[777,36],"bytes":[26136,26158]},"callee":null},"779:31":{"kind":"call","span":{"start":[779,31],"end":[779,79],"bytes":[26206,26254]},"callee":null},"782:15":{"kind":"call","span":{"start":[782,15],"end":[782,43],"bytes":[26293,26321]},"callee":null},"783:31":{"kind":"call","span":{"start":[783,31],"end":[783,81],"bytes":[26366,26416]},"callee":null},"788:17":{"kind":"call","span":{"start":[788,17],"end":[788,35],"bytes":[26526,26544]},"callee":null},"790:31":{"kind":"call","span":{"start":[790,31],"end":[790,87],"bytes":[26592,26648]},"callee":null},"792:15":{"kind":"call","span":{"start":[792,15],"end":[792,44],"bytes":[26666,26695]},"callee":null},"793:15":{"kind":"call","span":{"start":[793,15],"end":[793,43],"bytes":[26716,26744]},"callee":null},"794:31":{"kind":"call","span":{"start":[794,31],"end":[794,81],"bytes":[26789,26839]},"callee":null},"797:11":{"kind":"call","span":{"start":[797,11],"end":[797,43],"bytes":[26854,26886]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput"},"801:25":{"kind":"call","span":{"start":[801,25],"end":[801,40],"bytes":[26951,26966]},"callee":null},"802:15":{"kind":"call","span":{"start":[802,15],"end":[802,41],"bytes":[26981,27007]},"callee":null},"804:32":{"kind":"call","span":{"start":[804,32],"end":[804,77],"bytes":[27057,27102]},"callee":null},"811:14":{"kind":"call","span":{"start":[811,14],"end":[811,43],"bytes":[27295,27324]},"callee":null},"813:31":{"kind":"call","span":{"start":[813,31],"end":[813,75],"bytes":[27372,27416]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","kind":"method","span":{"start":[820,1],"end":[854,2],"bytes":[27615,29032]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[820,1],"end":[820,141],"bytes":[27615,27755]}},{"name":"key","type":"string","span":{"start":[820,1],"end":[820,141],"bytes":[27615,27755]}},{"name":"r","type":"io.Reader","span":{"start":[820,1],"end":[820,141],"bytes":[27615,27755]}},{"name":"partSize","type":"int64","span":{"start":[820,1],"end":[820,141],"bytes":[27615,27755]}}],"return_type":"(int64, time.Time, *string, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"823:17":{"kind":"call","span":{"start":[823,17],"end":[823,54],"bytes":[27867,27904]},"callee":null},"823:32":{"kind":"call","span":{"start":[823,32],"end":[823,53],"bytes":[27882,27903]},"callee":null},"825:31":{"kind":"call","span":{"start":[825,31],"end":[825,87],"bytes":[27952,28008]},"callee":null},"827:15":{"kind":"call","span":{"start":[827,15],"end":[827,44],"bytes":[28026,28055]},"callee":null},"829:15":{"kind":"call","span":{"start":[829,15],"end":[829,59],"bytes":[28077,28121]},"callee":null},"829:42":{"kind":"call","span":{"start":[829,42],"end":[829,58],"bytes":[28104,28120]},"callee":null},"829:48":{"kind":"call","span":{"start":[829,48],"end":[829,57],"bytes":[28110,28119]},"callee":null},"829:76":{"kind":"call","span":{"start":[829,76],"end":[829,98],"bytes":[28138,28160]},"callee":null},"830:31":{"kind":"call","span":{"start":[830,31],"end":[830,83],"bytes":[28193,28245]},"callee":null},"833:11":{"kind":"call","span":{"start":[833,11],"end":[833,43],"bytes":[28260,28292]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput"},"836:13":{"kind":"call","span":{"start":[836,13],"end":[836,29],"bytes":[28380,28396]},"callee":null},"836:19":{"kind":"call","span":{"start":[836,19],"end":[836,28],"bytes":[28386,28395]},"callee":null},"837:16":{"kind":"call","span":{"start":[837,16],"end":[837,44],"bytes":[28431,28459]},"callee":null},"837:32":{"kind":"call","span":{"start":[837,32],"end":[837,43],"bytes":[28447,28458]},"callee":null},"838:25":{"kind":"call","span":{"start":[838,25],"end":[838,40],"bytes":[28484,28499]},"callee":null},"839:15":{"kind":"call","span":{"start":[839,15],"end":[839,41],"bytes":[28514,28540]},"callee":null},"841:32":{"kind":"call","span":{"start":[841,32],"end":[841,77],"bytes":[28590,28635]},"callee":null},"847:32":{"kind":"call","span":{"start":[847,32],"end":[847,79],"bytes":[28786,28833]},"callee":null},"847:47":{"kind":"call","span":{"start":[847,47],"end":[847,75],"bytes":[28801,28829]},"callee":null},"847:63":{"kind":"call","span":{"start":[847,63],"end":[847,74],"bytes":[28817,28828]},"callee":null},"847:8":{"kind":"call","span":{"start":[847,8],"end":[847,80],"bytes":[28762,28834]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter"},"849:14":{"kind":"call","span":{"start":[849,14],"end":[849,43],"bytes":[28865,28894]},"callee":null},"851:31":{"kind":"call","span":{"start":[851,31],"end":[851,75],"bytes":[28942,28986]},"callee":null},"853:9":{"kind":"call","span":{"start":[853,9],"end":[853,15],"bytes":[28998,29004]},"callee":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","kind":"method","span":{"start":[528,1],"end":[582,2],"bytes":[16834,18856]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":14},"body":{"531:10":{"kind":"call","span":{"start":[531,10],"end":[531,108],"bytes":[17014,17112]},"callee":null},"540:11":{"kind":"call","span":{"start":[540,11],"end":[540,98],"bytes":[17360,17447]},"callee":null},"544:20":{"kind":"call","span":{"start":[544,20],"end":[544,69],"bytes":[17547,17596]},"callee":null},"546:11":{"kind":"call","span":{"start":[546,11],"end":[546,75],"bytes":[17625,17689]},"callee":null},"548:6":{"kind":"call","span":{"start":[548,6],"end":[548,19],"bytes":[17699,17712]},"callee":null},"549:100":{"kind":"call","span":{"start":[549,100],"end":[549,113],"bytes":[17820,17833]},"callee":null},"549:11":{"kind":"call","span":{"start":[549,11],"end":[549,114],"bytes":[17731,17834]},"callee":null},"554:11":{"kind":"call","span":{"start":[554,11],"end":[554,28],"bytes":[17921,17938]},"callee":null},"555:26":{"kind":"call","span":{"start":[555,26],"end":[555,67],"bytes":[17964,18005]},"callee":null},"561:51":{"kind":"call","span":{"start":[561,51],"end":[561,90],"bytes":[18189,18228]},"callee":null},"561:8":{"kind":"call","span":{"start":[561,8],"end":[561,46],"bytes":[18146,18184]},"callee":null},"564:7":{"kind":"call","span":{"start":[564,7],"end":[564,45],"bytes":[18279,18317]},"callee":null},"565:15":{"kind":"call","span":{"start":[565,15],"end":[565,34],"bytes":[18334,18353]},"callee":null},"567:14":{"kind":"call","span":{"start":[567,14],"end":[567,26],"bytes":[18387,18399]},"callee":null},"571:22":{"kind":"call","span":{"start":[571,22],"end":[571,39],"bytes":[18518,18535]},"callee":null},"571:55":{"kind":"call","span":{"start":[571,55],"end":[571,70],"bytes":[18551,18566]},"callee":null},"571:74":{"kind":"call","span":{"start":[571,74],"end":[571,88],"bytes":[18570,18584]},"callee":null},"574:14":{"kind":"call","span":{"start":[574,14],"end":[574,123],"bytes":[18707,18816]},"callee":null}}}},"fields":{"AccessKeyID":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/AccessKeyID","kind":"field","type":"string","span":{"start":[94,1],"end":[94,24],"bytes":[2757,2780]}},"Bucket":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Bucket","kind":"field","type":"string","span":{"start":[99,1],"end":[99,27],"bytes":[2859,2885]}},"Concurrency":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Concurrency","kind":"field","type":"int","span":{"start":[111,1],"end":[111,72],"bytes":[3187,3258]}},"Endpoint":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Endpoint","kind":"field","type":"string","span":{"start":[101,1],"end":[101,27],"bytes":[2913,2939]}},"ForcePathStyle":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/ForcePathStyle","kind":"field","type":"bool","span":{"start":[102,1],"end":[102,25],"bytes":[2940,2964]}},"MetadataConcurrency":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/MetadataConcurrency","kind":"field","type":"int","span":{"start":[116,1],"end":[116,25],"bytes":[3473,3497]}},"PartSize":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/PartSize","kind":"field","type":"int64","span":{"start":[110,1],"end":[110,69],"bytes":[3118,3186]}},"Path":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[100,1],"end":[100,27],"bytes":[2886,2912]}},"Region":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Region","kind":"field","type":"string","span":{"start":[98,1],"end":[98,27],"bytes":[2832,2858]}},"RequireContentMD5":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/RequireContentMD5","kind":"field","type":"bool","span":{"start":[106,1],"end":[106,25],"bytes":[3040,3064]}},"SSECustomerAlgorithm":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SSECustomerAlgorithm","kind":"field","type":"string","span":{"start":[120,1],"end":[120,56],"bytes":[3631,3686]}},"SSECustomerKey":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SSECustomerKey","kind":"field","type":"string","span":{"start":[121,1],"end":[121,80],"bytes":[3687,3766]}},"SSECustomerKeyMD5":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SSECustomerKeyMD5","kind":"field","type":"string","span":{"start":[122,1],"end":[122,85],"bytes":[3767,3851]}},"SSEKMSKeyID":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SSEKMSKeyID","kind":"field","type":"string","span":{"start":[126,1],"end":[126,49],"bytes":[3957,4005]}},"SecretAccessKey":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SecretAccessKey","kind":"field","type":"string","span":{"start":[95,1],"end":[95,24],"bytes":[2781,2804]}},"SignAcceptEncoding":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SignAcceptEncoding","kind":"field","type":"bool","span":{"start":[105,1],"end":[105,25],"bytes":[3015,3039]}},"SignPayload":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SignPayload","kind":"field","type":"bool","span":{"start":[104,1],"end":[104,25],"bytes":[2990,3014]}},"SkipVerify":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SkipVerify","kind":"field","type":"bool","span":{"start":[103,1],"end":[103,25],"bytes":[2965,2989]}},"StorageClass":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/StorageClass","kind":"field","type":"string","span":{"start":[107,1],"end":[107,27],"bytes":[3065,3091]}},"logger":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[91,1],"end":[91,23],"bytes":[2704,2726]}},"mu":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[88,1],"end":[88,21],"bytes":[2620,2640]}},"s3":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/s3","kind":"field","type":"*github.com/aws/aws-sdk-go-v2/service/s3.Client","span":{"start":[89,1],"end":[89,35],"bytes":[2641,2675]}},"uploader":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/uploader","kind":"field","type":"*github.com/aws/aws-sdk-go-v2/feature/s3/manager.Uploader","span":{"start":[90,1],"end":[90,28],"bytes":[2676,2703]}}}},"contentMD5StackKey":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.contentMD5StackKey","kind":"struct","span":{"start":[81,1],"end":[81,33],"bytes":[2387,2419]},"callables":{}},"fileIterator":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator","kind":"struct","span":{"start":[1518,1],"end":[1536,2],"bytes":[48010,48466]},"callables":{"github.com/benbjohnson/litestream/s3.fileIterator.Close":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Close","kind":"method","span":{"start":[1636,1],"end":[1640,2],"bytes":[51301,51398]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"1638:2":{"kind":"call","span":{"start":[1638,2],"end":[1638,14],"bytes":[51368,51380]},"callee":null}}},"github.com/benbjohnson/litestream/s3.fileIterator.Err":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Err","kind":"method","span":{"start":[1745,1],"end":[1747,2],"bytes":[54089,54145]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.fileIterator.Item":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Item","kind":"method","span":{"start":[1740,1],"end":[1742,2],"bytes":[53964,54030]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.Item","parameters":[],"return_type":"*github.com/superfly/ltx.FileInfo","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.fileIterator.Next":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next","kind":"method","span":{"start":[1643,1],"end":[1737,2],"bytes":[51479,53911]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":17},"body":{"1651:42":{"kind":"call","span":{"start":[1651,42],"end":[1651,64],"bytes":[51701,51723]},"callee":null},"1652:8":{"kind":"call","span":{"start":[1652,8],"end":[1652,36],"bytes":[51733,51761]},"callee":null},"1657:20":{"kind":"call","span":{"start":[1657,20],"end":[1657,51],"bytes":[51823,51854]},"callee":null},"1665:7":{"kind":"call","span":{"start":[1665,7],"end":[1665,29],"bytes":[51981,52003]},"callee":null},"1666:13":{"kind":"call","span":{"start":[1666,13],"end":[1666,54],"bytes":[52022,52063]},"callee":null},"1666:31":{"kind":"call","span":{"start":[1666,31],"end":[1666,53],"bytes":[52040,52062]},"callee":null},"1668:13":{"kind":"call","span":{"start":[1668,13],"end":[1668,59],"bytes":[52120,52166]},"callee":null},"1668:26":{"kind":"call","span":{"start":[1668,26],"end":[1668,58],"bytes":[52133,52165]},"callee":null},"1668:36":{"kind":"call","span":{"start":[1668,36],"end":[1668,57],"bytes":[52143,52164]},"callee":null},"1670:5":{"kind":"call","span":{"start":[1670,5],"end":[1670,80],"bytes":[52177,52252]},"callee":null},"1676:26":{"kind":"call","span":{"start":[1676,26],"end":[1676,48],"bytes":[52514,52536]},"callee":null},"1677:13":{"kind":"call","span":{"start":[1677,13],"end":[1677,54],"bytes":[52555,52596]},"callee":null},"1677:31":{"kind":"call","span":{"start":[1677,31],"end":[1677,53],"bytes":[52573,52595]},"callee":null},"1679:13":{"kind":"call","span":{"start":[1679,13],"end":[1679,48],"bytes":[52653,52688]},"callee":null},"1679:26":{"kind":"call","span":{"start":[1679,26],"end":[1679,47],"bytes":[52666,52687]},"callee":null},"1681:15":{"kind":"call","span":{"start":[1681,15],"end":[1681,43],"bytes":[52709,52737]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch"},"1689:22":{"kind":"call","span":{"start":[1689,22],"end":[1689,44],"bytes":[52854,52876]},"callee":null},"1694:15":{"kind":"call","span":{"start":[1694,15],"end":[1694,36],"bytes":[52989,53010]},"callee":null},"1695:11":{"kind":"call","span":{"start":[1695,11],"end":[1695,29],"bytes":[53021,53039]},"callee":null},"1696:29":{"kind":"call","span":{"start":[1696,29],"end":[1696,51],"bytes":[53068,53090]},"callee":null},"1719:16":{"kind":"call","span":{"start":[1719,16],"end":[1719,37],"bytes":[53466,53487]},"callee":null},"1727:23":{"kind":"call","span":{"start":[1727,23],"end":[1727,51],"bytes":[53754,53782]},"callee":null},"1730:22":{"kind":"call","span":{"start":[1730,22],"end":[1730,50],"bytes":[53828,53856]},"callee":null}}},"github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch","kind":"method","span":{"start":[1563,1],"end":[1633,2],"bytes":[49257,51220]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch","parameters":[{"name":"keys","type":"[]string","span":{"start":[1563,1],"end":[1563,67],"bytes":[49257,49323]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"1564:5":{"kind":"call","span":{"start":[1564,5],"end":[1564,14],"bytes":[49328,49337]},"callee":null},"1575:13":{"kind":"call","span":{"start":[1575,13],"end":[1575,50],"bytes":[49591,49628]},"callee":null},"1575:40":{"kind":"call","span":{"start":[1575,40],"end":[1575,49],"bytes":[49618,49627]},"callee":null},"1579:31":{"kind":"call","span":{"start":[1579,31],"end":[1579,49],"bytes":[49757,49775]},"callee":null},"1579:9":{"kind":"call","span":{"start":[1579,9],"end":[1579,50],"bytes":[49735,49776]},"callee":null},"1580:12":{"kind":"call","span":{"start":[1580,12],"end":[1580,41],"bytes":[49788,49817]},"callee":null},"1585:3":{"kind":"call","span":{"start":[1585,3],"end":[1621,5],"bytes":[49888,51063]},"callee":null},"1624:12":{"kind":"call","span":{"start":[1624,12],"end":[1624,20],"bytes":[51079,51087]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1","kind":"function","span":{"start":[1585,1],"end":[1621,5],"bytes":[49886,51063]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1","parameters":[],"return_type":"error","error_channel":["error"],"body":{"1587:14":{"kind":"call","span":{"start":[1587,14],"end":[1587,33],"bytes":[49987,50006]},"callee":null},"1590:10":{"kind":"call","span":{"start":[1590,10],"end":[1590,24],"bytes":[50071,50085]},"callee":null},"1593:13":{"kind":"call","span":{"start":[1593,13],"end":[1593,42],"bytes":[50136,50165]},"callee":null},"1594:13":{"kind":"call","span":{"start":[1594,13],"end":[1594,28],"bytes":[50179,50194]},"callee":null},"1600:38":{"kind":"call","span":{"start":[1600,38],"end":[1600,81],"bytes":[50451,50494]},"callee":null},"1601:32":{"kind":"call","span":{"start":[1601,32],"end":[1601,69],"bytes":[50526,50563]},"callee":null},"1602:35":{"kind":"call","span":{"start":[1602,35],"end":[1602,75],"bytes":[50598,50638]},"callee":null},"1605:17":{"kind":"call","span":{"start":[1605,17],"end":[1605,57],"bytes":[50661,50701]},"callee":null},"1613:24":{"kind":"call","span":{"start":[1613,24],"end":[1613,56],"bytes":[50918,50950]},"callee":null},"1614:7":{"kind":"call","span":{"start":[1614,7],"end":[1614,16],"bytes":[50971,50980]},"callee":null},"1616:7":{"kind":"call","span":{"start":[1616,7],"end":[1616,18],"bytes":[51015,51026]},"callee":null}}}}}},"fields":{"cancel":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[1520,1],"end":[1520,27],"bytes":[48061,48087]}},"client":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/client","kind":"field","type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","span":{"start":[1521,1],"end":[1521,23],"bytes":[48088,48110]}},"closed":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/closed","kind":"field","type":"bool","span":{"start":[1533,1],"end":[1533,13],"bytes":[48416,48428]}},"ctx":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/ctx","kind":"field","type":"context.Context","span":{"start":[1519,1],"end":[1519,24],"bytes":[48037,48060]}},"err":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/err","kind":"field","type":"error","span":{"start":[1534,1],"end":[1534,14],"bytes":[48429,48442]}},"info":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/info","kind":"field","type":"*github.com/superfly/ltx.FileInfo","span":{"start":[1535,1],"end":[1535,22],"bytes":[48443,48464]}},"level":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/level","kind":"field","type":"int","span":{"start":[1522,1],"end":[1522,12],"bytes":[48111,48122]}},"metadataCache":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/metadataCache","kind":"field","type":"map[string]time.Time","span":{"start":[1527,1],"end":[1527,80],"bytes":[48246,48325]}},"page":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/page","kind":"field","type":"*github.com/aws/aws-sdk-go-v2/service/s3.ListObjectsV2Output","span":{"start":[1530,1],"end":[1530,35],"bytes":[48365,48399]}},"pageIndex":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/pageIndex","kind":"field","type":"int","span":{"start":[1531,1],"end":[1531,15],"bytes":[48400,48414]}},"paginator":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/paginator","kind":"field","type":"*github.com/aws/aws-sdk-go-v2/service/s3.ListObjectsV2Paginator","span":{"start":[1529,1],"end":[1529,38],"bytes":[48327,48364]}},"prefix":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/prefix","kind":"field","type":"string","span":{"start":[1524,1],"end":[1524,15],"bytes":[48140,48154]}},"seek":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/seek","kind":"field","type":"github.com/superfly/ltx.TXID","span":{"start":[1523,1],"end":[1523,17],"bytes":[48123,48139]}},"useMetadata":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/useMetadata","kind":"field","type":"bool","span":{"start":[1526,1],"end":[1526,90],"bytes":[48156,48245]}}}}},"functions":{"github.com/benbjohnson/litestream/s3.NewReplicaClient":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","kind":"function","span":{"start":[130,1],"end":[137,2],"bytes":[4070,4290]},"signature":"github.com/benbjohnson/litestream/s3.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":1},"body":{"132:23":{"kind":"call","span":{"start":[132,23],"end":[132,37],"bytes":[4157,4171]},"callee":null}}},"github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","kind":"function","span":{"start":[145,1],"end":[344,2],"bytes":[4536,10753]},"signature":"github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}},{"name":"host","type":"string","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}},{"name":"urlPath","type":"string","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}},{"name":"query","type":"net/url.Values","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":47},"body":{"146:12":{"kind":"call","span":{"start":[146,12],"end":[146,30],"bytes":[4684,4702]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"167:5":{"kind":"call","span":{"start":[167,5],"end":[167,36],"bytes":[5199,5230]},"callee":null},"169:12":{"kind":"call","span":{"start":[169,12],"end":[169,44],"bytes":[5260,5292]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN"},"171:46":{"kind":"call","span":{"start":[171,46],"end":[171,61],"bytes":[5348,5363]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost"},"175:18":{"kind":"call","span":{"start":[175,18],"end":[175,39],"bytes":[5432,5453]},"callee":null},"177:18":{"kind":"call","span":{"start":[177,18],"end":[177,60],"bytes":[5576,5618]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme"},"180:15":{"kind":"call","span":{"start":[180,15],"end":[180,85],"bytes":[5735,5805]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"184:16":{"kind":"call","span":{"start":[184,16],"end":[184,35],"bytes":[5865,5884]},"callee":null},"187:14":{"kind":"call","span":{"start":[187,14],"end":[187,84],"bytes":[5937,6007]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"190:14":{"kind":"call","span":{"start":[190,14],"end":[190,75],"bytes":[6051,6112]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"193:14":{"kind":"call","span":{"start":[193,14],"end":[193,77],"bytes":[6152,6215]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"197:14":{"kind":"call","span":{"start":[197,14],"end":[197,92],"bytes":[6280,6358]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"201:14":{"kind":"call","span":{"start":[201,14],"end":[201,90],"bytes":[6437,6513]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"205:19":{"kind":"call","span":{"start":[205,19],"end":[205,65],"bytes":[6581,6627]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue"},"208:17":{"kind":"call","span":{"start":[208,17],"end":[208,23],"bytes":[6692,6698]},"callee":null},"211:19":{"kind":"call","span":{"start":[211,19],"end":[211,75],"bytes":[6744,6800]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue"},"216:10":{"kind":"call","span":{"start":[216,10],"end":[216,35],"bytes":[6876,6901]},"callee":null},"218:17":{"kind":"call","span":{"start":[218,17],"end":[218,43],"bytes":[6948,6974]},"callee":null},"224:15":{"kind":"call","span":{"start":[224,15],"end":[224,63],"bytes":[7067,7115]},"callee":null},"228:23":{"kind":"call","span":{"start":[228,23],"end":[228,50],"bytes":[7210,7237]},"callee":null},"228:60":{"kind":"call","span":{"start":[228,60],"end":[228,89],"bytes":[7247,7276]},"callee":null},"231:10":{"kind":"call","span":{"start":[231,10],"end":[231,40],"bytes":[7344,7374]},"callee":null},"233:17":{"kind":"call","span":{"start":[233,17],"end":[233,54],"bytes":[7427,7464]},"callee":null},"236:10":{"kind":"call","span":{"start":[236,10],"end":[236,44],"bytes":[7513,7547]},"callee":null},"238:17":{"kind":"call","span":{"start":[238,17],"end":[238,58],"bytes":[7604,7645]},"callee":null},"243:11":{"kind":"call","span":{"start":[243,11],"end":[243,46],"bytes":[7721,7756]},"callee":null},"244:18":{"kind":"call","span":{"start":[244,18],"end":[244,52],"bytes":[7785,7819]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme"},"252:15":{"kind":"call","span":{"start":[252,15],"end":[252,53],"bytes":[7979,8017]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint"},"253:14":{"kind":"call","span":{"start":[253,14],"end":[253,51],"bytes":[8031,8068]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint"},"254:20":{"kind":"call","span":{"start":[254,20],"end":[254,63],"bytes":[8088,8131]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint"},"255:17":{"kind":"call","span":{"start":[255,17],"end":[255,57],"bytes":[8148,8188]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint"},"256:16":{"kind":"call","span":{"start":[256,16],"end":[256,55],"bytes":[8204,8243]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint"},"257:16":{"kind":"call","span":{"start":[257,16],"end":[257,55],"bytes":[8259,8298]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint"},"258:20":{"kind":"call","span":{"start":[258,20],"end":[258,63],"bytes":[8318,8361]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint"},"259:13":{"kind":"call","span":{"start":[259,13],"end":[259,49],"bytes":[8374,8410]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint"},"260:16":{"kind":"call","span":{"start":[260,16],"end":[260,55],"bytes":[8426,8465]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint"},"320:10":{"kind":"call","span":{"start":[320,10],"end":[320,43],"bytes":[10010,10043]},"callee":null},"322:17":{"kind":"call","span":{"start":[322,17],"end":[322,52],"bytes":[10105,10140]},"callee":null},"325:10":{"kind":"call","span":{"start":[325,10],"end":[325,37],"bytes":[10198,10225]},"callee":null},"327:17":{"kind":"call","span":{"start":[327,17],"end":[327,46],"bytes":[10281,10310]},"callee":null},"330:10":{"kind":"call","span":{"start":[330,10],"end":[330,40],"bytes":[10362,10392]},"callee":null},"332:17":{"kind":"call","span":{"start":[332,17],"end":[332,50],"bytes":[10451,10484]},"callee":null},"337:10":{"kind":"call","span":{"start":[337,10],"end":[337,34],"bytes":[10587,10611]},"callee":null},"339:17":{"kind":"call","span":{"start":[339,17],"end":[339,44],"bytes":[10664,10691]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ParseHost":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","kind":"function","span":{"start":[1786,1],"end":[1830,2],"bytes":[55152,56729]},"signature":"github.com/benbjohnson/litestream/s3.ParseHost","parameters":[{"name":"host","type":"string","span":{"start":[1786,1],"end":[1786,85],"bytes":[55152,55236]}}],"return_type":"(string, string, string, bool)","metrics":{"cyclomatic":9},"body":{"1788:37":{"kind":"call","span":{"start":[1788,37],"end":[1788,67],"bytes":[55324,55354]},"callee":null},"1788:5":{"kind":"call","span":{"start":[1788,5],"end":[1788,32],"bytes":[55292,55319]},"callee":null},"1789:12":{"kind":"call","span":{"start":[1789,12],"end":[1789,40],"bytes":[55368,55396]},"callee":null},"1790:6":{"kind":"call","span":{"start":[1790,6],"end":[1790,16],"bytes":[55402,55412]},"callee":null},"1802:10":{"kind":"call","span":{"start":[1802,10],"end":[1802,45],"bytes":[55744,55779]},"callee":null},"1802:47":{"kind":"call","span":{"start":[1802,47],"end":[1802,53],"bytes":[55781,55787]},"callee":null},"1804:6":{"kind":"call","span":{"start":[1804,6],"end":[1804,12],"bytes":[55815,55821]},"callee":null},"1808:17":{"kind":"call","span":{"start":[1808,17],"end":[1808,59],"bytes":[55914,55956]},"callee":null},"1808:61":{"kind":"call","span":{"start":[1808,61],"end":[1808,67],"bytes":[55958,55964]},"callee":null},"1811:26":{"kind":"call","span":{"start":[1811,26],"end":[1811,82],"bytes":[56028,56084]},"callee":null},"1812:17":{"kind":"call","span":{"start":[1812,17],"end":[1812,56],"bytes":[56108,56147]},"callee":null},"1812:58":{"kind":"call","span":{"start":[1812,58],"end":[1812,64],"bytes":[56149,56155]},"callee":null},"1815:14":{"kind":"call","span":{"start":[1815,14],"end":[1815,66],"bytes":[56207,56259]},"callee":null},"1817:17":{"kind":"call","span":{"start":[1817,17],"end":[1817,55],"bytes":[56316,56354]},"callee":null},"1817:57":{"kind":"call","span":{"start":[1817,57],"end":[1817,63],"bytes":[56356,56362]},"callee":null},"1821:17":{"kind":"call","span":{"start":[1821,17],"end":[1821,55],"bytes":[56469,56507]},"callee":null},"1821:57":{"kind":"call","span":{"start":[1821,57],"end":[1821,63],"bytes":[56509,56515]},"callee":null},"1824:14":{"kind":"call","span":{"start":[1824,14],"end":[1824,52],"bytes":[56567,56605]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ParseURL":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL","kind":"function","span":{"start":[1751,1],"end":[1782,2],"bytes":[54255,55013]},"signature":"github.com/benbjohnson/litestream/s3.ParseURL","parameters":[{"name":"s","type":"string","span":{"start":[1751,1],"end":[1751,76],"bytes":[54255,54330]}},{"name":"endpoint","type":"string","span":{"start":[1751,1],"end":[1751,76],"bytes":[54255,54330]}}],"return_type":"(string, string, string, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"1752:12":{"kind":"call","span":{"start":[1752,12],"end":[1752,24],"bytes":[54342,54354]},"callee":null},"1758:22":{"kind":"call","span":{"start":[1758,22],"end":[1758,58],"bytes":[54445,54481]},"callee":null},"1763:12":{"kind":"call","span":{"start":[1763,12],"end":[1763,67],"bytes":[54566,54621]},"callee":null},"1763:27":{"kind":"call","span":{"start":[1763,27],"end":[1763,58],"bytes":[54581,54612]},"callee":null},"1764:6":{"kind":"call","span":{"start":[1764,6],"end":[1764,16],"bytes":[54627,54637]},"callee":null},"1765:23":{"kind":"call","span":{"start":[1765,23],"end":[1765,56],"bytes":[54667,54700]},"callee":null},"1768:6":{"kind":"call","span":{"start":[1768,6],"end":[1768,16],"bytes":[54730,54740]},"callee":null},"1775:25":{"kind":"call","span":{"start":[1775,25],"end":[1775,42],"bytes":[54881,54898]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost"},"1780:8":{"kind":"call","span":{"start":[1780,8],"end":[1780,39],"bytes":[54947,54978]},"callee":null}}},"github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","kind":"function","span":{"start":[1077,1],"end":[1092,2],"bytes":[36315,36656]},"signature":"github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","parameters":[{"name":"deleteInput","type":"*github.com/aws/aws-sdk-go-v2/service/s3/types.Delete","span":{"start":[1077,1],"end":[1077,81],"bytes":[36315,36395]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1082:18":{"kind":"call","span":{"start":[1082,18],"end":[1082,51],"bytes":[36459,36492]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects"},"1086:5":{"kind":"call","span":{"start":[1086,5],"end":[1086,17],"bytes":[36534,36546]},"callee":null},"1090:9":{"kind":"call","span":{"start":[1090,9],"end":[1090,25],"bytes":[36583,36599]},"callee":null},"1091:9":{"kind":"call","span":{"start":[1091,9],"end":[1091,50],"bytes":[36608,36649]},"callee":null}}},"github.com/benbjohnson/litestream/s3.deleteOutputError":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","kind":"function","span":{"start":[1848,1],"end":[1860,2],"bytes":[57303,57645]},"signature":"github.com/benbjohnson/litestream/s3.deleteOutputError","parameters":[{"name":"out","type":"*github.com/aws/aws-sdk-go-v2/service/s3.DeleteObjectsOutput","span":{"start":[1848,1],"end":[1848,60],"bytes":[57303,57362]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1849:5":{"kind":"call","span":{"start":[1849,5],"end":[1849,20],"bytes":[57367,57382]},"callee":null},"1855:2":{"kind":"call","span":{"start":[1855,2],"end":[1855,42],"bytes":[57455,57495]},"callee":null},"1857:3":{"kind":"call","span":{"start":[1857,3],"end":[1857,80],"bytes":[57532,57609]},"callee":null},"1857:31":{"kind":"call","span":{"start":[1857,31],"end":[1857,52],"bytes":[57560,57581]},"callee":null},"1857:54":{"kind":"call","span":{"start":[1857,54],"end":[1857,79],"bytes":[57583,57608]},"callee":null},"1859:20":{"kind":"call","span":{"start":[1859,20],"end":[1859,30],"bytes":[57632,57642]},"callee":null},"1859:9":{"kind":"call","span":{"start":[1859,9],"end":[1859,31],"bytes":[57621,57643]},"callee":null}}},"github.com/benbjohnson/litestream/s3.encodeDeleteDocument":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument","kind":"function","span":{"start":[1117,1],"end":[1140,2],"bytes":[37177,37694]},"signature":"github.com/benbjohnson/litestream/s3.encodeDeleteDocument","parameters":[{"name":"v","type":"*github.com/aws/aws-sdk-go-v2/service/s3/types.Delete","span":{"start":[1117,1],"end":[1117,74],"bytes":[37177,37250]}},{"name":"value","type":"github.com/aws/smithy-go/encoding/xml.Value","span":{"start":[1117,1],"end":[1117,74],"bytes":[37177,37250]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1118:8":{"kind":"call","span":{"start":[1118,8],"end":[1118,21],"bytes":[37258,37271]},"callee":null},"1125:9":{"kind":"call","span":{"start":[1125,9],"end":[1125,37],"bytes":[37393,37421]},"callee":null},"1126:13":{"kind":"call","span":{"start":[1126,13],"end":[1126,54],"bytes":[37434,37475]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList"},"1136:9":{"kind":"call","span":{"start":[1136,9],"end":[1136,34],"bytes":[37629,37654]},"callee":null},"1137:3":{"kind":"call","span":{"start":[1137,3],"end":[1137,23],"bytes":[37657,37677]},"callee":null}}},"github.com/benbjohnson/litestream/s3.encodeObjectIdentifier":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier","kind":"function","span":{"start":[1160,1],"end":[1203,2],"bytes":[38235,39183]},"signature":"github.com/benbjohnson/litestream/s3.encodeObjectIdentifier","parameters":[{"name":"v","type":"*github.com/aws/aws-sdk-go-v2/service/s3/types.ObjectIdentifier","span":{"start":[1160,1],"end":[1160,86],"bytes":[38235,38320]}},{"name":"value","type":"github.com/aws/smithy-go/encoding/xml.Value","span":{"start":[1160,1],"end":[1160,86],"bytes":[38235,38320]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1161:8":{"kind":"call","span":{"start":[1161,8],"end":[1161,21],"bytes":[38328,38341]},"callee":null},"1163:9":{"kind":"call","span":{"start":[1163,9],"end":[1167,5],"bytes":[38370,38468]},"callee":null},"1168:3":{"kind":"call","span":{"start":[1168,3],"end":[1168,21],"bytes":[38471,38489]},"callee":null},"1171:9":{"kind":"call","span":{"start":[1171,9],"end":[1175,5],"bytes":[38520,38617]},"callee":null},"1176:3":{"kind":"call","span":{"start":[1176,3],"end":[1176,20],"bytes":[38620,38637]},"callee":null},"1179:9":{"kind":"call","span":{"start":[1179,9],"end":[1183,5],"bytes":[38681,38791]},"callee":null},"1184:13":{"kind":"call","span":{"start":[1184,13],"end":[1184,59],"bytes":[38804,38850]},"callee":null},"1184:3":{"kind":"call","span":{"start":[1184,3],"end":[1184,60],"bytes":[38794,38851]},"callee":null},"1187:9":{"kind":"call","span":{"start":[1187,9],"end":[1191,5],"bytes":[38883,38981]},"callee":null},"1192:3":{"kind":"call","span":{"start":[1192,3],"end":[1192,19],"bytes":[38984,39000]},"callee":null},"1195:9":{"kind":"call","span":{"start":[1195,9],"end":[1199,5],"bytes":[39037,39140]},"callee":null},"1200:3":{"kind":"call","span":{"start":[1200,3],"end":[1200,26],"bytes":[39143,39166]},"callee":null}}},"github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList","kind":"function","span":{"start":[1142,1],"end":[1155,2],"bytes":[37696,38009]},"signature":"github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList","parameters":[{"name":"v","type":"[]github.com/aws/aws-sdk-go-v2/service/s3/types.ObjectIdentifier","span":{"start":[1142,1],"end":[1142,91],"bytes":[37696,37786]}},{"name":"value","type":"github.com/aws/smithy-go/encoding/xml.Value","span":{"start":[1142,1],"end":[1142,91],"bytes":[37696,37786]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1143:6":{"kind":"call","span":{"start":[1143,6],"end":[1143,25],"bytes":[37792,37811]},"callee":null},"1144:9":{"kind":"call","span":{"start":[1144,9],"end":[1144,22],"bytes":[37822,37835]},"callee":null},"1147:11":{"kind":"call","span":{"start":[1147,11],"end":[1147,24],"bytes":[37850,37863]},"callee":null},"1149:13":{"kind":"call","span":{"start":[1149,13],"end":[1149,27],"bytes":[37896,37910]},"callee":null},"1150:13":{"kind":"call","span":{"start":[1150,13],"end":[1150,50],"bytes":[37923,37960]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier"}}},"github.com/benbjohnson/litestream/s3.init":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.init","kind":"function","span":{"start":[47,1],"end":[49,2],"bytes":[1012,1099]},"signature":"github.com/benbjohnson/litestream/s3.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"48:2":{"kind":"call","span":{"start":[48,2],"end":[48,72],"bytes":[1027,1097]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/s3.isNotExists":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","kind":"function","span":{"start":[1840,1],"end":[1846,2],"bytes":[57147,57301]},"signature":"github.com/benbjohnson/litestream/s3.isNotExists","parameters":[{"name":"err","type":"error","span":{"start":[1840,1],"end":[1840,35],"bytes":[57147,57181]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"1842:5":{"kind":"call","span":{"start":[1842,5],"end":[1842,28],"bytes":[57214,57237]},"callee":null},"1843:10":{"kind":"call","span":{"start":[1843,10],"end":[1843,28],"bytes":[57249,57267]},"callee":null}}},"github.com/benbjohnson/litestream/s3.marshalDeleteObjects":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects","kind":"function","span":{"start":[1094,1],"end":[1115,2],"bytes":[36658,37175]},"signature":"github.com/benbjohnson/litestream/s3.marshalDeleteObjects","parameters":[{"name":"deleteInput","type":"*github.com/aws/aws-sdk-go-v2/service/s3/types.Delete","span":{"start":[1094,1],"end":[1094,71],"bytes":[36658,36728]}}],"return_type":"([]byte, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1100:13":{"kind":"call","span":{"start":[1100,13],"end":[1100,39],"bytes":[36810,36836]},"callee":null},"1106:4":{"kind":"call","span":{"start":[1106,4],"end":[1106,82],"bytes":[36948,37026]},"callee":null},"1110:12":{"kind":"call","span":{"start":[1110,12],"end":[1110,72],"bytes":[37048,37108]},"callee":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument"},"1110:46":{"kind":"call","span":{"start":[1110,46],"end":[1110,71],"bytes":[37082,37107]},"callee":null},"1114:9":{"kind":"call","span":{"start":[1114,9],"end":[1114,24],"bytes":[37153,37168]},"callee":null}}},"github.com/benbjohnson/litestream/s3.newFileIterator":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator","kind":"function","span":{"start":[1538,1],"end":[1560,2],"bytes":[48468,49164]},"signature":"github.com/benbjohnson/litestream/s3.newFileIterator","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}},{"name":"client","type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}},{"name":"level","type":"int","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}},{"name":"useMetadata","type":"bool","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}}],"return_type":"*github.com/benbjohnson/litestream/s3.fileIterator","metrics":{"cyclomatic":1},"body":{"1539:17":{"kind":"call","span":{"start":[1539,17],"end":[1539,40],"bytes":[48609,48632]},"callee":null},"1541:32":{"kind":"call","span":{"start":[1541,32],"end":[1541,59],"bytes":[48665,48692]},"callee":null},"1550:18":{"kind":"call","span":{"start":[1550,18],"end":[1550,44],"bytes":[48907,48933]},"callee":null},"1554:18":{"kind":"call","span":{"start":[1554,18],"end":[1557,4],"bytes":[49015,49149]},"callee":null},"1555:11":{"kind":"call","span":{"start":[1555,11],"end":[1555,36],"bytes":[49089,49114]},"callee":null},"1556:11":{"kind":"call","span":{"start":[1556,11],"end":[1556,29],"bytes":[49126,49144]},"callee":null}}},"github.com/benbjohnson/litestream/s3.newTransportRetryer":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newTransportRetryer","kind":"function","span":{"start":[594,1],"end":[612,2],"bytes":[19486,20228]},"signature":"github.com/benbjohnson/litestream/s3.newTransportRetryer","parameters":[],"return_type":"github.com/aws/aws-sdk-go-v2/aws.Retryer","metrics":{"cyclomatic":1},"body":{"595:9":{"kind":"call","span":{"start":[595,9],"end":[611,4],"bytes":[19535,20226]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newTransportRetryer/github.com/benbjohnson/litestream/s3.newTransportRetryer.closure_1","kind":"function","span":{"start":[595,1],"end":[611,4],"bytes":[19527,20226]},"signature":"github.com/benbjohnson/litestream/s3.newTransportRetryer.closure_1","parameters":[{"name":"o","type":"*github.com/aws/aws-sdk-go-v2/aws/retry.StandardOptions","span":{"start":[595,1],"end":[595,59],"bytes":[19527,19585]}}],"body":{"603:18":{"kind":"call","span":{"start":[603,18],"end":[610,4],"bytes":[20008,20222]},"callee":null}}}}},"github.com/benbjohnson/litestream/s3.parseS3DebugEnv":{"id":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","kind":"function","span":{"start":[1864,1],"end":[1893,2],"bytes":[57807,58710]},"signature":"github.com/benbjohnson/litestream/s3.parseS3DebugEnv","parameters":[],"return_type":"github.com/aws/aws-sdk-go-v2/aws.ClientLogMode","metrics":{"cyclomatic":12},"body":{"1865:7":{"kind":"call","span":{"start":[1865,7],"end":[1865,39],"bytes":[57856,57888]},"callee":null},"1871:23":{"kind":"call","span":{"start":[1871,23],"end":[1871,44],"bytes":[57971,57992]},"callee":null},"1872:10":{"kind":"call","span":{"start":[1872,10],"end":[1872,50],"bytes":[58004,58044]},"callee":null},"1872:26":{"kind":"call","span":{"start":[1872,26],"end":[1872,49],"bytes":[58020,58043]},"callee":null},"1889:4":{"kind":"call","span":{"start":[1889,4],"end":[1889,156],"bytes":[58533,58685]},"callee":null}}}},"content_hash":"067ee2bdceaeb371ea22bf7d32034bcfa8e86ff8c0292bcb38d3d784db69cc78"},"server.go":{"id":"can://go/litestream/server.go","kind":"module","span":{"start":[1,1],"end":[681,1],"bytes":[0,17841]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/pprof\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n)\n\n// SocketConfig configures the Unix socket for control commands.\ntype SocketConfig struct {\n\tEnabled bool `yaml:\"enabled\"`\n\tPath string `yaml:\"path\"`\n\tPermissions uint32 `yaml:\"permissions\"`\n}\n\n// DefaultSocketConfig returns the default socket configuration.\nfunc DefaultSocketConfig() SocketConfig {\n\treturn SocketConfig{\n\t\tEnabled: false,\n\t\tPath: \"/var/run/litestream.sock\",\n\t\tPermissions: 0600,\n\t}\n}\n\n// Server manages runtime control via Unix socket using HTTP.\ntype Server struct {\n\tstore *Store\n\n\t// SocketPath is the path to the Unix socket.\n\tSocketPath string\n\n\t// SocketPerms is the file permissions for the socket.\n\tSocketPerms uint32\n\n\t// PathExpander optionally expands paths (e.g., ~ expansion).\n\t// If nil, paths are used as-is.\n\tPathExpander func(string) (string, error)\n\n\t// Version is the version string to report in /info.\n\tVersion string\n\n\t// startedAt is set when the server starts.\n\tstartedAt time.Time\n\n\tsocketListener net.Listener\n\thttpServer *http.Server\n\n\tctx context.Context\n\tcancel context.CancelFunc\n\twg sync.WaitGroup\n\n\tlogger *slog.Logger\n}\n\n// NewServer creates a new Server instance.\nfunc NewServer(store *Store) *Server {\n\tctx, cancel := context.WithCancel(context.Background())\n\ts := \u0026Server{\n\t\tstore: store,\n\t\tSocketPerms: 0600,\n\t\tctx: ctx,\n\t\tcancel: cancel,\n\t\tlogger: slog.Default().With(LogKeySystem, LogSystemServer),\n\t}\n\n\tmux := http.NewServeMux()\n\tmux.HandleFunc(\"POST /start\", s.handleStart)\n\tmux.HandleFunc(\"POST /stop\", s.handleStop)\n\tmux.HandleFunc(\"GET /txid\", s.handleTXID)\n\tmux.HandleFunc(\"POST /register\", s.handleRegister)\n\tmux.HandleFunc(\"POST /unregister\", s.handleUnregister)\n\tmux.HandleFunc(\"POST /sync\", s.handleSync)\n\tmux.HandleFunc(\"GET /list\", s.handleList)\n\tmux.HandleFunc(\"GET /info\", s.handleInfo)\n\tmux.HandleFunc(\"GET /debug/sync-status\", s.handleSyncStatus)\n\n\t// pprof endpoints\n\tmux.HandleFunc(\"GET /debug/pprof/\", pprof.Index)\n\tmux.HandleFunc(\"GET /debug/pprof/cmdline\", pprof.Cmdline)\n\tmux.HandleFunc(\"GET /debug/pprof/profile\", pprof.Profile)\n\tmux.HandleFunc(\"GET /debug/pprof/symbol\", pprof.Symbol)\n\tmux.HandleFunc(\"GET /debug/pprof/trace\", pprof.Trace)\n\n\ts.httpServer = \u0026http.Server{Handler: mux}\n\n\treturn s\n}\n\n// Start begins listening for control connections.\nfunc (s *Server) Start() error {\n\tif s.SocketPath == \"\" {\n\t\treturn fmt.Errorf(\"socket path required\")\n\t}\n\n\t// Check if socket file exists and is actually a socket before removing\n\tif info, err := os.Lstat(s.SocketPath); err == nil {\n\t\tif info.Mode()\u0026os.ModeSocket != 0 {\n\t\t\tif err := os.Remove(s.SocketPath); err != nil {\n\t\t\t\treturn fmt.Errorf(\"remove existing socket: %w\", err)\n\t\t\t}\n\t\t} else {\n\t\t\treturn fmt.Errorf(\"socket path exists but is not a socket: %s\", s.SocketPath)\n\t\t}\n\t} else if !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"check socket path: %w\", err)\n\t}\n\n\tlistener, err := net.Listen(\"unix\", s.SocketPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"listen on unix socket: %w\", err)\n\t}\n\ts.socketListener = listener\n\n\tif err := os.Chmod(s.SocketPath, os.FileMode(s.SocketPerms)); err != nil {\n\t\tlistener.Close()\n\t\treturn fmt.Errorf(\"chmod socket: %w\", err)\n\t}\n\n\t// Set startedAt after successful socket setup to ensure uptime reflects\n\t// the actual time the server became available.\n\ts.startedAt = time.Now()\n\n\ts.logger.Info(\"control socket listening\", \"path\", s.SocketPath)\n\n\ts.wg.Add(1)\n\tgo func() {\n\t\tdefer s.wg.Done()\n\t\tif err := s.httpServer.Serve(listener); err != nil \u0026\u0026 err != http.ErrServerClosed {\n\t\t\ts.logger.Error(\"http server error\", \"error\", err)\n\t\t}\n\t}()\n\n\treturn nil\n}\n\n// Close gracefully shuts down the control server.\nfunc (s *Server) Close() error {\n\ts.cancel()\n\n\tctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\n\tdefer cancel()\n\n\tif s.httpServer != nil {\n\t\tif err := s.httpServer.Shutdown(ctx); err != nil {\n\t\t\ts.logger.Error(\"http server shutdown error\", \"error\", err)\n\t\t}\n\t}\n\ts.wg.Wait()\n\treturn nil\n}\n\n// expandPath expands the path using PathExpander if set.\nfunc (s *Server) expandPath(path string) (string, error) {\n\tif s.PathExpander != nil {\n\t\treturn s.PathExpander(path)\n\t}\n\treturn path, nil\n}\n\nfunc (s *Server) handleStart(w http.ResponseWriter, r *http.Request) {\n\tvar req StartRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\tctx := s.ctx\n\tif req.Timeout \u003e 0 {\n\t\tvar cancel context.CancelFunc\n\t\tctx, cancel = context.WithTimeout(s.ctx, time.Duration(req.Timeout)*time.Second)\n\t\tdefer cancel()\n\t}\n\n\tdb := s.store.FindDB(expandedPath)\n\tif db == nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"database not found: %s\", expandedPath), nil)\n\t\treturn\n\t}\n\n\tstatus := \"started\"\n\tif db.IsOpen() {\n\t\tstatus = \"already_running\"\n\t} else {\n\t\tif err := s.store.EnableDB(ctx, expandedPath); err != nil {\n\t\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\t\treturn\n\t\t}\n\t}\n\ttxID, err := s.storeTXID(expandedPath)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\treturn\n\t}\n\n\twriteJSON(w, http.StatusOK, StartResponse{\n\t\tStatus: status,\n\t\tPath: expandedPath,\n\t\tTXID: txID,\n\t})\n}\n\nfunc (s *Server) handleStop(w http.ResponseWriter, r *http.Request) {\n\tvar req StopRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\ttimeout := req.Timeout\n\tif timeout == 0 {\n\t\ttimeout = 30\n\t}\n\tctx, cancel := context.WithTimeout(s.ctx, time.Duration(timeout)*time.Second)\n\tdefer cancel()\n\n\tdb := s.store.FindDB(expandedPath)\n\tif db == nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"database not found: %s\", expandedPath), nil)\n\t\treturn\n\t}\n\n\tstatus := \"stopped\"\n\tif !db.IsOpen() {\n\t\tstatus = \"already_stopped\"\n\t} else {\n\t\tif err := s.store.DisableDB(ctx, expandedPath); err != nil {\n\t\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\t\treturn\n\t\t}\n\t}\n\ttxID, err := s.storeTXID(expandedPath)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\treturn\n\t}\n\n\twriteJSON(w, http.StatusOK, StopResponse{\n\t\tStatus: status,\n\t\tPath: expandedPath,\n\t\tTXID: txID,\n\t})\n}\n\nfunc (s *Server) storeTXID(path string) (uint64, error) {\n\tdb := s.store.FindDB(path)\n\tif db == nil {\n\t\treturn 0, fmt.Errorf(\"database not found: %s\", path)\n\t}\n\n\t_, maxTXID, err := db.MaxLTX()\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"read txid: %w\", err)\n\t}\n\treturn uint64(maxTXID), nil\n}\n\nfunc (s *Server) handleTXID(w http.ResponseWriter, r *http.Request) {\n\tpath := r.URL.Query().Get(\"path\")\n\tif path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\tdb := s.store.FindDB(expandedPath)\n\tif db == nil {\n\t\twriteJSONError(w, http.StatusNotFound, \"database not found\", nil)\n\t\treturn\n\t}\n\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\treturn\n\t}\n\n\twriteJSON(w, http.StatusOK, TXIDResponse{\n\t\tTXID: uint64(pos.TXID),\n\t})\n}\n\nfunc (s *Server) handleSyncStatus(w http.ResponseWriter, r *http.Request) {\n\tpath := r.URL.Query().Get(\"path\")\n\tif path != \"\" {\n\t\texpandedPath, err := s.expandPath(path)\n\t\tif err != nil {\n\t\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\t\treturn\n\t\t}\n\n\t\tdb := s.store.FindDB(expandedPath)\n\t\tif db == nil {\n\t\t\twriteJSONError(w, http.StatusNotFound, \"database not found\", nil)\n\t\t\treturn\n\t\t}\n\n\t\twriteJSON(w, http.StatusOK, SyncDiagnosticsResponse{\n\t\t\tDatabases: []SyncDiagnostic{db.SyncDiagnostic()},\n\t\t})\n\t\treturn\n\t}\n\n\tdbs := s.store.DBs()\n\tdiagnostics := make([]SyncDiagnostic, 0, len(dbs))\n\tfor _, db := range dbs {\n\t\tdiagnostics = append(diagnostics, db.SyncDiagnostic())\n\t}\n\twriteJSON(w, http.StatusOK, SyncDiagnosticsResponse{Databases: diagnostics})\n}\n\nfunc writeJSON(w http.ResponseWriter, status int, v interface{}) {\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(status)\n\tjson.NewEncoder(w).Encode(v)\n}\n\nfunc writeJSONError(w http.ResponseWriter, status int, message string, details interface{}) {\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(status)\n\tjson.NewEncoder(w).Encode(ErrorResponse{\n\t\tError: message,\n\t\tDetails: details,\n\t})\n}\n\n// StartRequest is the request body for the /start endpoint.\ntype StartRequest struct {\n\tPath string `json:\"path\"`\n\tTimeout int `json:\"timeout,omitempty\"`\n}\n\n// StartResponse is the response body for the /start endpoint.\ntype StartResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n\tTXID uint64 `json:\"txid\"`\n}\n\n// StopRequest is the request body for the /stop endpoint.\ntype StopRequest struct {\n\tPath string `json:\"path\"`\n\tTimeout int `json:\"timeout,omitempty\"`\n}\n\n// StopResponse is the response body for the /stop endpoint.\ntype StopResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n\tTXID uint64 `json:\"txid\"`\n}\n\n// ErrorResponse is returned when an error occurs.\ntype ErrorResponse struct {\n\tError string `json:\"error\"`\n\tDetails interface{} `json:\"details,omitempty\"`\n}\n\n// TXIDResponse is the response body for the /txid endpoint.\ntype TXIDResponse struct {\n\tTXID uint64 `json:\"txid\"`\n}\n\n// SyncDiagnosticsResponse is the response body for /debug/sync-status.\ntype SyncDiagnosticsResponse struct {\n\tDatabases []SyncDiagnostic `json:\"databases\"`\n}\n\nfunc (s *Server) handleSync(w http.ResponseWriter, r *http.Request) {\n\tvar req SyncRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\tctx := s.ctx\n\tif req.Wait \u0026\u0026 req.Timeout == 0 {\n\t\treq.Timeout = 30\n\t}\n\tif req.Timeout \u003e 0 {\n\t\tvar cancel context.CancelFunc\n\t\tctx, cancel = context.WithTimeout(s.ctx, time.Duration(req.Timeout)*time.Second)\n\t\tdefer cancel()\n\t}\n\n\tresult, err := s.store.SyncDB(ctx, expandedPath, req.Wait)\n\tif err != nil {\n\t\tswitch {\n\t\tcase errors.Is(err, ErrDatabaseNotFound):\n\t\t\twriteJSONError(w, http.StatusNotFound, err.Error(), nil)\n\t\tcase errors.Is(err, ErrDatabaseNotOpen):\n\t\t\twriteJSONError(w, http.StatusConflict, err.Error(), nil)\n\t\tdefault:\n\t\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\t}\n\t\treturn\n\t}\n\n\tvar status string\n\tif !result.Changed {\n\t\tstatus = \"no_change\"\n\t} else if req.Wait {\n\t\tstatus = \"synced\"\n\t} else {\n\t\tstatus = \"synced_local\"\n\t}\n\n\twriteJSON(w, http.StatusOK, SyncResponse{\n\t\tStatus: status,\n\t\tPath: expandedPath,\n\t\tTXID: result.TXID,\n\t\tReplicatedTXID: result.ReplicatedTXID,\n\t})\n}\n\n// SyncRequest is the request body for the /sync endpoint.\ntype SyncRequest struct {\n\tPath string `json:\"path\"`\n\tWait bool `json:\"wait,omitempty\"`\n\tTimeout int `json:\"timeout,omitempty\"`\n}\n\n// SyncResponse is the response body for the /sync endpoint.\ntype SyncResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n\tTXID uint64 `json:\"txid\"`\n\tReplicatedTXID uint64 `json:\"replicated_txid\"`\n}\n\nfunc (s *Server) handleList(w http.ResponseWriter, _ *http.Request) {\n\tdbs := s.store.DBs()\n\tresp := ListResponse{\n\t\tDatabases: make([]DatabaseSummary, 0, len(dbs)),\n\t}\n\n\tfor _, db := range dbs {\n\t\tvar status string\n\t\tif db.IsOpen() {\n\t\t\tif db.Replica != nil \u0026\u0026 db.Replica.MonitorEnabled {\n\t\t\t\tstatus = \"replicating\"\n\t\t\t} else {\n\t\t\t\tstatus = \"open\"\n\t\t\t}\n\t\t} else {\n\t\t\tstatus = \"stopped\"\n\t\t}\n\n\t\tsummary := DatabaseSummary{\n\t\t\tPath: db.Path(),\n\t\t\tStatus: status,\n\t\t}\n\n\t\tif t := db.LastSuccessfulSyncAt(); !t.IsZero() {\n\t\t\tsummary.LastSyncAt = \u0026t\n\t\t}\n\n\t\tresp.Databases = append(resp.Databases, summary)\n\t}\n\n\twriteJSON(w, http.StatusOK, resp)\n}\n\nfunc (s *Server) handleInfo(w http.ResponseWriter, _ *http.Request) {\n\tresp := InfoResponse{\n\t\tVersion: s.Version,\n\t\tPID: os.Getpid(),\n\t\tStartedAt: s.startedAt,\n\t\tUptimeSeconds: int64(time.Since(s.startedAt).Seconds()),\n\t\tDatabaseCount: len(s.store.DBs()),\n\t}\n\n\twriteJSON(w, http.StatusOK, resp)\n}\n\n// ListResponse is the response body for the /list endpoint.\ntype ListResponse struct {\n\tDatabases []DatabaseSummary `json:\"databases\"`\n}\n\n// DatabaseSummary contains summary information about a database.\ntype DatabaseSummary struct {\n\tPath string `json:\"path\"`\n\tStatus string `json:\"status\"`\n\n\t// LastSyncAt is the timestamp of the last successful replica sync.\n\t// This reflects when data was last successfully uploaded to the replica\n\t// storage backend, not just when the local WAL was processed.\n\tLastSyncAt *time.Time `json:\"last_sync_at,omitempty\"`\n}\n\n// InfoResponse is the response body for the /info endpoint.\ntype InfoResponse struct {\n\tVersion string `json:\"version\"`\n\tPID int `json:\"pid\"`\n\tUptimeSeconds int64 `json:\"uptime_seconds\"`\n\tStartedAt time.Time `json:\"started_at\"`\n\tDatabaseCount int `json:\"database_count\"`\n}\n\n// RegisterDatabaseRequest is the request body for the /register endpoint.\ntype RegisterDatabaseRequest struct {\n\tPath string `json:\"path\"`\n\tReplicaURL string `json:\"replica_url\"`\n}\n\n// RegisterDatabaseResponse is the response body for the /register endpoint.\ntype RegisterDatabaseResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n}\n\n// UnregisterDatabaseRequest is the request body for the /unregister endpoint.\ntype UnregisterDatabaseRequest struct {\n\tPath string `json:\"path\"`\n\tTimeout int `json:\"timeout,omitempty\"`\n}\n\n// UnregisterDatabaseResponse is the response body for the /unregister endpoint.\ntype UnregisterDatabaseResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n\tTXID uint64 `json:\"txid\"`\n}\n\nfunc (s *Server) handleRegister(w http.ResponseWriter, r *http.Request) {\n\tvar req RegisterDatabaseRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\tif req.ReplicaURL == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"replica_url required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\t// Check if database already exists.\n\tif existing := s.store.FindDB(expandedPath); existing != nil {\n\t\twriteJSON(w, http.StatusOK, RegisterDatabaseResponse{\n\t\t\tStatus: \"already_registered\",\n\t\t\tPath: expandedPath,\n\t\t})\n\t\treturn\n\t}\n\n\t// Create replica client from URL.\n\tclient, err := NewReplicaClientFromURL(req.ReplicaURL)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid replica url: %v\", err), nil)\n\t\treturn\n\t}\n\n\t// Create new database.\n\tdb := NewDB(expandedPath)\n\n\t// Create replica and attach client.\n\treplica := NewReplica(db)\n\treplica.Client = client\n\tdb.Replica = replica\n\n\t// Register database with store (this also opens the database).\n\tif err := s.store.RegisterDB(db); err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"failed to register database: %v\", err), nil)\n\t\treturn\n\t}\n\n\twriteJSON(w, http.StatusOK, RegisterDatabaseResponse{\n\t\tStatus: \"registered\",\n\t\tPath: expandedPath,\n\t})\n}\n\nfunc (s *Server) handleUnregister(w http.ResponseWriter, r *http.Request) {\n\tvar req UnregisterDatabaseRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\t// Set up timeout context. Treat non-positive values as default.\n\ttimeout := req.Timeout\n\tif timeout \u003c= 0 {\n\t\ttimeout = 30\n\t}\n\tctx, cancel := context.WithTimeout(s.ctx, time.Duration(timeout)*time.Second)\n\tdefer cancel()\n\n\tdb := s.store.FindDB(expandedPath)\n\n\t// Remove database from store (this also closes it).\n\tif err := s.store.UnregisterDB(ctx, expandedPath); err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"failed to unregister database: %v\", err), nil)\n\t\treturn\n\t}\n\tvar txID uint64\n\tstatus := \"already_unregistered\"\n\tif db != nil {\n\t\t_, maxTXID, err := db.MaxLTX()\n\t\tif err != nil {\n\t\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"failed to read final txid: %v\", err), nil)\n\t\t\treturn\n\t\t}\n\t\ttxID = uint64(maxTXID)\n\t\tstatus = \"unregistered\"\n\t}\n\n\twriteJSON(w, http.StatusOK, UnregisterDatabaseResponse{\n\t\tStatus: status,\n\t\tPath: expandedPath,\n\t\tTXID: txID,\n\t})\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[40,56]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[57,66]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[67,73]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[74,85]}},{"name":"net","path":"net","span":{"start":[9,1],"end":[9,7],"bytes":[86,92]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[93,104]}},{"name":"pprof","path":"net/http/pprof","span":{"start":[11,1],"end":[11,18],"bytes":[105,122]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[123,128]}},{"name":"sync","path":"sync","span":{"start":[13,1],"end":[13,8],"bytes":[129,136]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[137,144]}}],"types":{"DatabaseSummary":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.DatabaseSummary","kind":"struct","span":{"start":[527,1],"end":[535,2],"bytes":[13353,13707]},"callables":{},"fields":{"LastSyncAt":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.DatabaseSummary/LastSyncAt","kind":"field","type":"*time.Time","span":{"start":[534,1],"end":[534,55],"bytes":[13651,13705]}},"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.DatabaseSummary/Path","kind":"field","type":"string","span":{"start":[528,1],"end":[528,29],"bytes":[13383,13411]}},"Status":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.DatabaseSummary/Status","kind":"field","type":"string","span":{"start":[529,1],"end":[529,31],"bytes":[13412,13442]}}}},"ErrorResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.ErrorResponse","kind":"struct","span":{"start":[388,1],"end":[391,2],"bytes":[9884,9997]},"callables":{},"fields":{"Details":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.ErrorResponse/Details","kind":"field","type":"interface{}","span":{"start":[390,1],"end":[390,48],"bytes":[9948,9995]}},"Error":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.ErrorResponse/Error","kind":"field","type":"string","span":{"start":[389,1],"end":[389,36],"bytes":[9912,9947]}}}},"InfoResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.InfoResponse","kind":"struct","span":{"start":[538,1],"end":[544,2],"bytes":[13770,14021]},"callables":{},"fields":{"DatabaseCount":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.InfoResponse/DatabaseCount","kind":"field","type":"int","span":{"start":[543,1],"end":[543,49],"bytes":[13971,14019]}},"PID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.InfoResponse/PID","kind":"field","type":"int","span":{"start":[540,1],"end":[540,38],"bytes":[13839,13876]}},"StartedAt":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.InfoResponse/StartedAt","kind":"field","type":"time.Time","span":{"start":[542,1],"end":[542,45],"bytes":[13926,13970]}},"UptimeSeconds":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.InfoResponse/UptimeSeconds","kind":"field","type":"int64","span":{"start":[541,1],"end":[541,49],"bytes":[13877,13925]}},"Version":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.InfoResponse/Version","kind":"field","type":"string","span":{"start":[539,1],"end":[539,42],"bytes":[13797,13838]}}}},"ListResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.ListResponse","kind":"struct","span":{"start":[522,1],"end":[524,2],"bytes":[13209,13285]},"callables":{},"fields":{"Databases":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.ListResponse/Databases","kind":"field","type":"[]github.com/benbjohnson/litestream.DatabaseSummary","span":{"start":[523,1],"end":[523,48],"bytes":[13236,13283]}}}},"RegisterDatabaseRequest":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.RegisterDatabaseRequest","kind":"struct","span":{"start":[547,1],"end":[550,2],"bytes":[14098,14210]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.RegisterDatabaseRequest/Path","kind":"field","type":"string","span":{"start":[548,1],"end":[548,33],"bytes":[14136,14168]}},"ReplicaURL":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.RegisterDatabaseRequest/ReplicaURL","kind":"field","type":"string","span":{"start":[549,1],"end":[549,40],"bytes":[14169,14208]}}}},"RegisterDatabaseResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.RegisterDatabaseResponse","kind":"struct","span":{"start":[553,1],"end":[556,2],"bytes":[14289,14389]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.RegisterDatabaseResponse/Path","kind":"field","type":"string","span":{"start":[555,1],"end":[555,29],"bytes":[14359,14387]}},"Status":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.RegisterDatabaseResponse/Status","kind":"field","type":"string","span":{"start":[554,1],"end":[554,31],"bytes":[14328,14358]}}}},"Server":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server","kind":"struct","span":{"start":[34,1],"end":[61,2],"bytes":[638,1253]},"callables":{"github.com/benbjohnson/litestream.Server.Close":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","kind":"method","span":{"start":[145,1],"end":[158,2],"bytes":[3780,4090]},"signature":"github.com/benbjohnson/litestream.Server.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"146:2":{"kind":"call","span":{"start":[146,2],"end":[146,12],"bytes":[3814,3824]},"callee":null},"148:17":{"kind":"call","span":{"start":[148,17],"end":[148,73],"bytes":[3842,3898]},"callee":null},"148:37":{"kind":"call","span":{"start":[148,37],"end":[148,57],"bytes":[3862,3882]},"callee":null},"149:8":{"kind":"call","span":{"start":[149,8],"end":[149,16],"bytes":[3906,3914]},"callee":null},"152:13":{"kind":"call","span":{"start":[152,13],"end":[152,39],"bytes":[3954,3980]},"callee":null},"153:4":{"kind":"call","span":{"start":[153,4],"end":[153,62],"bytes":[3998,4056]},"callee":null},"156:2":{"kind":"call","span":{"start":[156,2],"end":[156,13],"bytes":[4065,4076]},"callee":null}}},"github.com/benbjohnson/litestream.Server.Start":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","kind":"method","span":{"start":[98,1],"end":[142,2],"bytes":[2437,3727]},"signature":"github.com/benbjohnson/litestream.Server.Start","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"100:10":{"kind":"call","span":{"start":[100,10],"end":[100,44],"bytes":[2504,2538]},"callee":null},"104:18":{"kind":"call","span":{"start":[104,18],"end":[104,40],"bytes":[2633,2655]},"callee":null},"105:6":{"kind":"call","span":{"start":[105,6],"end":[105,17],"bytes":[2675,2686]},"callee":null},"106:14":{"kind":"call","span":{"start":[106,14],"end":[106,37],"bytes":[2721,2744]},"callee":null},"107:12":{"kind":"call","span":{"start":[107,12],"end":[107,57],"bytes":[2770,2815]},"callee":null},"110:11":{"kind":"call","span":{"start":[110,11],"end":[110,81],"bytes":[2842,2912]},"callee":null},"112:13":{"kind":"call","span":{"start":[112,13],"end":[112,31],"bytes":[2929,2947]},"callee":null},"113:10":{"kind":"call","span":{"start":[113,10],"end":[113,50],"bytes":[2959,2999]},"callee":null},"116:19":{"kind":"call","span":{"start":[116,19],"end":[116,51],"bytes":[3022,3054]},"callee":null},"118:10":{"kind":"call","span":{"start":[118,10],"end":[118,54],"bytes":[3081,3125]},"callee":null},"122:12":{"kind":"call","span":{"start":[122,12],"end":[122,62],"bytes":[3170,3220]},"callee":null},"122:35":{"kind":"call","span":{"start":[122,35],"end":[122,61],"bytes":[3193,3219]},"callee":null},"123:3":{"kind":"call","span":{"start":[123,3],"end":[123,19],"bytes":[3237,3253]},"callee":null},"124:10":{"kind":"call","span":{"start":[124,10],"end":[124,45],"bytes":[3263,3298]},"callee":null},"129:16":{"kind":"call","span":{"start":[129,16],"end":[129,26],"bytes":[3441,3451]},"callee":null},"131:2":{"kind":"call","span":{"start":[131,2],"end":[131,65],"bytes":[3454,3517]},"callee":null},"133:2":{"kind":"call","span":{"start":[133,2],"end":[133,13],"bytes":[3520,3531]},"callee":null},"134:5":{"kind":"call","span":{"start":[134,5],"end":[139,5],"bytes":[3536,3712]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start/github.com/benbjohnson/litestream.Server.Start.closure_1","kind":"function","span":{"start":[134,1],"end":[139,5],"bytes":[3532,3712]},"signature":"github.com/benbjohnson/litestream.Server.Start.closure_1","parameters":[],"body":{"135:9":{"kind":"call","span":{"start":[135,9],"end":[135,20],"bytes":[3553,3564]},"callee":null},"136:13":{"kind":"call","span":{"start":[136,13],"end":[136,41],"bytes":[3577,3605]},"callee":null},"137:4":{"kind":"call","span":{"start":[137,4],"end":[137,53],"bytes":[3654,3703]},"callee":null}}}}},"github.com/benbjohnson/litestream.Server.expandPath":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","kind":"method","span":{"start":[161,1],"end":[166,2],"bytes":[4150,4289]},"signature":"github.com/benbjohnson/litestream.Server.expandPath","parameters":[{"name":"path","type":"string","span":{"start":[161,1],"end":[161,59],"bytes":[4150,4208]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"163:10":{"kind":"call","span":{"start":[163,10],"end":[163,30],"bytes":[4246,4266]},"callee":null}}},"github.com/benbjohnson/litestream.Server.handleInfo":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo","kind":"method","span":{"start":[509,1],"end":[519,2],"bytes":[12829,13146]},"signature":"github.com/benbjohnson/litestream.Server.handleInfo","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[509,1],"end":[509,70],"bytes":[12829,12898]}},{"name":"_","type":"*net/http.Request","span":{"start":[509,1],"end":[509,70],"bytes":[12829,12898]}}],"metrics":{"cyclomatic":1},"body":{"512:18":{"kind":"call","span":{"start":[512,18],"end":[512,29],"bytes":[12967,12978]},"callee":null},"514:18":{"kind":"call","span":{"start":[514,18],"end":[514,58],"bytes":[13027,13067]},"callee":null},"514:24":{"kind":"call","span":{"start":[514,24],"end":[514,47],"bytes":[13033,13056]},"callee":null},"515:18":{"kind":"call","span":{"start":[515,18],"end":[515,36],"bytes":[13086,13104]},"callee":null},"515:22":{"kind":"call","span":{"start":[515,22],"end":[515,35],"bytes":[13090,13103]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"518:2":{"kind":"call","span":{"start":[518,2],"end":[518,35],"bytes":[13111,13144]},"callee":null}}},"github.com/benbjohnson/litestream.Server.handleList":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","kind":"method","span":{"start":[476,1],"end":[507,2],"bytes":[12185,12827]},"signature":"github.com/benbjohnson/litestream.Server.handleList","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[476,1],"end":[476,70],"bytes":[12185,12254]}},{"name":"_","type":"*net/http.Request","span":{"start":[476,1],"end":[476,70],"bytes":[12185,12254]}}],"metrics":{"cyclomatic":5},"body":{"477:9":{"kind":"call","span":{"start":[477,9],"end":[477,22],"bytes":[12263,12276]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"479:14":{"kind":"call","span":{"start":[479,14],"end":[479,50],"bytes":[12313,12349]},"callee":null},"479:41":{"kind":"call","span":{"start":[479,41],"end":[479,49],"bytes":[12340,12348]},"callee":null},"484:6":{"kind":"call","span":{"start":[484,6],"end":[484,17],"bytes":[12406,12417]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"495:12":{"kind":"call","span":{"start":[495,12],"end":[495,21],"bytes":[12618,12627]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"499:11":{"kind":"call","span":{"start":[499,11],"end":[499,36],"bytes":[12663,12688]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt"},"499:39":{"kind":"call","span":{"start":[499,39],"end":[499,49],"bytes":[12691,12701]},"callee":null},"503:20":{"kind":"call","span":{"start":[503,20],"end":[503,51],"bytes":[12755,12786]},"callee":null},"506:2":{"kind":"call","span":{"start":[506,2],"end":[506,35],"bytes":[12792,12825]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleRegister":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","kind":"method","span":{"start":[571,1],"end":[628,2],"bytes":[14800,16393]},"signature":"github.com/benbjohnson/litestream.Server.handleRegister","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[571,1],"end":[571,74],"bytes":[14800,14873]}},{"name":"r","type":"*net/http.Request","span":{"start":[571,1],"end":[571,74],"bytes":[14800,14873]}}],"metrics":{"cyclomatic":8},"body":{"573:12":{"kind":"call","span":{"start":[573,12],"end":[573,35],"bytes":[14918,14941]},"callee":null},"574:3":{"kind":"call","span":{"start":[574,3],"end":[574,80],"bytes":[14971,15048]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"574:68":{"kind":"call","span":{"start":[574,68],"end":[574,79],"bytes":[15036,15047]},"callee":null},"579:3":{"kind":"call","span":{"start":[579,3],"end":[579,65],"bytes":[15085,15147]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"584:3":{"kind":"call","span":{"start":[584,3],"end":[584,72],"bytes":[15190,15259]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"588:23":{"kind":"call","span":{"start":[588,23],"end":[588,45],"bytes":[15295,15317]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"590:3":{"kind":"call","span":{"start":[590,3],"end":[590,86],"bytes":[15337,15420]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"590:44":{"kind":"call","span":{"start":[590,44],"end":[590,80],"bytes":[15378,15414]},"callee":null},"595:17":{"kind":"call","span":{"start":[595,17],"end":[595,45],"bytes":[15488,15516]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"596:3":{"kind":"call","span":{"start":[596,3],"end":[599,5],"bytes":[15538,15654]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"},"604:17":{"kind":"call","span":{"start":[604,17],"end":[604,56],"bytes":[15720,15759]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL"},"606:3":{"kind":"call","span":{"start":[606,3],"end":[606,93],"bytes":[15779,15869]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"606:44":{"kind":"call","span":{"start":[606,44],"end":[606,87],"bytes":[15820,15863]},"callee":null},"611:8":{"kind":"call","span":{"start":[611,8],"end":[611,27],"bytes":[15915,15934]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB"},"614:13":{"kind":"call","span":{"start":[614,13],"end":[614,27],"bytes":[15986,16000]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica"},"619:12":{"kind":"call","span":{"start":[619,12],"end":[619,34],"bytes":[16125,16147]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB"},"620:3":{"kind":"call","span":{"start":[620,3],"end":[620,110],"bytes":[16164,16271]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"620:53":{"kind":"call","span":{"start":[620,53],"end":[620,104],"bytes":[16214,16265]},"callee":null},"624:2":{"kind":"call","span":{"start":[624,2],"end":[627,4],"bytes":[16286,16391]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleStart":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","kind":"method","span":{"start":[168,1],"end":[219,2],"bytes":[4291,5621]},"signature":"github.com/benbjohnson/litestream.Server.handleStart","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[168,1],"end":[168,71],"bytes":[4291,4361]}},{"name":"r","type":"*net/http.Request","span":{"start":[168,1],"end":[168,71],"bytes":[4291,4361]}}],"metrics":{"cyclomatic":9},"body":{"170:12":{"kind":"call","span":{"start":[170,12],"end":[170,35],"bytes":[4395,4418]},"callee":null},"171:3":{"kind":"call","span":{"start":[171,3],"end":[171,80],"bytes":[4448,4525]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"171:68":{"kind":"call","span":{"start":[171,68],"end":[171,79],"bytes":[4513,4524]},"callee":null},"176:3":{"kind":"call","span":{"start":[176,3],"end":[176,65],"bytes":[4562,4624]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"180:23":{"kind":"call","span":{"start":[180,23],"end":[180,45],"bytes":[4660,4682]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"182:3":{"kind":"call","span":{"start":[182,3],"end":[182,86],"bytes":[4702,4785]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"182:44":{"kind":"call","span":{"start":[182,44],"end":[182,80],"bytes":[4743,4779]},"callee":null},"189:17":{"kind":"call","span":{"start":[189,17],"end":[189,83],"bytes":[4883,4949]},"callee":null},"189:44":{"kind":"call","span":{"start":[189,44],"end":[189,70],"bytes":[4910,4936]},"callee":null},"190:9":{"kind":"call","span":{"start":[190,9],"end":[190,17],"bytes":[4958,4966]},"callee":null},"193:8":{"kind":"call","span":{"start":[193,8],"end":[193,36],"bytes":[4978,5006]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"195:3":{"kind":"call","span":{"start":[195,3],"end":[195,110],"bytes":[5025,5132]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"195:53":{"kind":"call","span":{"start":[195,53],"end":[195,104],"bytes":[5075,5126]},"callee":null},"200:5":{"kind":"call","span":{"start":[200,5],"end":[200,16],"bytes":[5171,5182]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"203:13":{"kind":"call","span":{"start":[203,13],"end":[203,48],"bytes":[5236,5271]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB"},"204:4":{"kind":"call","span":{"start":[204,4],"end":[204,71],"bytes":[5289,5356]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"204:54":{"kind":"call","span":{"start":[204,54],"end":[204,65],"bytes":[5339,5350]},"callee":null},"208:15":{"kind":"call","span":{"start":[208,15],"end":[208,40],"bytes":[5388,5413]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID"},"210:3":{"kind":"call","span":{"start":[210,3],"end":[210,70],"bytes":[5433,5500]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"210:53":{"kind":"call","span":{"start":[210,53],"end":[210,64],"bytes":[5483,5494]},"callee":null},"214:2":{"kind":"call","span":{"start":[214,2],"end":[218,4],"bytes":[5515,5619]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleStop":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","kind":"method","span":{"start":[221,1],"end":[272,2],"bytes":[5623,6937]},"signature":"github.com/benbjohnson/litestream.Server.handleStop","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[221,1],"end":[221,70],"bytes":[5623,5692]}},{"name":"r","type":"*net/http.Request","span":{"start":[221,1],"end":[221,70],"bytes":[5623,5692]}}],"metrics":{"cyclomatic":9},"body":{"223:12":{"kind":"call","span":{"start":[223,12],"end":[223,35],"bytes":[5725,5748]},"callee":null},"224:3":{"kind":"call","span":{"start":[224,3],"end":[224,80],"bytes":[5778,5855]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"224:68":{"kind":"call","span":{"start":[224,68],"end":[224,79],"bytes":[5843,5854]},"callee":null},"229:3":{"kind":"call","span":{"start":[229,3],"end":[229,65],"bytes":[5892,5954]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"233:23":{"kind":"call","span":{"start":[233,23],"end":[233,45],"bytes":[5990,6012]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"235:3":{"kind":"call","span":{"start":[235,3],"end":[235,86],"bytes":[6032,6115]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"235:44":{"kind":"call","span":{"start":[235,44],"end":[235,80],"bytes":[6073,6109]},"callee":null},"243:17":{"kind":"call","span":{"start":[243,17],"end":[243,79],"bytes":[6206,6268]},"callee":null},"243:44":{"kind":"call","span":{"start":[243,44],"end":[243,66],"bytes":[6233,6255]},"callee":null},"244:8":{"kind":"call","span":{"start":[244,8],"end":[244,16],"bytes":[6276,6284]},"callee":null},"246:8":{"kind":"call","span":{"start":[246,8],"end":[246,36],"bytes":[6293,6321]},"callee":null},"248:3":{"kind":"call","span":{"start":[248,3],"end":[248,110],"bytes":[6340,6447]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"248:53":{"kind":"call","span":{"start":[248,53],"end":[248,104],"bytes":[6390,6441]},"callee":null},"253:6":{"kind":"call","span":{"start":[253,6],"end":[253,17],"bytes":[6487,6498]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"256:13":{"kind":"call","span":{"start":[256,13],"end":[256,49],"bytes":[6552,6588]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB"},"257:4":{"kind":"call","span":{"start":[257,4],"end":[257,71],"bytes":[6606,6673]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"257:54":{"kind":"call","span":{"start":[257,54],"end":[257,65],"bytes":[6656,6667]},"callee":null},"261:15":{"kind":"call","span":{"start":[261,15],"end":[261,40],"bytes":[6705,6730]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID"},"263:3":{"kind":"call","span":{"start":[263,3],"end":[263,70],"bytes":[6750,6817]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"263:53":{"kind":"call","span":{"start":[263,53],"end":[263,64],"bytes":[6800,6811]},"callee":null},"267:2":{"kind":"call","span":{"start":[267,2],"end":[271,4],"bytes":[6832,6935]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleSync":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","kind":"method","span":{"start":[403,1],"end":[459,2],"bytes":[10277,11730]},"signature":"github.com/benbjohnson/litestream.Server.handleSync","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[403,1],"end":[403,70],"bytes":[10277,10346]}},{"name":"r","type":"*net/http.Request","span":{"start":[403,1],"end":[403,70],"bytes":[10277,10346]}}],"metrics":{"cyclomatic":13},"body":{"405:12":{"kind":"call","span":{"start":[405,12],"end":[405,35],"bytes":[10379,10402]},"callee":null},"406:3":{"kind":"call","span":{"start":[406,3],"end":[406,80],"bytes":[10432,10509]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"406:68":{"kind":"call","span":{"start":[406,68],"end":[406,79],"bytes":[10497,10508]},"callee":null},"411:3":{"kind":"call","span":{"start":[411,3],"end":[411,65],"bytes":[10546,10608]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"415:23":{"kind":"call","span":{"start":[415,23],"end":[415,45],"bytes":[10644,10666]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"417:3":{"kind":"call","span":{"start":[417,3],"end":[417,86],"bytes":[10686,10769]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"417:44":{"kind":"call","span":{"start":[417,44],"end":[417,80],"bytes":[10727,10763]},"callee":null},"427:17":{"kind":"call","span":{"start":[427,17],"end":[427,83],"bytes":[10924,10990]},"callee":null},"427:44":{"kind":"call","span":{"start":[427,44],"end":[427,70],"bytes":[10951,10977]},"callee":null},"428:9":{"kind":"call","span":{"start":[428,9],"end":[428,17],"bytes":[10999,11007]},"callee":null},"431:17":{"kind":"call","span":{"start":[431,17],"end":[431,60],"bytes":[11028,11071]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB"},"434:8":{"kind":"call","span":{"start":[434,8],"end":[434,43],"bytes":[11107,11142]},"callee":null},"435:4":{"kind":"call","span":{"start":[435,4],"end":[435,60],"bytes":[11147,11203]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"435:43":{"kind":"call","span":{"start":[435,43],"end":[435,54],"bytes":[11186,11197]},"callee":null},"436:8":{"kind":"call","span":{"start":[436,8],"end":[436,42],"bytes":[11211,11245]},"callee":null},"437:4":{"kind":"call","span":{"start":[437,4],"end":[437,60],"bytes":[11250,11306]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"437:43":{"kind":"call","span":{"start":[437,43],"end":[437,54],"bytes":[11289,11300]},"callee":null},"439:4":{"kind":"call","span":{"start":[439,4],"end":[439,71],"bytes":[11321,11388]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"439:54":{"kind":"call","span":{"start":[439,54],"end":[439,65],"bytes":[11371,11382]},"callee":null},"453:2":{"kind":"call","span":{"start":[453,2],"end":[458,4],"bytes":[11553,11728]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleSyncStatus":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","kind":"method","span":{"start":[317,1],"end":[344,2],"bytes":[7917,8710]},"signature":"github.com/benbjohnson/litestream.Server.handleSyncStatus","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[317,1],"end":[317,76],"bytes":[7917,7992]}},{"name":"r","type":"*net/http.Request","span":{"start":[317,1],"end":[317,76],"bytes":[7917,7992]}}],"metrics":{"cyclomatic":5},"body":{"318:10":{"kind":"call","span":{"start":[318,10],"end":[318,23],"bytes":[8002,8015]},"callee":null},"320:24":{"kind":"call","span":{"start":[320,24],"end":[320,42],"bytes":[8068,8086]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"322:4":{"kind":"call","span":{"start":[322,4],"end":[322,87],"bytes":[8108,8191]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"322:45":{"kind":"call","span":{"start":[322,45],"end":[322,81],"bytes":[8149,8185]},"callee":null},"326:9":{"kind":"call","span":{"start":[326,9],"end":[326,37],"bytes":[8215,8243]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"328:4":{"kind":"call","span":{"start":[328,4],"end":[328,69],"bytes":[8264,8329]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"332:3":{"kind":"call","span":{"start":[332,3],"end":[334,5],"bytes":[8347,8457]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"},"333:32":{"kind":"call","span":{"start":[333,32],"end":[333,51],"bytes":[8431,8450]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic"},"338:9":{"kind":"call","span":{"start":[338,9],"end":[338,22],"bytes":[8479,8492]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"339:17":{"kind":"call","span":{"start":[339,17],"end":[339,52],"bytes":[8509,8544]},"callee":null},"339:43":{"kind":"call","span":{"start":[339,43],"end":[339,51],"bytes":[8535,8543]},"callee":null},"341:17":{"kind":"call","span":{"start":[341,17],"end":[341,57],"bytes":[8587,8627]},"callee":null},"341:37":{"kind":"call","span":{"start":[341,37],"end":[341,56],"bytes":[8607,8626]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic"},"343:2":{"kind":"call","span":{"start":[343,2],"end":[343,78],"bytes":[8632,8708]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleTXID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","kind":"method","span":{"start":[287,1],"end":[315,2],"bytes":[7229,7915]},"signature":"github.com/benbjohnson/litestream.Server.handleTXID","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[287,1],"end":[287,70],"bytes":[7229,7298]}},{"name":"r","type":"*net/http.Request","span":{"start":[287,1],"end":[287,70],"bytes":[7229,7298]}}],"metrics":{"cyclomatic":5},"body":{"288:10":{"kind":"call","span":{"start":[288,10],"end":[288,23],"bytes":[7308,7321]},"callee":null},"290:3":{"kind":"call","span":{"start":[290,3],"end":[290,65],"bytes":[7353,7415]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"294:23":{"kind":"call","span":{"start":[294,23],"end":[294,41],"bytes":[7451,7469]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"296:3":{"kind":"call","span":{"start":[296,3],"end":[296,86],"bytes":[7489,7572]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"296:44":{"kind":"call","span":{"start":[296,44],"end":[296,80],"bytes":[7530,7566]},"callee":null},"300:8":{"kind":"call","span":{"start":[300,8],"end":[300,36],"bytes":[7593,7621]},"callee":null},"302:3":{"kind":"call","span":{"start":[302,3],"end":[302,68],"bytes":[7640,7705]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"306:14":{"kind":"call","span":{"start":[306,14],"end":[306,22],"bytes":[7732,7740]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"308:3":{"kind":"call","span":{"start":[308,3],"end":[308,70],"bytes":[7760,7827]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"308:53":{"kind":"call","span":{"start":[308,53],"end":[308,64],"bytes":[7810,7821]},"callee":null},"312:2":{"kind":"call","span":{"start":[312,2],"end":[314,4],"bytes":[7842,7913]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"},"313:9":{"kind":"call","span":{"start":[313,9],"end":[313,25],"bytes":[7892,7908]},"callee":null}}},"github.com/benbjohnson/litestream.Server.handleUnregister":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","kind":"method","span":{"start":[630,1],"end":[680,2],"bytes":[16395,17840]},"signature":"github.com/benbjohnson/litestream.Server.handleUnregister","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[630,1],"end":[630,76],"bytes":[16395,16470]}},{"name":"r","type":"*net/http.Request","span":{"start":[630,1],"end":[630,76],"bytes":[16395,16470]}}],"metrics":{"cyclomatic":8},"body":{"632:12":{"kind":"call","span":{"start":[632,12],"end":[632,35],"bytes":[16517,16540]},"callee":null},"633:3":{"kind":"call","span":{"start":[633,3],"end":[633,80],"bytes":[16570,16647]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"633:68":{"kind":"call","span":{"start":[633,68],"end":[633,79],"bytes":[16635,16646]},"callee":null},"638:3":{"kind":"call","span":{"start":[638,3],"end":[638,65],"bytes":[16684,16746]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"642:23":{"kind":"call","span":{"start":[642,23],"end":[642,45],"bytes":[16782,16804]},"callee":null},"644:3":{"kind":"call","span":{"start":[644,3],"end":[644,86],"bytes":[16824,16907]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"644:44":{"kind":"call","span":{"start":[644,44],"end":[644,80],"bytes":[16865,16901]},"callee":null},"653:17":{"kind":"call","span":{"start":[653,17],"end":[653,79],"bytes":[17064,17126]},"callee":null},"653:44":{"kind":"call","span":{"start":[653,44],"end":[653,66],"bytes":[17091,17113]},"callee":null},"654:8":{"kind":"call","span":{"start":[654,8],"end":[654,16],"bytes":[17134,17142]},"callee":null},"656:8":{"kind":"call","span":{"start":[656,8],"end":[656,36],"bytes":[17151,17179]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"659:12":{"kind":"call","span":{"start":[659,12],"end":[659,51],"bytes":[17246,17285]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB"},"660:3":{"kind":"call","span":{"start":[660,3],"end":[660,112],"bytes":[17302,17411]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"660:53":{"kind":"call","span":{"start":[660,53],"end":[660,106],"bytes":[17352,17405]},"callee":null},"666:22":{"kind":"call","span":{"start":[666,22],"end":[666,33],"bytes":[17512,17523]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"668:4":{"kind":"call","span":{"start":[668,4],"end":[668,109],"bytes":[17545,17650]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"668:54":{"kind":"call","span":{"start":[668,54],"end":[668,103],"bytes":[17595,17644]},"callee":null},"671:10":{"kind":"call","span":{"start":[671,10],"end":[671,25],"bytes":[17674,17689]},"callee":null},"675:2":{"kind":"call","span":{"start":[675,2],"end":[679,4],"bytes":[17721,17838]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.storeTXID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","kind":"method","span":{"start":[274,1],"end":[285,2],"bytes":[6939,7227]},"signature":"github.com/benbjohnson/litestream.Server.storeTXID","parameters":[{"name":"path","type":"string","span":{"start":[274,1],"end":[274,58],"bytes":[6939,6996]}}],"return_type":"(uint64, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"275:8":{"kind":"call","span":{"start":[275,8],"end":[275,28],"bytes":[7004,7024]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"277:13":{"kind":"call","span":{"start":[277,13],"end":[277,55],"bytes":[7053,7095]},"callee":null},"280:21":{"kind":"call","span":{"start":[280,21],"end":[280,32],"bytes":[7120,7131]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"282:13":{"kind":"call","span":{"start":[282,13],"end":[282,45],"bytes":[7161,7193]},"callee":null},"284:9":{"kind":"call","span":{"start":[284,9],"end":[284,24],"bytes":[7205,7220]},"callee":null}}}},"fields":{"PathExpander":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/PathExpander","kind":"field","type":"func(string) (string, error)","span":{"start":[45,1],"end":[45,43],"bytes":[915,957]}},"SocketPath":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/SocketPath","kind":"field","type":"string","span":{"start":[38,1],"end":[38,19],"bytes":[721,739]}},"SocketPerms":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/SocketPerms","kind":"field","type":"uint32","span":{"start":[41,1],"end":[41,20],"bytes":[797,816]}},"Version":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/Version","kind":"field","type":"string","span":{"start":[48,1],"end":[48,16],"bytes":[1013,1028]}},"cancel":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[57,1],"end":[57,27],"bytes":[1180,1206]}},"ctx":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/ctx","kind":"field","type":"context.Context","span":{"start":[56,1],"end":[56,24],"bytes":[1156,1179]}},"httpServer":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/httpServer","kind":"field","type":"*net/http.Server","span":{"start":[54,1],"end":[54,29],"bytes":[1126,1154]}},"logger":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[60,1],"end":[60,21],"bytes":[1231,1251]}},"socketListener":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/socketListener","kind":"field","type":"net.Listener","span":{"start":[53,1],"end":[53,29],"bytes":[1097,1125]}},"startedAt":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/startedAt","kind":"field","type":"time.Time","span":{"start":[51,1],"end":[51,21],"bytes":[1075,1095]}},"store":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/store","kind":"field","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[35,1],"end":[35,14],"bytes":[659,672]}},"wg":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[58,1],"end":[58,23],"bytes":[1207,1229]}}}},"SocketConfig":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SocketConfig","kind":"struct","span":{"start":[18,1],"end":[22,2],"bytes":[213,353]},"callables":{},"fields":{"Enabled":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SocketConfig/Enabled","kind":"field","type":"bool","span":{"start":[19,1],"end":[19,37],"bytes":[240,276]}},"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SocketConfig/Path","kind":"field","type":"string","span":{"start":[20,1],"end":[20,34],"bytes":[277,310]}},"Permissions":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SocketConfig/Permissions","kind":"field","type":"uint32","span":{"start":[21,1],"end":[21,41],"bytes":[311,351]}}}},"StartRequest":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StartRequest","kind":"struct","span":{"start":[362,1],"end":[365,2],"bytes":[9206,9307]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StartRequest/Path","kind":"field","type":"string","span":{"start":[363,1],"end":[363,30],"bytes":[9233,9262]}},"Timeout":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StartRequest/Timeout","kind":"field","type":"int","span":{"start":[364,1],"end":[364,43],"bytes":[9263,9305]}}}},"StartResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StartResponse","kind":"struct","span":{"start":[368,1],"end":[372,2],"bytes":[9372,9490]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StartResponse/Path","kind":"field","type":"string","span":{"start":[370,1],"end":[370,29],"bytes":[9431,9459]}},"Status":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StartResponse/Status","kind":"field","type":"string","span":{"start":[369,1],"end":[369,31],"bytes":[9400,9430]}},"TXID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StartResponse/TXID","kind":"field","type":"uint64","span":{"start":[371,1],"end":[371,29],"bytes":[9460,9488]}}}},"StopRequest":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StopRequest","kind":"struct","span":{"start":[375,1],"end":[378,2],"bytes":[9551,9651]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StopRequest/Path","kind":"field","type":"string","span":{"start":[376,1],"end":[376,30],"bytes":[9577,9606]}},"Timeout":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StopRequest/Timeout","kind":"field","type":"int","span":{"start":[377,1],"end":[377,43],"bytes":[9607,9649]}}}},"StopResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StopResponse","kind":"struct","span":{"start":[381,1],"end":[385,2],"bytes":[9714,9831]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StopResponse/Path","kind":"field","type":"string","span":{"start":[383,1],"end":[383,29],"bytes":[9772,9800]}},"Status":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StopResponse/Status","kind":"field","type":"string","span":{"start":[382,1],"end":[382,31],"bytes":[9741,9771]}},"TXID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.StopResponse/TXID","kind":"field","type":"uint64","span":{"start":[384,1],"end":[384,29],"bytes":[9801,9829]}}}},"SyncDiagnosticsResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncDiagnosticsResponse","kind":"struct","span":{"start":[399,1],"end":[401,2],"bytes":[10189,10275]},"callables":{},"fields":{"Databases":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncDiagnosticsResponse/Databases","kind":"field","type":"[]github.com/benbjohnson/litestream.SyncDiagnostic","span":{"start":[400,1],"end":[400,47],"bytes":[10227,10273]}}}},"SyncRequest":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncRequest","kind":"struct","span":{"start":[462,1],"end":[466,2],"bytes":[11791,11931]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncRequest/Path","kind":"field","type":"string","span":{"start":[463,1],"end":[463,30],"bytes":[11817,11846]}},"Timeout":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncRequest/Timeout","kind":"field","type":"int","span":{"start":[465,1],"end":[465,43],"bytes":[11887,11929]}},"Wait":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncRequest/Wait","kind":"field","type":"bool","span":{"start":[464,1],"end":[464,40],"bytes":[11847,11886]}}}},"SyncResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncResponse","kind":"struct","span":{"start":[469,1],"end":[474,2],"bytes":[11994,12183]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncResponse/Path","kind":"field","type":"string","span":{"start":[471,1],"end":[471,37],"bytes":[12060,12096]}},"ReplicatedTXID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncResponse/ReplicatedTXID","kind":"field","type":"uint64","span":{"start":[473,1],"end":[473,48],"bytes":[12134,12181]}},"Status":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncResponse/Status","kind":"field","type":"string","span":{"start":[470,1],"end":[470,39],"bytes":[12021,12059]}},"TXID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.SyncResponse/TXID","kind":"field","type":"uint64","span":{"start":[472,1],"end":[472,37],"bytes":[12097,12133]}}}},"TXIDResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.TXIDResponse","kind":"struct","span":{"start":[394,1],"end":[396,2],"bytes":[10060,10115]},"callables":{},"fields":{"TXID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.TXIDResponse/TXID","kind":"field","type":"uint64","span":{"start":[395,1],"end":[395,27],"bytes":[10087,10113]}}}},"UnregisterDatabaseRequest":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseRequest","kind":"struct","span":{"start":[559,1],"end":[562,2],"bytes":[14470,14584]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseRequest/Path","kind":"field","type":"string","span":{"start":[560,1],"end":[560,30],"bytes":[14510,14539]}},"Timeout":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseRequest/Timeout","kind":"field","type":"int","span":{"start":[561,1],"end":[561,43],"bytes":[14540,14582]}}}},"UnregisterDatabaseResponse":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseResponse","kind":"struct","span":{"start":[565,1],"end":[569,2],"bytes":[14667,14798]},"callables":{},"fields":{"Path":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseResponse/Path","kind":"field","type":"string","span":{"start":[567,1],"end":[567,29],"bytes":[14739,14767]}},"Status":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseResponse/Status","kind":"field","type":"string","span":{"start":[566,1],"end":[566,31],"bytes":[14708,14738]}},"TXID":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseResponse/TXID","kind":"field","type":"uint64","span":{"start":[568,1],"end":[568,29],"bytes":[14768,14796]}}}}},"functions":{"github.com/benbjohnson/litestream.DefaultSocketConfig":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.DefaultSocketConfig","kind":"function","span":{"start":[25,1],"end":[31,2],"bytes":[420,574]},"signature":"github.com/benbjohnson/litestream.DefaultSocketConfig","parameters":[],"return_type":"github.com/benbjohnson/litestream.SocketConfig","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.NewServer":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.NewServer","kind":"function","span":{"start":[64,1],"end":[95,2],"bytes":[1299,2384]},"signature":"github.com/benbjohnson/litestream.NewServer","parameters":[{"name":"store","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[64,1],"end":[64,39],"bytes":[1299,1337]}}],"return_type":"*github.com/benbjohnson/litestream.Server","metrics":{"cyclomatic":1},"body":{"65:17":{"kind":"call","span":{"start":[65,17],"end":[65,57],"bytes":[1354,1394]},"callee":null},"65:36":{"kind":"call","span":{"start":[65,36],"end":[65,56],"bytes":[1373,1393]},"callee":null},"71:16":{"kind":"call","span":{"start":[71,16],"end":[71,30],"bytes":[1511,1525]},"callee":null},"74:9":{"kind":"call","span":{"start":[74,9],"end":[74,27],"bytes":[1575,1593]},"callee":null},"75:2":{"kind":"call","span":{"start":[75,2],"end":[75,46],"bytes":[1595,1639]},"callee":null},"76:2":{"kind":"call","span":{"start":[76,2],"end":[76,44],"bytes":[1641,1683]},"callee":null},"77:2":{"kind":"call","span":{"start":[77,2],"end":[77,43],"bytes":[1685,1726]},"callee":null},"78:2":{"kind":"call","span":{"start":[78,2],"end":[78,52],"bytes":[1728,1778]},"callee":null},"79:2":{"kind":"call","span":{"start":[79,2],"end":[79,56],"bytes":[1780,1834]},"callee":null},"80:2":{"kind":"call","span":{"start":[80,2],"end":[80,44],"bytes":[1836,1878]},"callee":null},"81:2":{"kind":"call","span":{"start":[81,2],"end":[81,43],"bytes":[1880,1921]},"callee":null},"82:2":{"kind":"call","span":{"start":[82,2],"end":[82,43],"bytes":[1923,1964]},"callee":null},"83:2":{"kind":"call","span":{"start":[83,2],"end":[83,62],"bytes":[1966,2026]},"callee":null},"86:2":{"kind":"call","span":{"start":[86,2],"end":[86,50],"bytes":[2049,2097]},"callee":null},"87:2":{"kind":"call","span":{"start":[87,2],"end":[87,59],"bytes":[2099,2156]},"callee":null},"88:2":{"kind":"call","span":{"start":[88,2],"end":[88,59],"bytes":[2158,2215]},"callee":null},"89:2":{"kind":"call","span":{"start":[89,2],"end":[89,57],"bytes":[2217,2272]},"callee":null},"90:2":{"kind":"call","span":{"start":[90,2],"end":[90,55],"bytes":[2274,2327]},"callee":null}}},"github.com/benbjohnson/litestream.writeJSON":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","kind":"function","span":{"start":[346,1],"end":[350,2],"bytes":[8712,8885]},"signature":"github.com/benbjohnson/litestream.writeJSON","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[346,1],"end":[346,67],"bytes":[8712,8778]}},{"name":"status","type":"int","span":{"start":[346,1],"end":[346,67],"bytes":[8712,8778]}},{"name":"v","type":"interface{}","span":{"start":[346,1],"end":[346,67],"bytes":[8712,8778]}}],"metrics":{"cyclomatic":1},"body":{"347:2":{"kind":"call","span":{"start":[347,2],"end":[347,12],"bytes":[8780,8790]},"callee":null},"348:2":{"kind":"call","span":{"start":[348,2],"end":[348,23],"bytes":[8832,8853]},"callee":null},"349:2":{"kind":"call","span":{"start":[349,2],"end":[349,20],"bytes":[8855,8873]},"callee":null}}},"github.com/benbjohnson/litestream.writeJSONError":{"id":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","kind":"function","span":{"start":[352,1],"end":[359,2],"bytes":[8887,9143]},"signature":"github.com/benbjohnson/litestream.writeJSONError","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[352,1],"end":[352,94],"bytes":[8887,8980]}},{"name":"status","type":"int","span":{"start":[352,1],"end":[352,94],"bytes":[8887,8980]}},{"name":"message","type":"string","span":{"start":[352,1],"end":[352,94],"bytes":[8887,8980]}},{"name":"details","type":"interface{}","span":{"start":[352,1],"end":[352,94],"bytes":[8887,8980]}}],"metrics":{"cyclomatic":1},"body":{"353:2":{"kind":"call","span":{"start":[353,2],"end":[353,12],"bytes":[8982,8992]},"callee":null},"354:2":{"kind":"call","span":{"start":[354,2],"end":[354,23],"bytes":[9034,9055]},"callee":null},"355:2":{"kind":"call","span":{"start":[355,2],"end":[355,20],"bytes":[9057,9075]},"callee":null}}}},"content_hash":"e3f807d05a146d30c5e210067903fb9f8756128b292c0e8c140648ec80767946"},"sftp/replica_client.go":{"id":"can://go/litestream/sftp/replica_client.go","kind":"module","span":{"start":[1,1],"end":[431,1],"bytes":[0,11844]},"package":"sftp","source":"package sftp\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/pkg/sftp\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/crypto/ssh\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"sftp\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"sftp\"\n\n// Default settings for replica client.\nconst (\n\tDefaultDialTimeout = 30 * time.Second\n)\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files over SFTP.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tsshClient *ssh.Client\n\tsftpClient *sftp.Client\n\tlogger *slog.Logger\n\n\t// SFTP connection info\n\tHost string\n\tUser string\n\tPassword string\n\tPath string\n\tKeyPath string\n\tHostKey string\n\tDialTimeout time.Duration\n\n\t// ConcurrentWrites enables concurrent writes for better performance.\n\t// Note: This makes resuming failed transfers unsafe.\n\tConcurrentWrites bool\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tDialTimeout: DefaultDialTimeout,\n\t\tConcurrentWrites: true, // Default to true for better performance\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: sftp://[user[:password]@]host[:port]/path\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\t// Extract credentials from userinfo\n\tif userinfo != nil {\n\t\tclient.User = userinfo.Username()\n\t\tclient.Password, _ = userinfo.Password()\n\t}\n\n\tclient.Host = host\n\tclient.Path = urlPath\n\n\tif client.Host == \"\" {\n\t\treturn nil, fmt.Errorf(\"host required for sftp replica URL\")\n\t}\n\tif client.User == \"\" {\n\t\treturn nil, fmt.Errorf(\"user required for sftp replica URL\")\n\t}\n\n\treturn client, nil\n}\n\n// Type returns \"sftp\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to SFTP. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\t_, err := c.init(ctx)\n\treturn err\n}\n\n// init initializes the connection and returns the SFTP client.\nfunc (c *ReplicaClient) init(ctx context.Context) (_ *sftp.Client, err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.sftpClient != nil {\n\t\treturn c.sftpClient, nil\n\t}\n\n\tif c.User == \"\" {\n\t\treturn nil, fmt.Errorf(\"sftp user required\")\n\t}\n\n\t// Build SSH configuration \u0026 auth methods\n\tvar hostkey ssh.HostKeyCallback\n\tif c.HostKey != \"\" {\n\t\tvar pubkey, _, _, _, err = ssh.ParseAuthorizedKey([]byte(c.HostKey))\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"cannot parse sftp host key: %w\", err)\n\t\t}\n\t\thostkey = ssh.FixedHostKey(pubkey)\n\t} else {\n\t\tslog.Warn(\"sftp host key not verified\", \"host\", c.Host)\n\t\thostkey = ssh.InsecureIgnoreHostKey()\n\t}\n\tconfig := \u0026ssh.ClientConfig{\n\t\tUser: c.User,\n\t\tHostKeyCallback: hostkey,\n\t\tBannerCallback: ssh.BannerDisplayStderr(),\n\t}\n\tif c.Password != \"\" {\n\t\tconfig.Auth = append(config.Auth, ssh.Password(c.Password))\n\t}\n\n\tif c.KeyPath != \"\" {\n\t\tbuf, err := os.ReadFile(c.KeyPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"sftp: cannot read sftp key path: %w\", err)\n\t\t}\n\n\t\tsigner, err := ssh.ParsePrivateKey(buf)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"sftp: cannot parse sftp key path: %w\", err)\n\t\t}\n\t\tconfig.Auth = append(config.Auth, ssh.PublicKeys(signer))\n\t}\n\n\t// Append standard port, if necessary.\n\thost := c.Host\n\tif _, _, err := net.SplitHostPort(c.Host); err != nil {\n\t\thost = net.JoinHostPort(c.Host, \"22\")\n\t}\n\n\t// Connect via SSH.\n\tif c.sshClient, err = ssh.Dial(\"tcp\", host, config); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Wrap connection with an SFTP client.\n\t// Configure options based on client settings\n\topts := []sftp.ClientOption{}\n\tif c.ConcurrentWrites {\n\t\topts = append(opts, sftp.UseConcurrentWrites(true))\n\t}\n\n\tif c.sftpClient, err = sftp.NewClient(c.sshClient, opts...); err != nil {\n\t\tc.sshClient.Close()\n\t\tc.sshClient = nil\n\t\treturn nil, err\n\t}\n\n\treturn c.sftpClient, nil\n}\n\n// DeleteAll deletes all LTX files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) (err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar dirs []string\n\twalker := sftpClient.Walk(c.Path)\n\tfor walker.Step() {\n\t\tif err := walker.Err(); os.IsNotExist(err) {\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"sftp: cannot walk path %q: %w\", walker.Path(), err)\n\t\t}\n\t\tif walker.Stat().IsDir() {\n\t\t\tdirs = append(dirs, walker.Path())\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := sftpClient.Remove(walker.Path()); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"sftp: cannot delete file %q: %w\", walker.Path(), err)\n\t\t}\n\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\t// Remove directories in reverse order after they have been emptied.\n\tfor i := len(dirs) - 1; i \u003e= 0; i-- {\n\t\tfilename := dirs[i]\n\t\tif err := sftpClient.RemoveDirectory(filename); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"sftp: cannot delete directory %q: %w\", filename, err)\n\t\t}\n\t}\n\n\t// log.Printf(\"%s(%s): retainer: deleting all\", r.db.Path(), r.Name())\n\n\treturn nil\n}\n\n// LTXFiles returns an iterator over all available LTX files for a level.\n// SFTP uses file ModTime for timestamps, which is set via Chtimes() to preserve original timestamp.\n// The useMetadata parameter is ignored since ModTime always contains the accurate timestamp.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, _ bool) (_ ltx.FileIterator, err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdir := litestream.LTXLevelDir(c.Path, level)\n\tfis, err := sftpClient.ReadDir(dir)\n\tif os.IsNotExist(err) {\n\t\treturn ltx.NewFileInfoSliceIterator(nil), nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Iterate over every file and convert to metadata.\n\tinfos := make([]*ltx.FileInfo, 0, len(fis))\n\tfor _, fi := range fis {\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(path.Base(fi.Name()))\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t} else if minTXID \u003c seek {\n\t\t\tcontinue\n\t\t}\n\n\t\tinfos = append(infos, \u0026ltx.FileInfo{\n\t\t\tLevel: level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: fi.Size(),\n\t\t\tCreatedAt: fi.ModTime().UTC(), // ModTime contains accurate timestamp from Chtimes()\n\t\t})\n\t}\n\n\treturn ltx.NewFileInfoSliceIterator(infos), nil\n}\n\n// WriteLTXFile writes a LTX file from rd into a remote file.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\tfullReader := io.MultiReader(\u0026buf, rd)\n\n\tif err := sftpClient.MkdirAll(path.Dir(filename)); err != nil {\n\t\treturn nil, fmt.Errorf(\"sftp: cannot make parent snapshot directory %q: %w\", path.Dir(filename), err)\n\t}\n\n\ttmpFilename := fmt.Sprintf(\"%s.%d.%d.tmp\", filename, os.Getpid(), time.Now().UnixNano())\n\tf, err := sftpClient.OpenFile(tmpFilename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"sftp: cannot open temporary snapshot file for writing: %w\", err)\n\t}\n\tdefer func() {\n\t\tif f != nil {\n\t\t\t_ = f.Close()\n\t\t}\n\t\tif err != nil {\n\t\t\t_ = sftpClient.Remove(tmpFilename)\n\t\t}\n\t}()\n\n\tn, err := io.Copy(f, fullReader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Flush the data to stable storage before the rename so a server crash\n\t// cannot leave an empty file at the final path. Servers that do not\n\t// advertise fsync@openssh.com are left to their own write-back policy.\n\tif _, ok := sftpClient.HasExtension(\"fsync@openssh.com\"); ok {\n\t\tif err := f.Sync(); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"sftp: cannot sync temporary ltx file %q: %w\", tmpFilename, err)\n\t\t}\n\t}\n\n\tif err := f.Close(); err != nil {\n\t\treturn nil, err\n\t}\n\tf = nil\n\n\tif err := sftpClient.Chtimes(tmpFilename, timestamp, timestamp); err != nil {\n\t\treturn nil, fmt.Errorf(\"sftp: cannot set file timestamps: %w\", err)\n\t}\n\n\tif err := sftpClient.Rename(tmpFilename, filename); err != nil {\n\t\treturn nil, fmt.Errorf(\"sftp: cannot rename temporary ltx file %q to %q: %w\", tmpFilename, filename, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(n))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: n,\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// OpenLTXFile returns a reader for an LTX file.\n// Returns os.ErrNotExist if no matching position is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (_ io.ReadCloser, err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\tf, err := sftpClient.OpenFile(filename, os.O_RDONLY)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif offset \u003e 0 {\n\t\tif _, err := f.Seek(offset, io.SeekStart); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\n\tif size \u003e 0 {\n\t\treturn internal.LimitReadCloser(f, size), nil\n\t}\n\treturn f, nil\n}\n\n// DeleteLTXFiles deletes LTX files with at the given positions.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) (err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, info := range a {\n\t\tfilename := litestream.LTXFilePath(c.Path, info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", filename)\n\n\t\tif err := sftpClient.Remove(filename); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"sftp: cannot delete ltx file %q: %w\", filename, err)\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\n// Cleanup deletes path \u0026 directories after empty.\nfunc (c *ReplicaClient) Cleanup(ctx context.Context) (err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := sftpClient.RemoveDirectory(c.Path); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"sftp: cannot delete path: %w\", err)\n\t}\n\treturn nil\n}\n\n// resetOnConnError closes \u0026 clears the client if a connection error occurs.\nfunc (c *ReplicaClient) resetOnConnError(err error) {\n\tif !errors.Is(err, sftp.ErrSSHFxConnectionLost) {\n\t\treturn\n\t}\n\n\tif c.sftpClient != nil {\n\t\tc.sftpClient.Close()\n\t\tc.sftpClient = nil\n\t}\n\tif c.sshClient != nil {\n\t\tc.sshClient.Close()\n\t\tc.sshClient = nil\n\t}\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[43,52]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[53,59]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[60,65]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[66,77]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[78,84]}},{"name":"url","path":"net/url","span":{"start":[11,1],"end":[11,11],"bytes":[85,95]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[96,101]}},{"name":"path","path":"path","span":{"start":[13,1],"end":[13,8],"bytes":[102,109]}},{"name":"sync","path":"sync","span":{"start":[14,1],"end":[14,8],"bytes":[110,117]}},{"name":"time","path":"time","span":{"start":[15,1],"end":[15,8],"bytes":[118,125]}},{"name":"sftp","path":"github.com/pkg/sftp","span":{"start":[17,1],"end":[17,23],"bytes":[127,149]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[18,1],"end":[18,27],"bytes":[150,176]}},{"name":"ssh","path":"golang.org/x/crypto/ssh","span":{"start":[19,1],"end":[19,27],"bytes":[177,203]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[21,1],"end":[21,37],"bytes":[205,241]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[22,1],"end":[22,46],"bytes":[242,287]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient","kind":"struct","span":{"start":[40,1],"end":[58,2],"bytes":[682,1131]},"callables":{"github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","kind":"method","span":{"start":[402,1],"end":[414,2],"bytes":[11168,11502]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[402,1],"end":[402,67],"bytes":[11168,11234]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"403:8":{"kind":"call","span":{"start":[403,8],"end":[403,44],"bytes":[11242,11278]},"callee":null},"405:21":{"kind":"call","span":{"start":[405,21],"end":[405,32],"bytes":[11300,11311]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"410:12":{"kind":"call","span":{"start":[410,12],"end":[410,46],"bytes":[11357,11391]},"callee":null},"410:63":{"kind":"call","span":{"start":[410,63],"end":[410,81],"bytes":[11408,11426]},"callee":null},"411:10":{"kind":"call","span":{"start":[411,10],"end":[411,57],"bytes":[11438,11485]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup.closure_1","kind":"function","span":{"start":[403,1],"end":[403,44],"bytes":[11235,11278]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup.closure_1","parameters":[],"body":{"403:17":{"kind":"call","span":{"start":[403,17],"end":[403,40],"bytes":[11251,11274]},"callee":null}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll","kind":"method","span":{"start":[184,1],"end":[223,2],"bytes":[4537,5679]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[184,1],"end":[184,69],"bytes":[4537,4605]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"185:8":{"kind":"call","span":{"start":[185,8],"end":[185,44],"bytes":[4613,4649]},"callee":null},"187:21":{"kind":"call","span":{"start":[187,21],"end":[187,32],"bytes":[4671,4682]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"193:12":{"kind":"call","span":{"start":[193,12],"end":[193,35],"bytes":[4747,4770]},"callee":null},"194:6":{"kind":"call","span":{"start":[194,6],"end":[194,19],"bytes":[4776,4789]},"callee":null},"195:13":{"kind":"call","span":{"start":[195,13],"end":[195,25],"bytes":[4804,4816]},"callee":null},"195:27":{"kind":"call","span":{"start":[195,27],"end":[195,45],"bytes":[4818,4836]},"callee":null},"198:11":{"kind":"call","span":{"start":[198,11],"end":[198,74],"bytes":[4886,4949]},"callee":null},"198:55":{"kind":"call","span":{"start":[198,55],"end":[198,68],"bytes":[4930,4943]},"callee":null},"200:6":{"kind":"call","span":{"start":[200,6],"end":[200,19],"bytes":[4959,4972]},"callee":null},"201:11":{"kind":"call","span":{"start":[201,11],"end":[201,38],"bytes":[4993,5020]},"callee":null},"201:24":{"kind":"call","span":{"start":[201,24],"end":[201,37],"bytes":[5006,5019]},"callee":null},"205:13":{"kind":"call","span":{"start":[205,13],"end":[205,45],"bytes":[5050,5082]},"callee":null},"205:31":{"kind":"call","span":{"start":[205,31],"end":[205,44],"bytes":[5068,5081]},"callee":null},"205:62":{"kind":"call","span":{"start":[205,62],"end":[205,80],"bytes":[5099,5117]},"callee":null},"206:11":{"kind":"call","span":{"start":[206,11],"end":[206,76],"bytes":[5130,5195]},"callee":null},"206:57":{"kind":"call","span":{"start":[206,57],"end":[206,70],"bytes":[5176,5189]},"callee":null},"209:3":{"kind":"call","span":{"start":[209,3],"end":[209,81],"bytes":[5203,5281]},"callee":null},"213:11":{"kind":"call","span":{"start":[213,11],"end":[213,20],"bytes":[5372,5381]},"callee":null},"215:13":{"kind":"call","span":{"start":[215,13],"end":[215,49],"bytes":[5435,5471]},"callee":null},"215:66":{"kind":"call","span":{"start":[215,66],"end":[215,84],"bytes":[5488,5506]},"callee":null},"216:11":{"kind":"call","span":{"start":[216,11],"end":[216,76],"bytes":[5519,5584]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll.closure_1","kind":"function","span":{"start":[185,1],"end":[185,44],"bytes":[4606,4649]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll.closure_1","parameters":[],"body":{"185:17":{"kind":"call","span":{"start":[185,17],"end":[185,40],"bytes":[4622,4645]},"callee":null}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[379,1],"end":[399,2],"bytes":[10411,11115]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[379,1],"end":[379,93],"bytes":[10411,10503]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[379,1],"end":[379,93],"bytes":[10411,10503]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"380:8":{"kind":"call","span":{"start":[380,8],"end":[380,44],"bytes":[10511,10547]},"callee":null},"382:21":{"kind":"call","span":{"start":[382,21],"end":[382,32],"bytes":[10569,10580]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"388:15":{"kind":"call","span":{"start":[388,15],"end":[388,85],"bytes":[10655,10725]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"390:3":{"kind":"call","span":{"start":[390,3],"end":[390,127],"bytes":[10729,10853]},"callee":null},"392:13":{"kind":"call","span":{"start":[392,13],"end":[392,40],"bytes":[10867,10894]},"callee":null},"392:57":{"kind":"call","span":{"start":[392,57],"end":[392,75],"bytes":[10911,10929]},"callee":null},"393:11":{"kind":"call","span":{"start":[393,11],"end":[393,75],"bytes":[10942,11006]},"callee":null},"395:3":{"kind":"call","span":{"start":[395,3],"end":[395,81],"bytes":[11013,11091]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles.closure_1","kind":"function","span":{"start":[380,1],"end":[380,44],"bytes":[10504,10547]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles.closure_1","parameters":[],"body":{"380:17":{"kind":"call","span":{"start":[380,17],"end":[380,40],"bytes":[10520,10543]},"callee":null}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.Init":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Init","kind":"method","span":{"start":[104,1],"end":[107,2],"bytes":[2484,2578]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[104,1],"end":[104,58],"bytes":[2484,2541]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"105:12":{"kind":"call","span":{"start":[105,12],"end":[105,23],"bytes":[2553,2564]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","kind":"method","span":{"start":[228,1],"end":[264,2],"bytes":[5950,6935]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[228,1],"end":[228,122],"bytes":[5950,6071]}},{"name":"level","type":"int","span":{"start":[228,1],"end":[228,122],"bytes":[5950,6071]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[228,1],"end":[228,122],"bytes":[5950,6071]}},{"name":"_","type":"bool","span":{"start":[228,1],"end":[228,122],"bytes":[5950,6071]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"229:8":{"kind":"call","span":{"start":[229,8],"end":[229,44],"bytes":[6079,6115]},"callee":null},"231:21":{"kind":"call","span":{"start":[231,21],"end":[231,32],"bytes":[6137,6148]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"236:9":{"kind":"call","span":{"start":[236,9],"end":[236,46],"bytes":[6196,6233]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"237:14":{"kind":"call","span":{"start":[237,14],"end":[237,37],"bytes":[6247,6270]},"callee":null},"238:5":{"kind":"call","span":{"start":[238,5],"end":[238,23],"bytes":[6275,6293]},"callee":null},"239:10":{"kind":"call","span":{"start":[239,10],"end":[239,43],"bytes":[6305,6338]},"callee":null},"245:11":{"kind":"call","span":{"start":[245,11],"end":[245,45],"bytes":[6453,6487]},"callee":null},"245:36":{"kind":"call","span":{"start":[245,36],"end":[245,44],"bytes":[6478,6486]},"callee":null},"247:28":{"kind":"call","span":{"start":[247,28],"end":[247,67],"bytes":[6541,6580]},"callee":null},"247:46":{"kind":"call","span":{"start":[247,46],"end":[247,66],"bytes":[6559,6579]},"callee":null},"247:56":{"kind":"call","span":{"start":[247,56],"end":[247,65],"bytes":[6569,6578]},"callee":null},"254:11":{"kind":"call","span":{"start":[254,11],"end":[260,5],"bytes":[6667,6880]},"callee":null},"258:15":{"kind":"call","span":{"start":[258,15],"end":[258,24],"bytes":[6777,6786]},"callee":null},"259:15":{"kind":"call","span":{"start":[259,15],"end":[259,27],"bytes":[6802,6814]},"callee":null},"263:9":{"kind":"call","span":{"start":[263,9],"end":[263,44],"bytes":[6893,6928]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles.closure_1","kind":"function","span":{"start":[229,1],"end":[229,44],"bytes":[6072,6115]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles.closure_1","parameters":[],"body":{"229:17":{"kind":"call","span":{"start":[229,17],"end":[229,40],"bytes":[6088,6111]},"callee":null}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[350,1],"end":[376,2],"bytes":[9652,10344]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"level","type":"int","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"offset","type":"int64","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"size","type":"int64","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"351:8":{"kind":"call","span":{"start":[351,8],"end":[351,44],"bytes":[9805,9841]},"callee":null},"353:21":{"kind":"call","span":{"start":[353,21],"end":[353,32],"bytes":[9863,9874]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"358:14":{"kind":"call","span":{"start":[358,14],"end":[358,69],"bytes":[9927,9982]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"359:12":{"kind":"call","span":{"start":[359,12],"end":[359,54],"bytes":[9994,10036]},"callee":null},"365:16":{"kind":"call","span":{"start":[365,16],"end":[365,44],"bytes":[10108,10136]},"callee":null},"370:2":{"kind":"call","span":{"start":[370,2],"end":[370,77],"bytes":[10179,10254]},"callee":null},"373:10":{"kind":"call","span":{"start":[373,10],"end":[373,43],"bytes":[10286,10319]},"callee":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser"}},"callables":{"closure_1":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile.closure_1","kind":"function","span":{"start":[351,1],"end":[351,44],"bytes":[9798,9841]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile.closure_1","parameters":[],"body":{"351:17":{"kind":"call","span":{"start":[351,17],"end":[351,40],"bytes":[9814,9837]},"callee":null}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.SetLogger":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.SetLogger","kind":"method","span":{"start":[69,1],"end":[71,2],"bytes":[1438,1544]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[69,1],"end":[69,57],"bytes":[1438,1494]}}],"metrics":{"cyclomatic":1},"body":{"70:13":{"kind":"call","span":{"start":[70,13],"end":[70,48],"bytes":[1507,1542]},"callee":null}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.Type":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Type","kind":"method","span":{"start":[99,1],"end":[101,2],"bytes":[2341,2408]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[267,1],"end":[346,2],"bytes":[6999,9541]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}},{"name":"level","type":"int","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}},{"name":"rd","type":"io.Reader","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"268:8":{"kind":"call","span":{"start":[268,8],"end":[268,44],"bytes":[7150,7186]},"callee":null},"270:21":{"kind":"call","span":{"start":[270,21],"end":[270,32],"bytes":[7208,7219]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"275:14":{"kind":"call","span":{"start":[275,14],"end":[275,69],"bytes":[7272,7327]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"279:15":{"kind":"call","span":{"start":[279,15],"end":[279,37],"bytes":[7438,7460]},"callee":null},"282:17":{"kind":"call","span":{"start":[282,17],"end":[282,42],"bytes":[7516,7541]},"callee":null},"284:15":{"kind":"call","span":{"start":[284,15],"end":[284,71],"bytes":[7573,7629]},"callee":null},"286:15":{"kind":"call","span":{"start":[286,15],"end":[286,44],"bytes":[7647,7676]},"callee":null},"289:16":{"kind":"call","span":{"start":[289,16],"end":[289,40],"bytes":[7745,7769]},"callee":null},"291:12":{"kind":"call","span":{"start":[291,12],"end":[291,51],"bytes":[7782,7821]},"callee":null},"291:32":{"kind":"call","span":{"start":[291,32],"end":[291,50],"bytes":[7802,7820]},"callee":null},"292:15":{"kind":"call","span":{"start":[292,15],"end":[292,104],"bytes":[7850,7939]},"callee":null},"292:80":{"kind":"call","span":{"start":[292,80],"end":[292,98],"bytes":[7915,7933]},"callee":null},"295:17":{"kind":"call","span":{"start":[295,17],"end":[295,90],"bytes":[7960,8033]},"callee":null},"295:55":{"kind":"call","span":{"start":[295,55],"end":[295,66],"bytes":[7998,8009]},"callee":null},"295:68":{"kind":"call","span":{"start":[295,68],"end":[295,78],"bytes":[8011,8021]},"callee":null},"296:12":{"kind":"call","span":{"start":[296,12],"end":[296,80],"bytes":[8045,8113]},"callee":null},"298:15":{"kind":"call","span":{"start":[298,15],"end":[298,91],"bytes":[8145,8221]},"callee":null},"300:8":{"kind":"call","span":{"start":[300,8],"end":[307,5],"bytes":[8232,8342]},"callee":null},"309:12":{"kind":"call","span":{"start":[309,12],"end":[309,34],"bytes":[8355,8377]},"callee":null},"317:14":{"kind":"call","span":{"start":[317,14],"end":[317,58],"bytes":[8646,8690]},"callee":null},"318:13":{"kind":"call","span":{"start":[318,13],"end":[318,21],"bytes":[8709,8717]},"callee":null},"319:16":{"kind":"call","span":{"start":[319,16],"end":[319,91],"bytes":[8747,8822]},"callee":null},"323:12":{"kind":"call","span":{"start":[323,12],"end":[323,21],"bytes":[8842,8851]},"callee":null},"328:12":{"kind":"call","span":{"start":[328,12],"end":[328,65],"bytes":[8908,8961]},"callee":null},"329:15":{"kind":"call","span":{"start":[329,15],"end":[329,70],"bytes":[8990,9045]},"callee":null},"332:12":{"kind":"call","span":{"start":[332,12],"end":[332,52],"bytes":[9061,9101]},"callee":null},"333:15":{"kind":"call","span":{"start":[333,15],"end":[333,108],"bytes":[9130,9223]},"callee":null},"336:2":{"kind":"call","span":{"start":[336,2],"end":[336,77],"bytes":[9229,9304]},"callee":null},"337:2":{"kind":"call","span":{"start":[337,2],"end":[337,77],"bytes":[9312,9387]},"callee":null},"337:82":{"kind":"call","span":{"start":[337,82],"end":[337,92],"bytes":[9392,9402]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_1","kind":"function","span":{"start":[268,1],"end":[268,44],"bytes":[7143,7186]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_1","parameters":[],"body":{"268:17":{"kind":"call","span":{"start":[268,17],"end":[268,40],"bytes":[7159,7182]},"callee":null}}},"closure_2":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_2","kind":"function","span":{"start":[300,1],"end":[307,5],"bytes":[8225,8342]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_2","parameters":[],"body":{"302:8":{"kind":"call","span":{"start":[302,8],"end":[302,17],"bytes":[8264,8273]},"callee":null},"305:8":{"kind":"call","span":{"start":[305,8],"end":[305,38],"bytes":[8303,8333]},"callee":null}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.init":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","kind":"method","span":{"start":[110,1],"end":[181,2],"bytes":[2644,4499]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[110,1],"end":[110,80],"bytes":[2644,2723]}}],"return_type":"(*github.com/pkg/sftp.Client, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"111:2":{"kind":"call","span":{"start":[111,2],"end":[111,13],"bytes":[2725,2736]},"callee":null},"112:8":{"kind":"call","span":{"start":[112,8],"end":[112,21],"bytes":[2744,2757]},"callee":null},"119:15":{"kind":"call","span":{"start":[119,15],"end":[119,47],"bytes":[2849,2881]},"callee":null},"125:30":{"kind":"call","span":{"start":[125,30],"end":[125,71],"bytes":[3013,3054]},"callee":null},"125:53":{"kind":"call","span":{"start":[125,53],"end":[125,70],"bytes":[3036,3053]},"callee":null},"127:16":{"kind":"call","span":{"start":[127,16],"end":[127,65],"bytes":[3088,3137]},"callee":null},"129:13":{"kind":"call","span":{"start":[129,13],"end":[129,37],"bytes":[3154,3178]},"callee":null},"131:3":{"kind":"call","span":{"start":[131,3],"end":[131,58],"bytes":[3191,3246]},"callee":null},"132:13":{"kind":"call","span":{"start":[132,13],"end":[132,40],"bytes":[3259,3286]},"callee":null},"137:20":{"kind":"call","span":{"start":[137,20],"end":[137,45],"bytes":[3394,3419]},"callee":null},"140:17":{"kind":"call","span":{"start":[140,17],"end":[140,62],"bytes":[3463,3508]},"callee":null},"140:37":{"kind":"call","span":{"start":[140,37],"end":[140,61],"bytes":[3483,3507]},"callee":null},"144:15":{"kind":"call","span":{"start":[144,15],"end":[144,37],"bytes":[3549,3571]},"callee":null},"146:16":{"kind":"call","span":{"start":[146,16],"end":[146,70],"bytes":[3605,3659]},"callee":null},"149:18":{"kind":"call","span":{"start":[149,18],"end":[149,42],"bytes":[3682,3706]},"callee":null},"151:16":{"kind":"call","span":{"start":[151,16],"end":[151,71],"bytes":[3740,3795]},"callee":null},"153:17":{"kind":"call","span":{"start":[153,17],"end":[153,60],"bytes":[3816,3859]},"callee":null},"153:37":{"kind":"call","span":{"start":[153,37],"end":[153,59],"bytes":[3836,3858]},"callee":null},"158:18":{"kind":"call","span":{"start":[158,18],"end":[158,43],"bytes":[3937,3962]},"callee":null},"159:10":{"kind":"call","span":{"start":[159,10],"end":[159,40],"bytes":[3986,4016]},"callee":null},"163:24":{"kind":"call","span":{"start":[163,24],"end":[163,53],"bytes":[4065,4094]},"callee":null},"171:10":{"kind":"call","span":{"start":[171,10],"end":[171,54],"bytes":[4284,4328]},"callee":null},"171:23":{"kind":"call","span":{"start":[171,23],"end":[171,53],"bytes":[4297,4327]},"callee":null},"174:25":{"kind":"call","span":{"start":[174,25],"end":[174,61],"bytes":[4357,4393]},"callee":null},"175:3":{"kind":"call","span":{"start":[175,3],"end":[175,22],"bytes":[4410,4429]},"callee":null}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","kind":"method","span":{"start":[417,1],"end":[430,2],"bytes":[11581,11843]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","parameters":[{"name":"err","type":"error","span":{"start":[417,1],"end":[417,54],"bytes":[11581,11634]}}],"metrics":{"cyclomatic":4},"body":{"418:6":{"kind":"call","span":{"start":[418,6],"end":[418,49],"bytes":[11640,11683]},"callee":null},"423:3":{"kind":"call","span":{"start":[423,3],"end":[423,23],"bytes":[11727,11747]},"callee":null},"427:3":{"kind":"call","span":{"start":[427,3],"end":[427,22],"bytes":[11799,11818]},"callee":null}}}},"fields":{"ConcurrentWrites":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/ConcurrentWrites","kind":"field","type":"bool","span":{"start":[57,1],"end":[57,23],"bytes":[1107,1129]}},"DialTimeout":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/DialTimeout","kind":"field","type":"time.Duration","span":{"start":[53,1],"end":[53,27],"bytes":[953,979]}},"Host":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/Host","kind":"field","type":"string","span":{"start":[47,1],"end":[47,20],"bytes":[833,852]}},"HostKey":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/HostKey","kind":"field","type":"string","span":{"start":[52,1],"end":[52,20],"bytes":[933,952]}},"KeyPath":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/KeyPath","kind":"field","type":"string","span":{"start":[51,1],"end":[51,20],"bytes":[913,932]}},"Password":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/Password","kind":"field","type":"string","span":{"start":[49,1],"end":[49,20],"bytes":[873,892]}},"Path":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[50,1],"end":[50,20],"bytes":[893,912]}},"User":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/User","kind":"field","type":"string","span":{"start":[48,1],"end":[48,20],"bytes":[853,872]}},"logger":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[44,1],"end":[44,25],"bytes":[782,806]}},"mu":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[41,1],"end":[41,23],"bytes":[710,732]}},"sftpClient":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/sftpClient","kind":"field","type":"*github.com/pkg/sftp.Client","span":{"start":[43,1],"end":[43,25],"bytes":[757,781]}},"sshClient":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/sshClient","kind":"field","type":"*golang.org/x/crypto/ssh.Client","span":{"start":[42,1],"end":[42,24],"bytes":[733,756]}}}}},"functions":{"github.com/benbjohnson/litestream/sftp.NewReplicaClient":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","kind":"function","span":{"start":[61,1],"end":[67,2],"bytes":[1194,1436]},"signature":"github.com/benbjohnson/litestream/sftp.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/sftp.ReplicaClient","metrics":{"cyclomatic":1},"body":{"63:21":{"kind":"call","span":{"start":[63,21],"end":[63,35],"bytes":[1279,1293]},"callee":null}}},"github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","kind":"function","span":{"start":[76,1],"end":[96,2],"bytes":[1739,2296]},"signature":"github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}},{"name":"host","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}},{"name":"urlPath","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}},{"name":"query","type":"net/url.Values","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"77:12":{"kind":"call","span":{"start":[77,12],"end":[77,30],"bytes":[1887,1905]},"callee":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient"},"81:17":{"kind":"call","span":{"start":[81,17],"end":[81,36],"bytes":[1983,2002]},"callee":null},"82:24":{"kind":"call","span":{"start":[82,24],"end":[82,43],"bytes":[2026,2045]},"callee":null},"89:15":{"kind":"call","span":{"start":[89,15],"end":[89,63],"bytes":[2132,2180]},"callee":null},"92:15":{"kind":"call","span":{"start":[92,15],"end":[92,63],"bytes":[2222,2270]},"callee":null}}},"github.com/benbjohnson/litestream/sftp.init":{"id":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.init","kind":"function","span":{"start":[25,1],"end":[27,2],"bytes":[291,380]},"signature":"github.com/benbjohnson/litestream/sftp.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"26:2":{"kind":"call","span":{"start":[26,2],"end":[26,74],"bytes":[306,378]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}}},"content_hash":"1070af36e0ce6ec261d4c0316e2632daf389405efc6ef1bff59537a1436ec4c5"},"store.go":{"id":"can://go/litestream/store.go","kind":"module","span":{"start":[1,1],"end":[959,1],"bytes":[0,26266]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/promauto\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/errgroup\"\n)\n\nvar (\n\tvalidationChecksCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_validation_checks_total\",\n\t\tHelp: \"Number of replica validation checks by result (success, invalid, or error).\",\n\t}, []string{\"db\", \"level\", \"result\"})\n\n\tlastValidationSuccessGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_last_validation_success\",\n\t\tHelp: \"Whether the last replica validation check succeeded (1) or failed (0). Zero before the first check completes.\",\n\t}, []string{\"db\", \"level\"})\n\n\tlastValidationSuccessTimestampGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_last_validation_success_timestamp_seconds\",\n\t\tHelp: \"Unix time of the last successful replica validation check. Zero until a check succeeds.\",\n\t}, []string{\"db\", \"level\"})\n)\n\nvar (\n\t// ErrNoCompaction is returned when no new files are available from the previous level.\n\tErrNoCompaction = errors.New(\"no compaction\")\n\n\t// ErrCompactionTooEarly is returned when a compaction is attempted too soon\n\t// since the last compaction time. This is used to prevent frequent\n\t// re-compaction when restarting the process.\n\tErrCompactionTooEarly = errors.New(\"compaction too early\")\n\n\t// ErrTxNotAvailable is returned when a transaction does not exist.\n\tErrTxNotAvailable = errors.New(\"transaction not available\")\n\n\t// ErrDBNotReady is a sentinel for errors.Is() compatibility.\n\tErrDBNotReady = \u0026DBNotReadyError{}\n\n\t// ErrShutdownInterrupted is returned when the shutdown sync retry loop\n\t// is interrupted by a done channel signal (e.g., second Ctrl+C).\n\tErrShutdownInterrupted = errors.New(\"shutdown sync interrupted\")\n\n\tErrDatabaseNotFound = errors.New(\"database not found\")\n\tErrDatabaseNotOpen = errors.New(\"database not open\")\n)\n\n// DBNotReadyError is returned when an operation is attempted before the\n// database has been initialized (e.g., page size not yet known).\ntype DBNotReadyError struct {\n\tReason string\n}\n\nfunc (e *DBNotReadyError) Error() string {\n\tif e.Reason != \"\" {\n\t\treturn \"db not ready: \" + e.Reason\n\t}\n\treturn \"db not ready\"\n}\n\nfunc (e *DBNotReadyError) Is(target error) bool {\n\t_, ok := target.(*DBNotReadyError)\n\treturn ok\n}\n\n// Store defaults\nconst (\n\tDefaultSnapshotInterval = 24 * time.Hour\n\tDefaultSnapshotRetention = 24 * time.Hour\n\n\tDefaultRetention = 24 * time.Hour\n\tDefaultRetentionCheckInterval = 1 * time.Hour\n\n\t// DefaultL0Retention is the default time that L0 files are kept around\n\t// after they have been compacted into L1 files.\n\tDefaultL0Retention = 5 * time.Minute\n\t// DefaultL0RetentionCheckInterval controls how frequently L0 retention is\n\t// enforced. This interval should be more frequent than the L1 compaction\n\t// interval so that VFS read replicas have time to observe new files.\n\tDefaultL0RetentionCheckInterval = 15 * time.Second\n\n\t// DefaultHeartbeatCheckInterval controls how frequently the heartbeat\n\t// monitor checks if heartbeat pings should be sent.\n\tDefaultHeartbeatCheckInterval = 15 * time.Second\n\n\t// DefaultDBInitTimeout is the maximum time to wait for a database to be\n\t// initialized (page size known) before logging a warning.\n\tDefaultDBInitTimeout = 30 * time.Second\n)\n\n// Store represents the top-level container for databases.\n//\n// It manages async background tasks like compactions so that the system\n// is not overloaded by too many concurrent tasks.\ntype Store struct {\n\tmu sync.Mutex\n\tdbs []*DB\n\tlevels CompactionLevels\n\n\twg sync.WaitGroup\n\tctx context.Context\n\tcancel func()\n\tdone \u003c-chan struct{}\n\n\t// The frequency of snapshots.\n\tSnapshotInterval time.Duration\n\t// The duration of time that snapshots are kept before being deleted.\n\tSnapshotRetention time.Duration\n\n\t// The duration that L0 files are kept after being compacted into L1.\n\tL0Retention time.Duration\n\t// How often to check for expired L0 files.\n\tL0RetentionCheckInterval time.Duration\n\n\t// If true, compaction is run in the background according to compaction levels.\n\tCompactionMonitorEnabled bool\n\n\t// If true, verify TXID consistency at destination level after each compaction.\n\tVerifyCompaction bool\n\n\t// RetentionEnabled controls whether Litestream actively deletes old files\n\t// during retention enforcement. When false, cloud provider lifecycle\n\t// policies handle retention instead. Local file cleanup still occurs.\n\tRetentionEnabled bool\n\n\t// Shutdown sync retry settings.\n\tShutdownSyncTimeout time.Duration\n\tShutdownSyncInterval time.Duration\n\n\t// How often to check if heartbeat pings should be sent.\n\tHeartbeatCheckInterval time.Duration\n\n\t// Heartbeat client for health check pings. Sends pings only when\n\t// all databases have synced successfully within the heartbeat interval.\n\tHeartbeat *HeartbeatClient\n\n\t// heartbeatMonitorRunning tracks whether the heartbeat monitor goroutine is running.\n\theartbeatMonitorRunning bool\n\n\t// How often to run validation checks. Zero disables periodic validation.\n\tValidationInterval time.Duration\n\n\tLogger *slog.Logger\n}\n\nfunc NewStore(dbs []*DB, levels CompactionLevels) *Store {\n\ts := \u0026Store{\n\t\tdbs: dbs,\n\t\tlevels: levels,\n\n\t\tSnapshotInterval: DefaultSnapshotInterval,\n\t\tSnapshotRetention: DefaultSnapshotRetention,\n\t\tL0Retention: DefaultL0Retention,\n\t\tL0RetentionCheckInterval: DefaultL0RetentionCheckInterval,\n\t\tCompactionMonitorEnabled: true,\n\t\tRetentionEnabled: true,\n\t\tShutdownSyncTimeout: DefaultShutdownSyncTimeout,\n\t\tShutdownSyncInterval: DefaultShutdownSyncInterval,\n\t\tHeartbeatCheckInterval: DefaultHeartbeatCheckInterval,\n\t\tLogger: slog.Default().With(LogKeySystem, LogSystemStore),\n\t}\n\n\tfor _, db := range dbs {\n\t\tdb.SetLogger(s.Logger.With(LogKeyDB, filepath.Base(db.Path())))\n\t\tdb.L0Retention = s.L0Retention\n\t\tdb.ShutdownSyncTimeout = s.ShutdownSyncTimeout\n\t\tdb.ShutdownSyncInterval = s.ShutdownSyncInterval\n\t\tdb.VerifyCompaction = s.VerifyCompaction\n\t\tdb.RetentionEnabled = s.RetentionEnabled\n\t}\n\ts.ctx, s.cancel = context.WithCancel(context.Background())\n\treturn s\n}\n\nfunc (s *Store) Open(ctx context.Context) error {\n\tif err := s.levels.Validate(); err != nil {\n\t\treturn err\n\t}\n\n\tinitGroup, initCtx := errgroup.WithContext(ctx)\n\tinitGroup.SetLimit(50)\n\tfor _, db := range s.dbs {\n\t\tdb := db\n\t\tinitGroup.Go(func() error {\n\t\t\tselect {\n\t\t\tcase \u003c-initCtx.Done():\n\t\t\t\treturn initCtx.Err()\n\t\t\tdefault:\n\t\t\t}\n\n\t\t\tif db.Replica != nil \u0026\u0026 db.Replica.Client != nil {\n\t\t\t\tif err := db.Replica.Client.Init(initCtx); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"initialize replica client for %q: %w\", db.Path(), err)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t}\n\tif err := initGroup.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\topenGroup, openCtx := errgroup.WithContext(ctx)\n\topenGroup.SetLimit(50)\n\tfor _, db := range s.dbs {\n\t\tdb := db\n\t\topenGroup.Go(func() error {\n\t\t\tselect {\n\t\t\tcase \u003c-openCtx.Done():\n\t\t\t\treturn openCtx.Err()\n\t\t\tdefault:\n\t\t\t}\n\t\t\treturn db.Open()\n\t\t})\n\t}\n\tif err := openGroup.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\t// Start monitors for compactions \u0026 snapshots.\n\tif s.CompactionMonitorEnabled {\n\t\t// Start compaction monitors for all levels except L0.\n\t\tfor _, lvl := range s.levels {\n\t\t\tlvl := lvl\n\t\t\tif lvl.Level == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ts.wg.Add(1)\n\t\t\tgo func() {\n\t\t\t\tdefer s.wg.Done()\n\t\t\t\ts.monitorCompactionLevel(s.ctx, lvl)\n\t\t\t}()\n\t\t}\n\n\t\t// Start snapshot monitor for snapshots.\n\t\ts.wg.Add(1)\n\t\tgo func() {\n\t\t\tdefer s.wg.Done()\n\t\t\ts.monitorCompactionLevel(s.ctx, s.SnapshotLevel())\n\t\t}()\n\t}\n\n\tif s.L0Retention \u003e 0 \u0026\u0026 s.L0RetentionCheckInterval \u003e 0 {\n\t\ts.wg.Add(1)\n\t\tgo func() {\n\t\t\tdefer s.wg.Done()\n\t\t\ts.monitorL0Retention(s.ctx)\n\t\t}()\n\t}\n\n\t// Start heartbeat monitor if any database has heartbeat configured.\n\ts.startHeartbeatMonitorIfNeeded()\n\n\t// Start validation monitor if configured.\n\tif s.ValidationInterval \u003e 0 {\n\t\ts.wg.Add(1)\n\t\tgo func() {\n\t\t\tdefer s.wg.Done()\n\t\t\ts.monitorValidation(s.ctx)\n\t\t}()\n\t}\n\n\treturn nil\n}\n\nfunc (s *Store) Close(ctx context.Context) (err error) {\n\t// Stop the compaction, snapshot \u0026 retention monitors before closing the\n\t// databases so no snapshot is still reading a database's file handle.\n\ts.cancel()\n\ts.wg.Wait()\n\n\ts.mu.Lock()\n\tdbs := slices.Clone(s.dbs)\n\ts.mu.Unlock()\n\n\tfor _, db := range dbs {\n\t\tif e := db.Close(ctx); e != nil {\n\t\t\tif errors.Is(e, ErrShutdownInterrupted) {\n\t\t\t\tif err == nil {\n\t\t\t\t\terr = e\n\t\t\t\t}\n\t\t\t} else if err == nil || errors.Is(err, ErrShutdownInterrupted) {\n\t\t\t\terr = e\n\t\t\t}\n\t\t}\n\t}\n\n\treturn err\n}\n\nfunc (s *Store) DBs() []*DB {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\treturn slices.Clone(s.dbs)\n}\n\n// RegisterDB registers a new database with the store and starts monitoring it.\nfunc (s *Store) RegisterDB(db *DB) error {\n\tif db == nil {\n\t\treturn fmt.Errorf(\"db required\")\n\t}\n\n\t// First check: see if database already exists\n\ts.mu.Lock()\n\tfor _, existing := range s.dbs {\n\t\tif existing.Path() == db.Path() {\n\t\t\ts.mu.Unlock()\n\t\t\treturn nil\n\t\t}\n\t}\n\ts.mu.Unlock()\n\n\t// Apply store-wide settings before opening the database.\n\tdb.SetLogger(s.Logger.With(LogKeyDB, filepath.Base(db.Path())))\n\tdb.L0Retention = s.L0Retention\n\tdb.ShutdownSyncTimeout = s.ShutdownSyncTimeout\n\tdb.ShutdownSyncInterval = s.ShutdownSyncInterval\n\tdb.VerifyCompaction = s.VerifyCompaction\n\tdb.RetentionEnabled = s.RetentionEnabled\n\tdb.Done = s.done\n\n\t// Open the database without holding the lock to avoid blocking other operations.\n\t// The double-check pattern below handles the race condition.\n\tif err := db.Open(); err != nil {\n\t\treturn fmt.Errorf(\"open db: %w\", err)\n\t}\n\n\t// Second check: verify database wasn't added by another goroutine while we were opening.\n\t// If it was, close our instance and return without error.\n\ts.mu.Lock()\n\n\tfor _, existing := range s.dbs {\n\t\tif existing.Path() == db.Path() {\n\t\t\t// Another goroutine added this database while we were opening.\n\t\t\t// Release lock before closing to avoid potential deadlock.\n\t\t\ts.mu.Unlock()\n\t\t\tif err := db.Close(context.Background()); err != nil {\n\t\t\t\tdb.Logger.Error(\"close duplicate db\", \"path\", db.Path(), \"error\", err)\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\n\ts.dbs = append(s.dbs, db)\n\ts.mu.Unlock()\n\n\t// Start heartbeat monitor if heartbeat is configured and monitor isn't running.\n\ts.startHeartbeatMonitorIfNeeded()\n\n\treturn nil\n}\n\n// UnregisterDB stops monitoring the database at the provided path and closes it.\nfunc (s *Store) UnregisterDB(ctx context.Context, path string) error {\n\tif path == \"\" {\n\t\treturn fmt.Errorf(\"db path required\")\n\t}\n\n\ts.mu.Lock()\n\n\tidx := -1\n\tvar db *DB\n\tfor i, existing := range s.dbs {\n\t\tif existing.Path() == path {\n\t\t\tidx = i\n\t\t\tdb = existing\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif db == nil {\n\t\ts.mu.Unlock()\n\t\treturn nil\n\t}\n\n\ts.dbs = slices.Delete(s.dbs, idx, idx+1)\n\ts.mu.Unlock()\n\n\tif err := db.Close(ctx); err != nil {\n\t\treturn fmt.Errorf(\"close db: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// EnableDB starts replication for a registered database.\n// The context is checked for cancellation before opening.\n// Note: db.Open() itself does not support cancellation.\nfunc (s *Store) EnableDB(ctx context.Context, path string) error {\n\tdb := s.FindDB(path)\n\tif db == nil {\n\t\treturn fmt.Errorf(\"database not found: %s\", path)\n\t}\n\n\tif db.IsOpen() {\n\t\treturn fmt.Errorf(\"database already enabled: %s\", path)\n\t}\n\n\t// Check for cancellation before starting open\n\tif err := ctx.Err(); err != nil {\n\t\treturn fmt.Errorf(\"enable database: %w\", err)\n\t}\n\n\tif err := db.Open(); err != nil {\n\t\treturn fmt.Errorf(\"open database: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// DisableDB stops replication for a database.\nfunc (s *Store) DisableDB(ctx context.Context, path string) error {\n\tdb := s.FindDB(path)\n\tif db == nil {\n\t\treturn fmt.Errorf(\"database not found: %s\", path)\n\t}\n\n\tif !db.IsOpen() {\n\t\treturn fmt.Errorf(\"database already disabled: %s\", path)\n\t}\n\n\tif err := db.Close(ctx); err != nil {\n\t\treturn fmt.Errorf(\"close database: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// SyncDBResult holds the result of a sync operation.\ntype SyncDBResult struct {\n\tTXID uint64\n\tReplicatedTXID uint64\n\tChanged bool\n}\n\n// SyncDB forces an immediate sync for a database. If wait is true, blocks\n// until both WAL-to-LTX and LTX-to-remote sync complete. If wait is false,\n// only performs the WAL-to-LTX sync and lets the replica monitor handle upload.\n// Lock waits are context-aware: the timeout is honored while waiting for\n// the database sync executor and the replica sync lock.\nfunc (s *Store) SyncDB(ctx context.Context, path string, wait bool) (SyncDBResult, error) {\n\tdb := s.FindDB(path)\n\tif db == nil {\n\t\treturn SyncDBResult{}, fmt.Errorf(\"%w: %s\", ErrDatabaseNotFound, path)\n\t}\n\n\tif !db.IsOpen() {\n\t\treturn SyncDBResult{}, fmt.Errorf(\"%w: %s\", ErrDatabaseNotOpen, path)\n\t}\n\n\t_, beforeTXID, err := db.MaxLTX()\n\tif err != nil {\n\t\treturn SyncDBResult{}, fmt.Errorf(\"read position before sync: %w\", err)\n\t}\n\n\tif wait {\n\t\tif err := db.SyncAndWait(ctx); err != nil {\n\t\t\treturn SyncDBResult{}, fmt.Errorf(\"sync database: %w\", err)\n\t\t}\n\t} else {\n\t\tif err := db.Sync(ctx); err != nil {\n\t\t\treturn SyncDBResult{}, fmt.Errorf(\"sync database: %w\", err)\n\t\t}\n\t}\n\n\t_, afterTXID, err := db.MaxLTX()\n\tif err != nil {\n\t\treturn SyncDBResult{}, fmt.Errorf(\"read position after sync: %w\", err)\n\t}\n\n\tvar replicatedTXID uint64\n\tif db.Replica != nil {\n\t\treplicatedTXID = uint64(db.Replica.Pos().TXID)\n\t}\n\n\treturn SyncDBResult{\n\t\tTXID: uint64(afterTXID),\n\t\tReplicatedTXID: replicatedTXID,\n\t\tChanged: afterTXID \u003e beforeTXID,\n\t}, nil\n}\n\n// FindDB returns the database with the given path.\nfunc (s *Store) FindDB(path string) *DB {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tfor _, db := range s.dbs {\n\t\tif db.Path() == path {\n\t\t\treturn db\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetL0Retention updates the retention window for L0 files and propagates it to\n// all managed databases.\nfunc (s *Store) SetL0Retention(d time.Duration) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.L0Retention = d\n\tfor _, db := range s.dbs {\n\t\tdb.L0Retention = d\n\t}\n}\n\n// SetDone sets the done channel used for interrupt handling during shutdown\n// and propagates it to all managed databases.\nfunc (s *Store) SetDone(done \u003c-chan struct{}) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.done = done\n\tfor _, db := range s.dbs {\n\t\tdb.Done = done\n\t}\n}\n\n// SetShutdownSyncTimeout updates the shutdown sync timeout and propagates it to\n// all managed databases.\nfunc (s *Store) SetShutdownSyncTimeout(d time.Duration) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.ShutdownSyncTimeout = d\n\tfor _, db := range s.dbs {\n\t\tdb.ShutdownSyncTimeout = d\n\t}\n}\n\n// SetShutdownSyncInterval updates the shutdown sync interval and propagates it to\n// all managed databases.\nfunc (s *Store) SetShutdownSyncInterval(d time.Duration) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.ShutdownSyncInterval = d\n\tfor _, db := range s.dbs {\n\t\tdb.ShutdownSyncInterval = d\n\t}\n}\n\n// SetVerifyCompaction updates the verify compaction flag and propagates it to\n// all managed databases.\nfunc (s *Store) SetVerifyCompaction(v bool) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.VerifyCompaction = v\n\tfor _, db := range s.dbs {\n\t\tdb.VerifyCompaction = v\n\t\tdb.compactor.VerifyCompaction = v\n\t}\n}\n\nfunc (s *Store) SetRetentionEnabled(v bool) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.RetentionEnabled = v\n\tfor _, db := range s.dbs {\n\t\tdb.RetentionEnabled = v\n\t\tdb.compactor.RetentionEnabled = v\n\t}\n}\n\n// SnapshotLevel returns a pseudo compaction level based on snapshot settings.\nfunc (s *Store) SnapshotLevel() *CompactionLevel {\n\treturn \u0026CompactionLevel{\n\t\tLevel: SnapshotLevel,\n\t\tInterval: s.SnapshotInterval,\n\t}\n}\n\nfunc (s *Store) monitorCompactionLevel(ctx context.Context, lvl *CompactionLevel) {\n\ts.Logger.Info(\"starting compaction monitor\", \"level\", lvl.Level, \"interval\", lvl.Interval)\n\n\tretryDeadline := time.Time{}\n\ttimer := time.NewTimer(time.Nanosecond)\n\tdefer timer.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn\n\t\tcase \u003c-timer.C:\n\t\t\t// proceed\n\t\t}\n\n\t\tnow := time.Now()\n\t\tnextDelay := time.Until(lvl.NextCompactionAt(now))\n\n\t\tvar notReadyDBs []string\n\n\t\tfor _, db := range s.DBs() {\n\t\t\tif !db.IsOpen() {\n\t\t\t\tcontinue // skip disabled DBs\n\t\t\t}\n\t\t\t_, err := s.CompactDB(ctx, db, lvl)\n\t\t\tswitch {\n\t\t\tcase errors.Is(err, ErrNoCompaction), errors.Is(err, ErrCompactionTooEarly):\n\t\t\t\tdb.Logger.Debug(\"no compaction\", \"level\", lvl.Level, \"path\", db.Path())\n\t\t\tcase errors.Is(err, ErrDBNotReady):\n\t\t\t\tdb.Logger.Debug(\"db not ready, skipping\", \"level\", lvl.Level, \"path\", db.Path(), \"error\", err)\n\t\t\t\tnotReadyDBs = append(notReadyDBs, db.Path())\n\t\t\tcase err != nil \u0026\u0026 !isShutdownError(ctx, err):\n\t\t\t\tdb.Logger.Error(\"compaction failed\", \"level\", lvl.Level, \"error\", err)\n\t\t\t}\n\n\t\t\tif lvl.Level == SnapshotLevel {\n\t\t\t\tif err := s.EnforceSnapshotRetention(ctx, db); err != nil \u0026\u0026 !isShutdownError(ctx, err) {\n\t\t\t\t\tdb.Logger.Error(\"retention enforcement failed\", \"error\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttimedOut := !retryDeadline.IsZero() \u0026\u0026 now.After(retryDeadline)\n\t\tif len(notReadyDBs) \u003e 0 \u0026\u0026 !timedOut {\n\t\t\tif retryDeadline.IsZero() {\n\t\t\t\tretryDeadline = now.Add(DefaultDBInitTimeout)\n\t\t\t}\n\t\t\tnextDelay = time.Second\n\t\t\ts.Logger.Debug(\"scheduling retry for unready dbs\", \"level\", lvl.Level)\n\t\t} else {\n\t\t\tif timedOut {\n\t\t\t\ts.Logger.Warn(\"timeout waiting for db initialization\",\n\t\t\t\t\t\"level\", lvl.Level,\n\t\t\t\t\t\"dbs\", notReadyDBs,\n\t\t\t\t\t\"timeout\", DefaultDBInitTimeout,\n\t\t\t\t\t\"hint\", \"database may have corrupted local state or blocked transactions; try removing -litestream directory and restarting\")\n\t\t\t}\n\t\t\tretryDeadline = time.Time{}\n\t\t}\n\n\t\tif nextDelay \u003c 0 {\n\t\t\tnextDelay = 0\n\t\t}\n\t\ttimer.Reset(nextDelay)\n\t}\n}\n\nfunc (s *Store) monitorL0Retention(ctx context.Context) {\n\ts.Logger.Info(\"starting L0 retention monitor\", \"interval\", s.L0RetentionCheckInterval, \"retention\", s.L0Retention)\n\n\tticker := time.NewTicker(s.L0RetentionCheckInterval)\n\tdefer ticker.Stop()\n\nLOOP:\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\tbreak LOOP\n\t\tcase \u003c-ticker.C:\n\t\t}\n\n\t\tfor _, db := range s.DBs() {\n\t\t\tif !db.IsOpen() {\n\t\t\t\tcontinue // skip disabled DBs\n\t\t\t}\n\t\t\tif err := db.EnforceL0RetentionByTime(ctx); err != nil {\n\t\t\t\tif isShutdownError(ctx, err) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tdb.Logger.Error(\"l0 retention enforcement failed\", \"path\", db.Path(), \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// startHeartbeatMonitorIfNeeded starts the heartbeat monitor goroutine if:\n// - HeartbeatCheckInterval is configured\n// - Heartbeat is configured on the Store\n// - The monitor is not already running\nfunc (s *Store) startHeartbeatMonitorIfNeeded() {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tif s.heartbeatMonitorRunning {\n\t\treturn\n\t}\n\tif s.HeartbeatCheckInterval \u003c= 0 {\n\t\treturn\n\t}\n\tif !s.hasHeartbeatConfigLocked() {\n\t\treturn\n\t}\n\n\ts.heartbeatMonitorRunning = true\n\ts.wg.Add(1)\n\tgo func() {\n\t\tdefer s.wg.Done()\n\t\ts.monitorHeartbeats(s.ctx)\n\t}()\n}\n\n// hasHeartbeatConfigLocked returns true if heartbeat is configured on the Store.\n// Must be called with s.mu held.\nfunc (s *Store) hasHeartbeatConfigLocked() bool {\n\treturn s.Heartbeat != nil \u0026\u0026 s.Heartbeat.URL != \"\"\n}\n\n// monitorHeartbeats periodically checks if heartbeat pings should be sent.\n// Heartbeat pings are only sent when ALL databases have synced successfully\n// within the heartbeat interval.\nfunc (s *Store) monitorHeartbeats(ctx context.Context) {\n\ts.Logger.Info(\"starting heartbeat monitor\", \"interval\", s.HeartbeatCheckInterval)\n\n\tticker := time.NewTicker(s.HeartbeatCheckInterval)\n\tdefer ticker.Stop()\n\nLOOP:\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\tbreak LOOP\n\t\tcase \u003c-ticker.C:\n\t\t}\n\n\t\ts.sendHeartbeatIfNeeded(ctx)\n\t}\n}\n\n// sendHeartbeatIfNeeded sends a heartbeat ping if:\n// - Heartbeat is configured on the Store\n// - Enough time has passed since the last ping attempt\n// - ALL databases have synced successfully within the heartbeat interval\nfunc (s *Store) sendHeartbeatIfNeeded(ctx context.Context) {\n\thb := s.Heartbeat\n\tif hb == nil || hb.URL == \"\" {\n\t\treturn\n\t}\n\n\tif !hb.ShouldPing() {\n\t\treturn\n\t}\n\n\t// Check if all databases are healthy (synced within the heartbeat interval).\n\t// A database is healthy if it synced within the heartbeat interval.\n\thealthySince := time.Now().Add(-hb.Interval)\n\tif !s.allDatabasesHealthy(healthySince) {\n\t\treturn\n\t}\n\n\t// Record ping attempt time before making the request to ensure we respect\n\t// the configured interval even if the ping fails. This prevents rapid\n\t// retries that could overwhelm the endpoint.\n\thb.RecordPing()\n\n\tif err := hb.Ping(ctx); err != nil {\n\t\ts.Logger.Error(\"heartbeat ping failed\", \"url\", hb.URL, \"error\", err)\n\t\treturn\n\t}\n\n\ts.Logger.Debug(\"heartbeat ping sent\", \"url\", hb.URL)\n}\n\n// allDatabasesHealthy returns true if all databases have synced successfully\n// since the given time. Returns false if there are no databases or no enabled databases.\nfunc (s *Store) allDatabasesHealthy(since time.Time) bool {\n\tdbs := s.DBs()\n\tif len(dbs) == 0 {\n\t\treturn false\n\t}\n\n\tenabledCount := 0\n\tfor _, db := range dbs {\n\t\tif !db.IsOpen() {\n\t\t\tcontinue // skip disabled DBs\n\t\t}\n\t\tenabledCount++\n\t\tlastSync := db.LastSuccessfulSyncAt()\n\t\tif lastSync.IsZero() || lastSync.Before(since) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn enabledCount \u003e 0\n}\n\n// CompactDB performs a compaction or snapshot for a given database on a single destination level.\n// This function will only proceed if a compaction has not occurred before the last compaction time.\nfunc (s *Store) CompactDB(ctx context.Context, db *DB, lvl *CompactionLevel) (*ltx.FileInfo, error) {\n\t// Skip if database is not yet initialized (page size unknown).\n\tif db.PageSize() == 0 {\n\t\treturn nil, \u0026DBNotReadyError{Reason: \"page size not initialized\"}\n\t}\n\n\tdstLevel := lvl.Level\n\n\t// Ensure we are not re-compacting before the most recent compaction time.\n\tprevCompactionAt := lvl.PrevCompactionAt(time.Now())\n\tdstInfo, err := db.MaxLTXFileInfo(ctx, dstLevel)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fetch dst level info: %w\", err)\n\t} else if dstInfo.CreatedAt.After(prevCompactionAt) {\n\t\treturn nil, ErrCompactionTooEarly\n\t}\n\n\t// Shortcut if this is a snapshot since we are not pulling from a previous level.\n\tif dstLevel == SnapshotLevel {\n\t\tpos, err := db.Pos()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"fetch db position: %w\", err)\n\t\t}\n\t\tif dstInfo.MaxTXID != 0 \u0026\u0026 dstInfo.MaxTXID \u003e= pos.TXID {\n\t\t\treturn nil, ErrNoCompaction\n\t\t}\n\n\t\tinfo, err := db.Snapshot(ctx)\n\t\tif err != nil {\n\t\t\treturn info, err\n\t\t}\n\t\tdb.Logger.InfoContext(ctx, \"snapshot complete\", \"txid\", info.MaxTXID.String(), \"size\", info.Size)\n\t\treturn info, nil\n\t}\n\n\t// Fetch latest LTX files for both the source \u0026 destination so we can see if we need to make progress.\n\tsrcLevel := s.levels.PrevLevel(dstLevel)\n\tsrcInfo, err := db.MaxLTXFileInfo(ctx, srcLevel)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fetch src level info: %w\", err)\n\t}\n\n\t// Skip if there are no new files to compact.\n\tif srcInfo.MaxTXID \u003c= dstInfo.MaxTXID {\n\t\treturn nil, ErrNoCompaction\n\t}\n\n\tinfo, err := db.Compact(ctx, dstLevel)\n\tif err != nil {\n\t\treturn info, err\n\t}\n\n\tdb.Logger.InfoContext(ctx, \"compaction complete\",\n\t\t\"level\", dstLevel,\n\t\tslog.Group(\"txid\",\n\t\t\t\"min\", info.MinTXID.String(),\n\t\t\t\"max\", info.MaxTXID.String(),\n\t\t),\n\t\t\"size\", info.Size,\n\t)\n\n\treturn info, nil\n}\n\n// EnforceSnapshotRetention removes old snapshots by timestamp and then\n// cleans up all lower levels based on minimum snapshot TXID.\nfunc (s *Store) EnforceSnapshotRetention(ctx context.Context, db *DB) error {\n\t// Enforce retention for the snapshot level.\n\tminSnapshotTXID, err := db.EnforceSnapshotRetention(ctx, time.Now().Add(-s.SnapshotRetention))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"enforce snapshot retention: %w\", err)\n\t}\n\n\t// We should also enforce retention for L0 on the same schedule as L1.\n\tfor _, lvl := range s.levels {\n\t\t// Skip L0 since it is enforced on a more frequent basis.\n\t\tif lvl.Level == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := db.EnforceRetentionByTXID(ctx, lvl.Level, minSnapshotTXID); err != nil {\n\t\t\treturn fmt.Errorf(\"enforce L%d retention: %w\", lvl.Level, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// ValidationResult holds the result of validating a replica's LTX files.\ntype ValidationResult struct {\n\tValid bool // true if no errors found\n\tErrors []ValidationError // all errors found\n}\n\n// Validate checks LTX file consistency across all databases and levels.\n// SnapshotLevel (9) is excluded since snapshots are not contiguous.\nfunc (s *Store) Validate(ctx context.Context) (*ValidationResult, error) {\n\tresult := \u0026ValidationResult{Valid: true}\n\n\ts.mu.Lock()\n\tdbs := s.dbs\n\tlevels := s.levels\n\ts.mu.Unlock()\n\n\tfor _, db := range dbs {\n\t\tif db.Replica == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, lvl := range levels {\n\t\t\tlevel := strconv.Itoa(lvl.Level)\n\t\t\tlastSuccess := lastValidationSuccessTimestampGaugeVec.WithLabelValues(db.Path(), level)\n\t\t\tsuccess := lastValidationSuccessGaugeVec.WithLabelValues(db.Path(), level)\n\t\t\terrs, err := db.Replica.ValidateLevel(ctx, lvl.Level)\n\t\t\tif err != nil {\n\t\t\t\tvalidationChecksCounterVec.WithLabelValues(db.Path(), level, \"error\").Inc()\n\t\t\t\tsuccess.Set(0)\n\t\t\t\treturn nil, fmt.Errorf(\"validate level %d for %s: %w\", lvl.Level, db.Path(), err)\n\t\t\t}\n\t\t\tif len(errs) \u003e 0 {\n\t\t\t\tvalidationChecksCounterVec.WithLabelValues(db.Path(), level, \"invalid\").Inc()\n\t\t\t\tsuccess.Set(0)\n\t\t\t\tresult.Valid = false\n\t\t\t\tresult.Errors = append(result.Errors, errs...)\n\t\t\t} else {\n\t\t\t\tvalidationChecksCounterVec.WithLabelValues(db.Path(), level, \"success\").Inc()\n\t\t\t\tsuccess.Set(1)\n\t\t\t\tlastSuccess.SetToCurrentTime()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result, nil\n}\n\n// monitorValidation periodically runs validation checks on all databases.\nfunc (s *Store) monitorValidation(ctx context.Context) {\n\ts.Logger.Info(\"starting validation monitor\", \"interval\", s.ValidationInterval)\n\n\tticker := time.NewTicker(s.ValidationInterval)\n\tdefer ticker.Stop()\n\nLOOP:\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\tbreak LOOP\n\t\tcase \u003c-ticker.C:\n\t\t}\n\n\t\tresult, err := s.Validate(ctx)\n\t\tif err != nil {\n\t\t\tif isShutdownError(ctx, err) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts.Logger.Error(\"validation check failed\", \"error\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !result.Valid {\n\t\t\tfor _, verr := range result.Errors {\n\t\t\t\ts.Logger.Warn(\"validation error detected\",\n\t\t\t\t\t\"level\", verr.Level,\n\t\t\t\t\t\"type\", verr.Type,\n\t\t\t\t\t\"message\", verr.Message,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[40,49]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[50,56]}},{"name":"slog","path":"log/slog","span":{"start":[7,1],"end":[7,12],"bytes":[57,68]}},{"name":"filepath","path":"path/filepath","span":{"start":[8,1],"end":[8,17],"bytes":[69,85]}},{"name":"slices","path":"slices","span":{"start":[9,1],"end":[9,10],"bytes":[86,95]}},{"name":"strconv","path":"strconv","span":{"start":[10,1],"end":[10,11],"bytes":[96,106]}},{"name":"sync","path":"sync","span":{"start":[11,1],"end":[11,8],"bytes":[107,114]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[115,122]}},{"name":"prometheus","path":"github.com/prometheus/client_golang/prometheus","span":{"start":[14,1],"end":[14,50],"bytes":[124,173]}},{"name":"promauto","path":"github.com/prometheus/client_golang/prometheus/promauto","span":{"start":[15,1],"end":[15,59],"bytes":[174,232]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[16,1],"end":[16,27],"bytes":[233,259]}},{"name":"errgroup","path":"golang.org/x/sync/errgroup","span":{"start":[17,1],"end":[17,30],"bytes":[260,289]}}],"types":{"DBNotReadyError":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.DBNotReadyError","kind":"struct","span":{"start":[62,1],"end":[64,2],"bytes":[2191,2237]},"callables":{"github.com/benbjohnson/litestream.DBNotReadyError.Error":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.DBNotReadyError/github.com/benbjohnson/litestream.DBNotReadyError.Error","kind":"method","span":{"start":[66,1],"end":[71,2],"bytes":[2239,2367]},"signature":"github.com/benbjohnson/litestream.DBNotReadyError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{}},"github.com/benbjohnson/litestream.DBNotReadyError.Is":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.DBNotReadyError/github.com/benbjohnson/litestream.DBNotReadyError.Is","kind":"method","span":{"start":[73,1],"end":[76,2],"bytes":[2369,2467]},"signature":"github.com/benbjohnson/litestream.DBNotReadyError.Is","parameters":[{"name":"target","type":"error","span":{"start":[73,1],"end":[73,50],"bytes":[2369,2418]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{}}},"fields":{"Reason":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.DBNotReadyError/Reason","kind":"field","type":"string","span":{"start":[63,1],"end":[63,15],"bytes":[2221,2235]}}}},"Store":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store","kind":"struct","span":{"start":[107,1],"end":[156,2],"bytes":[3655,5259]},"callables":{"github.com/benbjohnson/litestream.Store.Close":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","kind":"method","span":{"start":[279,1],"end":[302,2],"bytes":[8144,8682]},"signature":"github.com/benbjohnson/litestream.Store.Close","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[279,1],"end":[279,57],"bytes":[8144,8200]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"282:2":{"kind":"call","span":{"start":[282,2],"end":[282,12],"bytes":[8348,8358]},"callee":null},"283:2":{"kind":"call","span":{"start":[283,2],"end":[283,13],"bytes":[8360,8371]},"callee":null},"285:2":{"kind":"call","span":{"start":[285,2],"end":[285,13],"bytes":[8374,8385]},"callee":null},"286:9":{"kind":"call","span":{"start":[286,9],"end":[286,28],"bytes":[8394,8413]},"callee":null},"287:2":{"kind":"call","span":{"start":[287,2],"end":[287,15],"bytes":[8415,8428]},"callee":null},"290:11":{"kind":"call","span":{"start":[290,11],"end":[290,24],"bytes":[8466,8479]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"291:7":{"kind":"call","span":{"start":[291,7],"end":[291,43],"bytes":[8498,8534]},"callee":null},"295:28":{"kind":"call","span":{"start":[295,28],"end":[295,66],"bytes":[8603,8641]},"callee":null}}},"github.com/benbjohnson/litestream.Store.CompactDB":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","kind":"method","span":{"start":[789,1],"end":[851,2],"bytes":[21386,23217]},"signature":"github.com/benbjohnson/litestream.Store.CompactDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[789,1],"end":[789,102],"bytes":[21386,21487]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[789,1],"end":[789,102],"bytes":[21386,21487]}},{"name":"lvl","type":"*github.com/benbjohnson/litestream.CompactionLevel","span":{"start":[789,1],"end":[789,102],"bytes":[21386,21487]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"791:5":{"kind":"call","span":{"start":[791,5],"end":[791,18],"bytes":[21557,21570]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize"},"798:22":{"kind":"call","span":{"start":[798,22],"end":[798,54],"bytes":[21771,21803]},"callee":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt"},"798:43":{"kind":"call","span":{"start":[798,43],"end":[798,53],"bytes":[21792,21802]},"callee":null},"799:18":{"kind":"call","span":{"start":[799,18],"end":[799,50],"bytes":[21821,21853]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo"},"801:15":{"kind":"call","span":{"start":[801,15],"end":[801,58],"bytes":[21885,21928]},"callee":null},"802:12":{"kind":"call","span":{"start":[802,12],"end":[802,53],"bytes":[21940,21981]},"callee":null},"808:15":{"kind":"call","span":{"start":[808,15],"end":[808,23],"bytes":[22153,22161]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"810:16":{"kind":"call","span":{"start":[810,16],"end":[810,56],"bytes":[22195,22235]},"callee":null},"816:16":{"kind":"call","span":{"start":[816,16],"end":[816,32],"bytes":[22350,22366]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot"},"820:3":{"kind":"call","span":{"start":[820,3],"end":[820,100],"bytes":[22411,22508]},"callee":null},"820:59":{"kind":"call","span":{"start":[820,59],"end":[820,80],"bytes":[22467,22488]},"callee":null},"825:14":{"kind":"call","span":{"start":[825,14],"end":[825,42],"bytes":[22649,22677]},"callee":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel"},"826:18":{"kind":"call","span":{"start":[826,18],"end":[826,50],"bytes":[22695,22727]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo"},"828:15":{"kind":"call","span":{"start":[828,15],"end":[828,58],"bytes":[22759,22802]},"callee":null},"836:15":{"kind":"call","span":{"start":[836,15],"end":[836,40],"bytes":[22943,22968]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact"},"841:2":{"kind":"call","span":{"start":[841,2],"end":[848,3],"bytes":[23010,23196]},"callee":null},"843:3":{"kind":"call","span":{"start":[843,3],"end":[846,4],"bytes":[23083,23171]},"callee":null},"844:11":{"kind":"call","span":{"start":[844,11],"end":[844,32],"bytes":[23112,23133]},"callee":null},"845:11":{"kind":"call","span":{"start":[845,11],"end":[845,32],"bytes":[23145,23166]},"callee":null}}},"github.com/benbjohnson/litestream.Store.DBs":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","kind":"method","span":{"start":[304,1],"end":[308,2],"bytes":[8684,8777]},"signature":"github.com/benbjohnson/litestream.Store.DBs","parameters":[],"return_type":"[]*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":1},"body":{"305:2":{"kind":"call","span":{"start":[305,2],"end":[305,13],"bytes":[8715,8726]},"callee":null},"306:8":{"kind":"call","span":{"start":[306,8],"end":[306,21],"bytes":[8734,8747]},"callee":null},"307:9":{"kind":"call","span":{"start":[307,9],"end":[307,28],"bytes":[8756,8775]},"callee":null}}},"github.com/benbjohnson/litestream.Store.DisableDB":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","kind":"method","span":{"start":[425,1],"end":[440,2],"bytes":[11706,12053]},"signature":"github.com/benbjohnson/litestream.Store.DisableDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[425,1],"end":[425,68],"bytes":[11706,11773]}},{"name":"path","type":"string","span":{"start":[425,1],"end":[425,68],"bytes":[11706,11773]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"426:8":{"kind":"call","span":{"start":[426,8],"end":[426,22],"bytes":[11781,11795]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"428:10":{"kind":"call","span":{"start":[428,10],"end":[428,52],"bytes":[11821,11863]},"callee":null},"431:6":{"kind":"call","span":{"start":[431,6],"end":[431,17],"bytes":[11873,11884]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"432:10":{"kind":"call","span":{"start":[432,10],"end":[432,59],"bytes":[11896,11945]},"callee":null},"435:12":{"kind":"call","span":{"start":[435,12],"end":[435,25],"bytes":[11961,11974]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"436:10":{"kind":"call","span":{"start":[436,10],"end":[436,47],"bytes":[11998,12035]},"callee":null}}},"github.com/benbjohnson/litestream.Store.EnableDB":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","kind":"method","span":{"start":[402,1],"end":[422,2],"bytes":[11183,11657]},"signature":"github.com/benbjohnson/litestream.Store.EnableDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[402,1],"end":[402,67],"bytes":[11183,11249]}},{"name":"path","type":"string","span":{"start":[402,1],"end":[402,67],"bytes":[11183,11249]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"403:8":{"kind":"call","span":{"start":[403,8],"end":[403,22],"bytes":[11257,11271]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"405:10":{"kind":"call","span":{"start":[405,10],"end":[405,52],"bytes":[11297,11339]},"callee":null},"408:5":{"kind":"call","span":{"start":[408,5],"end":[408,16],"bytes":[11348,11359]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"409:10":{"kind":"call","span":{"start":[409,10],"end":[409,58],"bytes":[11371,11419]},"callee":null},"413:12":{"kind":"call","span":{"start":[413,12],"end":[413,21],"bytes":[11483,11492]},"callee":null},"414:10":{"kind":"call","span":{"start":[414,10],"end":[414,48],"bytes":[11516,11554]},"callee":null},"417:12":{"kind":"call","span":{"start":[417,12],"end":[417,21],"bytes":[11570,11579]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open"},"418:10":{"kind":"call","span":{"start":[418,10],"end":[418,46],"bytes":[11603,11639]},"callee":null}}},"github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","kind":"method","span":{"start":[855,1],"end":[875,2],"bytes":[23353,24028]},"signature":"github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[855,1],"end":[855,78],"bytes":[23353,23430]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[855,1],"end":[855,78],"bytes":[23353,23430]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"857:26":{"kind":"call","span":{"start":[857,26],"end":[857,96],"bytes":[23502,23572]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention"},"857:59":{"kind":"call","span":{"start":[857,59],"end":[857,69],"bytes":[23535,23545]},"callee":null},"859:10":{"kind":"call","span":{"start":[859,10],"end":[859,59],"bytes":[23599,23648]},"callee":null},"869:13":{"kind":"call","span":{"start":[869,13],"end":[869,71],"bytes":[23868,23926]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID"},"870:11":{"kind":"call","span":{"start":[870,11],"end":[870,66],"bytes":[23951,24006]},"callee":null}}},"github.com/benbjohnson/litestream.Store.FindDB":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","kind":"method","span":{"start":[497,1],"end":[507,2],"bytes":[13675,13838]},"signature":"github.com/benbjohnson/litestream.Store.FindDB","parameters":[{"name":"path","type":"string","span":{"start":[497,1],"end":[497,42],"bytes":[13675,13716]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":3},"body":{"498:2":{"kind":"call","span":{"start":[498,2],"end":[498,13],"bytes":[13718,13729]},"callee":null},"499:8":{"kind":"call","span":{"start":[499,8],"end":[499,21],"bytes":[13737,13750]},"callee":null},"502:6":{"kind":"call","span":{"start":[502,6],"end":[502,15],"bytes":[13785,13794]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream.Store.Open":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","kind":"method","span":{"start":[187,1],"end":[277,2],"bytes":[6294,8142]},"signature":"github.com/benbjohnson/litestream.Store.Open","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[187,1],"end":[187,50],"bytes":[6294,6343]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":19},"body":{"188:12":{"kind":"call","span":{"start":[188,12],"end":[188,31],"bytes":[6355,6374]},"callee":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate"},"192:24":{"kind":"call","span":{"start":[192,24],"end":[192,49],"bytes":[6429,6454]},"callee":null},"193:2":{"kind":"call","span":{"start":[193,2],"end":[193,24],"bytes":[6456,6478]},"callee":null},"196:3":{"kind":"call","span":{"start":[196,3],"end":[209,5],"bytes":[6520,6851]},"callee":null},"211:12":{"kind":"call","span":{"start":[211,12],"end":[211,28],"bytes":[6866,6882]},"callee":null},"215:24":{"kind":"call","span":{"start":[215,24],"end":[215,49],"bytes":[6937,6962]},"callee":null},"216:2":{"kind":"call","span":{"start":[216,2],"end":[216,24],"bytes":[6964,6986]},"callee":null},"219:3":{"kind":"call","span":{"start":[219,3],"end":[226,5],"bytes":[7028,7160]},"callee":null},"228:12":{"kind":"call","span":{"start":[228,12],"end":[228,28],"bytes":[7175,7191]},"callee":null},"241:4":{"kind":"call","span":{"start":[241,4],"end":[241,15],"bytes":[7453,7464]},"callee":null},"242:7":{"kind":"call","span":{"start":[242,7],"end":[245,7],"bytes":[7471,7549]},"callee":null,"is_goroutine":true},"249:3":{"kind":"call","span":{"start":[249,3],"end":[249,14],"bytes":[7600,7611]},"callee":null},"250:6":{"kind":"call","span":{"start":[250,6],"end":[253,6],"bytes":[7617,7706]},"callee":null,"is_goroutine":true},"257:3":{"kind":"call","span":{"start":[257,3],"end":[257,14],"bytes":[7771,7782]},"callee":null},"258:6":{"kind":"call","span":{"start":[258,6],"end":[261,6],"bytes":[7788,7854]},"callee":null,"is_goroutine":true},"265:2":{"kind":"call","span":{"start":[265,2],"end":[265,35],"bytes":[7930,7963]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded"},"269:3":{"kind":"call","span":{"start":[269,3],"end":[269,14],"bytes":[8042,8053]},"callee":null},"270:6":{"kind":"call","span":{"start":[270,6],"end":[273,6],"bytes":[8059,8124]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1","kind":"function","span":{"start":[196,1],"end":[209,5],"bytes":[6518,6851]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_1","parameters":[],"return_type":"error","error_channel":["error"],"body":{"198:11":{"kind":"call","span":{"start":[198,11],"end":[198,25],"bytes":[6570,6584]},"callee":null},"199:12":{"kind":"call","span":{"start":[199,12],"end":[199,25],"bytes":[6597,6610]},"callee":null},"204:15":{"kind":"call","span":{"start":[204,15],"end":[204,46],"bytes":[6697,6728]},"callee":null},"205:13":{"kind":"call","span":{"start":[205,13],"end":[205,79],"bytes":[6755,6821]},"callee":null},"205:64":{"kind":"call","span":{"start":[205,64],"end":[205,73],"bytes":[6806,6815]},"callee":null}}},"closure_2":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_2","kind":"function","span":{"start":[219,1],"end":[226,5],"bytes":[7026,7160]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_2","parameters":[],"return_type":"error","error_channel":["error"],"body":{"221:11":{"kind":"call","span":{"start":[221,11],"end":[221,25],"bytes":[7078,7092]},"callee":null},"222:12":{"kind":"call","span":{"start":[222,12],"end":[222,25],"bytes":[7105,7118]},"callee":null},"225:11":{"kind":"call","span":{"start":[225,11],"end":[225,20],"bytes":[7146,7155]},"callee":null}}},"closure_3":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_3","kind":"function","span":{"start":[242,1],"end":[245,7],"bytes":[7465,7549]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_3","parameters":[],"body":{"243:11":{"kind":"call","span":{"start":[243,11],"end":[243,22],"bytes":[7490,7501]},"callee":null},"244:5":{"kind":"call","span":{"start":[244,5],"end":[244,41],"bytes":[7506,7542]},"callee":null}}},"closure_4":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_4","kind":"function","span":{"start":[250,1],"end":[253,6],"bytes":[7612,7706]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_4","parameters":[],"body":{"251:10":{"kind":"call","span":{"start":[251,10],"end":[251,21],"bytes":[7635,7646]},"callee":null},"252:36":{"kind":"call","span":{"start":[252,36],"end":[252,53],"bytes":[7682,7699]},"callee":null},"252:4":{"kind":"call","span":{"start":[252,4],"end":[252,54],"bytes":[7650,7700]},"callee":null}}},"closure_5":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_5","kind":"function","span":{"start":[258,1],"end":[261,6],"bytes":[7783,7854]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_5","parameters":[],"body":{"259:10":{"kind":"call","span":{"start":[259,10],"end":[259,21],"bytes":[7806,7817]},"callee":null},"260:4":{"kind":"call","span":{"start":[260,4],"end":[260,31],"bytes":[7821,7848]},"callee":null}}},"closure_6":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_6","kind":"function","span":{"start":[270,1],"end":[273,6],"bytes":[8054,8124]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_6","parameters":[],"body":{"271:10":{"kind":"call","span":{"start":[271,10],"end":[271,21],"bytes":[8077,8088]},"callee":null},"272:4":{"kind":"call","span":{"start":[272,4],"end":[272,30],"bytes":[8092,8118]},"callee":null}}}}},"github.com/benbjohnson/litestream.Store.RegisterDB":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","kind":"method","span":{"start":[311,1],"end":[364,2],"bytes":[8859,10440]},"signature":"github.com/benbjohnson/litestream.Store.RegisterDB","parameters":[{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[311,1],"end":[311,43],"bytes":[8859,8901]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"313:10":{"kind":"call","span":{"start":[313,10],"end":[313,35],"bytes":[8927,8952]},"callee":null},"317:2":{"kind":"call","span":{"start":[317,2],"end":[317,13],"bytes":[9006,9017]},"callee":null},"319:25":{"kind":"call","span":{"start":[319,25],"end":[319,34],"bytes":[9076,9085]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"319:6":{"kind":"call","span":{"start":[319,6],"end":[319,21],"bytes":[9057,9072]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"320:4":{"kind":"call","span":{"start":[320,4],"end":[320,17],"bytes":[9091,9104]},"callee":null},"324:2":{"kind":"call","span":{"start":[324,2],"end":[324,15],"bytes":[9127,9140]},"callee":null},"327:15":{"kind":"call","span":{"start":[327,15],"end":[327,64],"bytes":[9215,9264]},"callee":null},"327:2":{"kind":"call","span":{"start":[327,2],"end":[327,65],"bytes":[9202,9265]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger"},"327:39":{"kind":"call","span":{"start":[327,39],"end":[327,63],"bytes":[9239,9263]},"callee":null},"327:53":{"kind":"call","span":{"start":[327,53],"end":[327,62],"bytes":[9253,9262]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"337:12":{"kind":"call","span":{"start":[337,12],"end":[337,21],"bytes":[9656,9665]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"338:10":{"kind":"call","span":{"start":[338,10],"end":[338,40],"bytes":[9689,9719]},"callee":null},"343:2":{"kind":"call","span":{"start":[343,2],"end":[343,13],"bytes":[9876,9887]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON"},"346:25":{"kind":"call","span":{"start":[346,25],"end":[346,34],"bytes":[9947,9956]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"346:6":{"kind":"call","span":{"start":[346,6],"end":[346,21],"bytes":[9928,9943]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"349:4":{"kind":"call","span":{"start":[349,4],"end":[349,17],"bytes":[10092,10105]},"callee":null},"350:14":{"kind":"call","span":{"start":[350,14],"end":[350,44],"bytes":[10119,10149]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"350:23":{"kind":"call","span":{"start":[350,23],"end":[350,43],"bytes":[10128,10148]},"callee":null},"351:5":{"kind":"call","span":{"start":[351,5],"end":[351,75],"bytes":[10168,10238]},"callee":null},"351:51":{"kind":"call","span":{"start":[351,51],"end":[351,60],"bytes":[10214,10223]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"357:10":{"kind":"call","span":{"start":[357,10],"end":[357,27],"bytes":[10275,10292]},"callee":null},"358:2":{"kind":"call","span":{"start":[358,2],"end":[358,15],"bytes":[10294,10307]},"callee":null},"361:2":{"kind":"call","span":{"start":[361,2],"end":[361,35],"bytes":[10392,10425]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded"}}},"github.com/benbjohnson/litestream.Store.SetDone":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone","kind":"method","span":{"start":[522,1],"end":[529,2],"bytes":[14229,14375]},"signature":"github.com/benbjohnson/litestream.Store.SetDone","parameters":[{"name":"done","type":"\u003c-chan struct{}","span":{"start":[522,1],"end":[522,48],"bytes":[14229,14276]}}],"metrics":{"cyclomatic":2},"body":{"523:2":{"kind":"call","span":{"start":[523,2],"end":[523,13],"bytes":[14278,14289]},"callee":null},"524:8":{"kind":"call","span":{"start":[524,8],"end":[524,21],"bytes":[14297,14310]},"callee":null}}},"github.com/benbjohnson/litestream.Store.SetL0Retention":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention","kind":"method","span":{"start":[511,1],"end":[518,2],"bytes":[13947,14103]},"signature":"github.com/benbjohnson/litestream.Store.SetL0Retention","parameters":[{"name":"d","type":"time.Duration","span":{"start":[511,1],"end":[511,50],"bytes":[13947,13996]}}],"metrics":{"cyclomatic":2},"body":{"512:2":{"kind":"call","span":{"start":[512,2],"end":[512,13],"bytes":[13998,14009]},"callee":null},"513:8":{"kind":"call","span":{"start":[513,8],"end":[513,21],"bytes":[14017,14030]},"callee":null}}},"github.com/benbjohnson/litestream.Store.SetRetentionEnabled":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetRetentionEnabled","kind":"method","span":{"start":[565,1],"end":[573,2],"bytes":[15265,15463]},"signature":"github.com/benbjohnson/litestream.Store.SetRetentionEnabled","parameters":[{"name":"v","type":"bool","span":{"start":[565,1],"end":[565,46],"bytes":[15265,15310]}}],"metrics":{"cyclomatic":2},"body":{"566:2":{"kind":"call","span":{"start":[566,2],"end":[566,13],"bytes":[15312,15323]},"callee":null},"567:8":{"kind":"call","span":{"start":[567,8],"end":[567,21],"bytes":[15331,15344]},"callee":null}}},"github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval","kind":"method","span":{"start":[544,1],"end":[551,2],"bytes":[14775,14958]},"signature":"github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval","parameters":[{"name":"d","type":"time.Duration","span":{"start":[544,1],"end":[544,59],"bytes":[14775,14833]}}],"metrics":{"cyclomatic":2},"body":{"545:2":{"kind":"call","span":{"start":[545,2],"end":[545,13],"bytes":[14835,14846]},"callee":null},"546:8":{"kind":"call","span":{"start":[546,8],"end":[546,21],"bytes":[14854,14867]},"callee":null}}},"github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout","kind":"method","span":{"start":[533,1],"end":[540,2],"bytes":[14484,14664]},"signature":"github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout","parameters":[{"name":"d","type":"time.Duration","span":{"start":[533,1],"end":[533,58],"bytes":[14484,14541]}}],"metrics":{"cyclomatic":2},"body":{"534:2":{"kind":"call","span":{"start":[534,2],"end":[534,13],"bytes":[14543,14554]},"callee":null},"535:8":{"kind":"call","span":{"start":[535,8],"end":[535,21],"bytes":[14562,14575]},"callee":null}}},"github.com/benbjohnson/litestream.Store.SetVerifyCompaction":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction","kind":"method","span":{"start":[555,1],"end":[563,2],"bytes":[15065,15263]},"signature":"github.com/benbjohnson/litestream.Store.SetVerifyCompaction","parameters":[{"name":"v","type":"bool","span":{"start":[555,1],"end":[555,46],"bytes":[15065,15110]}}],"metrics":{"cyclomatic":2},"body":{"556:2":{"kind":"call","span":{"start":[556,2],"end":[556,13],"bytes":[15112,15123]},"callee":null},"557:8":{"kind":"call","span":{"start":[557,8],"end":[557,21],"bytes":[15131,15144]},"callee":null}}},"github.com/benbjohnson/litestream.Store.SnapshotLevel":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SnapshotLevel","kind":"method","span":{"start":[576,1],"end":[581,2],"bytes":[15544,15684]},"signature":"github.com/benbjohnson/litestream.Store.SnapshotLevel","parameters":[],"return_type":"*github.com/benbjohnson/litestream.CompactionLevel","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.Store.SyncDB":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","kind":"method","span":{"start":[454,1],"end":[494,2],"bytes":[12569,13621]},"signature":"github.com/benbjohnson/litestream.Store.SyncDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[454,1],"end":[454,92],"bytes":[12569,12660]}},{"name":"path","type":"string","span":{"start":[454,1],"end":[454,92],"bytes":[12569,12660]}},{"name":"wait","type":"bool","span":{"start":[454,1],"end":[454,92],"bytes":[12569,12660]}}],"return_type":"(github.com/benbjohnson/litestream.SyncDBResult, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"455:8":{"kind":"call","span":{"start":[455,8],"end":[455,22],"bytes":[12668,12682]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"457:26":{"kind":"call","span":{"start":[457,26],"end":[457,73],"bytes":[12724,12771]},"callee":null},"460:6":{"kind":"call","span":{"start":[460,6],"end":[460,17],"bytes":[12781,12792]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"461:26":{"kind":"call","span":{"start":[461,26],"end":[461,72],"bytes":[12820,12866]},"callee":null},"464:24":{"kind":"call","span":{"start":[464,24],"end":[464,35],"bytes":[12894,12905]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"466:26":{"kind":"call","span":{"start":[466,26],"end":[466,74],"bytes":[12948,12996]},"callee":null},"470:13":{"kind":"call","span":{"start":[470,13],"end":[470,32],"bytes":[13024,13043]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait"},"471:27":{"kind":"call","span":{"start":[471,27],"end":[471,63],"bytes":[13084,13120]},"callee":null},"474:13":{"kind":"call","span":{"start":[474,13],"end":[474,25],"bytes":[13147,13159]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync"},"475:27":{"kind":"call","span":{"start":[475,27],"end":[475,63],"bytes":[13200,13236]},"callee":null},"479:23":{"kind":"call","span":{"start":[479,23],"end":[479,34],"bytes":[13267,13278]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"481:26":{"kind":"call","span":{"start":[481,26],"end":[481,73],"bytes":[13321,13368]},"callee":null},"486:20":{"kind":"call","span":{"start":[486,20],"end":[486,49],"bytes":[13443,13472]},"callee":null},"486:27":{"kind":"call","span":{"start":[486,27],"end":[486,43],"bytes":[13450,13466]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"490:19":{"kind":"call","span":{"start":[490,19],"end":[490,36],"bytes":[13517,13534]},"callee":null}}},"github.com/benbjohnson/litestream.Store.UnregisterDB":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","kind":"method","span":{"start":[367,1],"end":[397,2],"bytes":[10524,11007]},"signature":"github.com/benbjohnson/litestream.Store.UnregisterDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[367,1],"end":[367,71],"bytes":[10524,10594]}},{"name":"path","type":"string","span":{"start":[367,1],"end":[367,71],"bytes":[10524,10594]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"369:10":{"kind":"call","span":{"start":[369,10],"end":[369,40],"bytes":[10621,10651]},"callee":null},"372:2":{"kind":"call","span":{"start":[372,2],"end":[372,13],"bytes":[10657,10668]},"callee":null},"377:6":{"kind":"call","span":{"start":[377,6],"end":[377,21],"bytes":[10732,10747]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"385:3":{"kind":"call","span":{"start":[385,3],"end":[385,16],"bytes":[10821,10834]},"callee":null},"389:10":{"kind":"call","span":{"start":[389,10],"end":[389,42],"bytes":[10861,10893]},"callee":null},"390:2":{"kind":"call","span":{"start":[390,2],"end":[390,15],"bytes":[10895,10908]},"callee":null},"392:12":{"kind":"call","span":{"start":[392,12],"end":[392,25],"bytes":[10921,10934]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"393:10":{"kind":"call","span":{"start":[393,10],"end":[393,41],"bytes":[10958,10989]},"callee":null}}},"github.com/benbjohnson/litestream.Store.Validate":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","kind":"method","span":{"start":[885,1],"end":[922,2],"bytes":[24379,25511]},"signature":"github.com/benbjohnson/litestream.Store.Validate","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[885,1],"end":[885,75],"bytes":[24379,24453]}}],"return_type":"(*github.com/benbjohnson/litestream.ValidationResult, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"888:2":{"kind":"call","span":{"start":[888,2],"end":[888,13],"bytes":[24498,24509]},"callee":null},"891:2":{"kind":"call","span":{"start":[891,2],"end":[891,15],"bytes":[24545,24558]},"callee":null},"899:13":{"kind":"call","span":{"start":[899,13],"end":[899,36],"bytes":[24671,24694]},"callee":null},"900:19":{"kind":"call","span":{"start":[900,19],"end":[900,91],"bytes":[24713,24785]},"callee":null},"900:74":{"kind":"call","span":{"start":[900,74],"end":[900,83],"bytes":[24768,24777]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"901:15":{"kind":"call","span":{"start":[901,15],"end":[901,78],"bytes":[24800,24863]},"callee":null},"901:61":{"kind":"call","span":{"start":[901,61],"end":[901,70],"bytes":[24846,24855]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"902:17":{"kind":"call","span":{"start":[902,17],"end":[902,57],"bytes":[24880,24920]},"callee":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel"},"904:48":{"kind":"call","span":{"start":[904,48],"end":[904,57],"bytes":[24987,24996]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"904:5":{"kind":"call","span":{"start":[904,5],"end":[904,74],"bytes":[24944,25013]},"callee":null},"905:5":{"kind":"call","span":{"start":[905,5],"end":[905,19],"bytes":[25024,25038]},"callee":null},"906:17":{"kind":"call","span":{"start":[906,17],"end":[906,86],"bytes":[25055,25124]},"callee":null},"906:71":{"kind":"call","span":{"start":[906,71],"end":[906,80],"bytes":[25109,25118]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"908:7":{"kind":"call","span":{"start":[908,7],"end":[908,16],"bytes":[25136,25145]},"callee":null},"909:48":{"kind":"call","span":{"start":[909,48],"end":[909,57],"bytes":[25199,25208]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"909:5":{"kind":"call","span":{"start":[909,5],"end":[909,76],"bytes":[25156,25227]},"callee":null},"910:5":{"kind":"call","span":{"start":[910,5],"end":[910,19],"bytes":[25238,25252]},"callee":null},"912:21":{"kind":"call","span":{"start":[912,21],"end":[912,51],"bytes":[25298,25328]},"callee":null},"914:48":{"kind":"call","span":{"start":[914,48],"end":[914,57],"bytes":[25388,25397]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"914:5":{"kind":"call","span":{"start":[914,5],"end":[914,76],"bytes":[25345,25416]},"callee":null},"915:5":{"kind":"call","span":{"start":[915,5],"end":[915,19],"bytes":[25427,25441]},"callee":null},"916:5":{"kind":"call","span":{"start":[916,5],"end":[916,35],"bytes":[25446,25476]},"callee":null}}},"github.com/benbjohnson/litestream.Store.allDatabasesHealthy":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","kind":"method","span":{"start":[767,1],"end":[785,2],"bytes":[20810,21184]},"signature":"github.com/benbjohnson/litestream.Store.allDatabasesHealthy","parameters":[{"name":"since","type":"time.Time","span":{"start":[767,1],"end":[767,60],"bytes":[20810,20869]}}],"return_type":"bool","metrics":{"cyclomatic":5},"body":{"768:9":{"kind":"call","span":{"start":[768,9],"end":[768,16],"bytes":[20878,20885]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"769:5":{"kind":"call","span":{"start":[769,5],"end":[769,13],"bytes":[20890,20898]},"callee":null},"775:7":{"kind":"call","span":{"start":[775,7],"end":[775,18],"bytes":[20976,20987]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"779:15":{"kind":"call","span":{"start":[779,15],"end":[779,40],"bytes":[21058,21083]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt"},"780:27":{"kind":"call","span":{"start":[780,27],"end":[780,49],"bytes":[21110,21132]},"callee":null},"780:6":{"kind":"call","span":{"start":[780,6],"end":[780,23],"bytes":[21089,21106]},"callee":null}}},"github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked","kind":"method","span":{"start":[706,1],"end":[708,2],"bytes":[18987,19090]},"signature":"github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.Store.monitorCompactionLevel":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","kind":"method","span":{"start":[583,1],"end":[648,2],"bytes":[15686,17683]},"signature":"github.com/benbjohnson/litestream.Store.monitorCompactionLevel","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[583,1],"end":[583,84],"bytes":[15686,15769]}},{"name":"lvl","type":"*github.com/benbjohnson/litestream.CompactionLevel","span":{"start":[583,1],"end":[583,84],"bytes":[15686,15769]}}],"metrics":{"cyclomatic":17},"body":{"584:2":{"kind":"call","span":{"start":[584,2],"end":[584,92],"bytes":[15771,15861]},"callee":null},"587:11":{"kind":"call","span":{"start":[587,11],"end":[587,41],"bytes":[15903,15933]},"callee":null},"588:8":{"kind":"call","span":{"start":[588,8],"end":[588,20],"bytes":[15941,15953]},"callee":null},"592:10":{"kind":"call","span":{"start":[592,10],"end":[592,20],"bytes":[15982,15992]},"callee":null},"598:10":{"kind":"call","span":{"start":[598,10],"end":[598,20],"bytes":[16050,16060]},"callee":null},"599:16":{"kind":"call","span":{"start":[599,16],"end":[599,53],"bytes":[16076,16113]},"callee":null},"599:27":{"kind":"call","span":{"start":[599,27],"end":[599,52],"bytes":[16087,16112]},"callee":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt"},"603:22":{"kind":"call","span":{"start":[603,22],"end":[603,29],"bytes":[16164,16171]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"604:8":{"kind":"call","span":{"start":[604,8],"end":[604,19],"bytes":[16181,16192]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"607:14":{"kind":"call","span":{"start":[607,14],"end":[607,39],"bytes":[16247,16272]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB"},"609:42":{"kind":"call","span":{"start":[609,42],"end":[609,79],"bytes":[16326,16363]},"callee":null},"609:9":{"kind":"call","span":{"start":[609,9],"end":[609,40],"bytes":[16293,16324]},"callee":null},"610:5":{"kind":"call","span":{"start":[610,5],"end":[610,76],"bytes":[16369,16440]},"callee":null},"610:66":{"kind":"call","span":{"start":[610,66],"end":[610,75],"bytes":[16430,16439]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"611:9":{"kind":"call","span":{"start":[611,9],"end":[611,38],"bytes":[16449,16478]},"callee":null},"612:5":{"kind":"call","span":{"start":[612,5],"end":[612,99],"bytes":[16484,16578]},"callee":null},"612:75":{"kind":"call","span":{"start":[612,75],"end":[612,84],"bytes":[16554,16563]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"613:19":{"kind":"call","span":{"start":[613,19],"end":[613,49],"bytes":[16597,16627]},"callee":null},"613:39":{"kind":"call","span":{"start":[613,39],"end":[613,48],"bytes":[16617,16626]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"614:24":{"kind":"call","span":{"start":[614,24],"end":[614,49],"bytes":[16651,16676]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"615:5":{"kind":"call","span":{"start":[615,5],"end":[615,75],"bytes":[16682,16752]},"callee":null},"619:15":{"kind":"call","span":{"start":[619,15],"end":[619,50],"bytes":[16808,16843]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention"},"619:67":{"kind":"call","span":{"start":[619,67],"end":[619,92],"bytes":[16860,16885]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"620:6":{"kind":"call","span":{"start":[620,6],"end":[620,67],"bytes":[16893,16954]},"callee":null},"625:16":{"kind":"call","span":{"start":[625,16],"end":[625,38],"bytes":[16986,17008]},"callee":null},"625:42":{"kind":"call","span":{"start":[625,42],"end":[625,66],"bytes":[17012,17036]},"callee":null},"626:6":{"kind":"call","span":{"start":[626,6],"end":[626,22],"bytes":[17042,17058]},"callee":null},"627:7":{"kind":"call","span":{"start":[627,7],"end":[627,29],"bytes":[17084,17106]},"callee":null},"628:21":{"kind":"call","span":{"start":[628,21],"end":[628,50],"bytes":[17129,17158]},"callee":null},"631:4":{"kind":"call","span":{"start":[631,4],"end":[631,74],"bytes":[17194,17264]},"callee":null},"634:5":{"kind":"call","span":{"start":[634,5],"end":[638,131],"bytes":[17297,17570]},"callee":null},"646:3":{"kind":"call","span":{"start":[646,3],"end":[646,25],"bytes":[17656,17678]},"callee":null}}},"github.com/benbjohnson/litestream.Store.monitorHeartbeats":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","kind":"method","span":{"start":[713,1],"end":[729,2],"bytes":[19279,19612]},"signature":"github.com/benbjohnson/litestream.Store.monitorHeartbeats","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[713,1],"end":[713,57],"bytes":[19279,19335]}}],"metrics":{"cyclomatic":5},"body":{"714:2":{"kind":"call","span":{"start":[714,2],"end":[714,83],"bytes":[19337,19418]},"callee":null},"716:12":{"kind":"call","span":{"start":[716,12],"end":[716,52],"bytes":[19431,19471]},"callee":null},"717:8":{"kind":"call","span":{"start":[717,8],"end":[717,21],"bytes":[19479,19492]},"callee":null},"722:10":{"kind":"call","span":{"start":[722,10],"end":[722,20],"bytes":[19527,19537]},"callee":null},"727:3":{"kind":"call","span":{"start":[727,3],"end":[727,31],"bytes":[19579,19607]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded"}}},"github.com/benbjohnson/litestream.Store.monitorL0Retention":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","kind":"method","span":{"start":[650,1],"end":[676,2],"bytes":[17685,18326]},"signature":"github.com/benbjohnson/litestream.Store.monitorL0Retention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[650,1],"end":[650,58],"bytes":[17685,17742]}}],"metrics":{"cyclomatic":9},"body":{"651:2":{"kind":"call","span":{"start":[651,2],"end":[651,116],"bytes":[17744,17858]},"callee":null},"653:12":{"kind":"call","span":{"start":[653,12],"end":[653,54],"bytes":[17871,17913]},"callee":null},"654:8":{"kind":"call","span":{"start":[654,8],"end":[654,21],"bytes":[17921,17934]},"callee":null},"659:10":{"kind":"call","span":{"start":[659,10],"end":[659,20],"bytes":[17969,17979]},"callee":null},"664:22":{"kind":"call","span":{"start":[664,22],"end":[664,29],"bytes":[18040,18047]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"665:8":{"kind":"call","span":{"start":[665,8],"end":[665,19],"bytes":[18057,18068]},"callee":null},"668:14":{"kind":"call","span":{"start":[668,14],"end":[668,46],"bytes":[18123,18155]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime"},"669:8":{"kind":"call","span":{"start":[669,8],"end":[669,33],"bytes":[18177,18202]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"672:5":{"kind":"call","span":{"start":[672,5],"end":[672,88],"bytes":[18229,18312]},"callee":null},"672:64":{"kind":"call","span":{"start":[672,64],"end":[672,73],"bytes":[18288,18297]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream.Store.monitorValidation":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","kind":"method","span":{"start":[925,1],"end":[958,2],"bytes":[25588,26265]},"signature":"github.com/benbjohnson/litestream.Store.monitorValidation","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[925,1],"end":[925,57],"bytes":[25588,25644]}}],"metrics":{"cyclomatic":9},"body":{"926:2":{"kind":"call","span":{"start":[926,2],"end":[926,80],"bytes":[25646,25724]},"callee":null},"928:12":{"kind":"call","span":{"start":[928,12],"end":[928,48],"bytes":[25737,25773]},"callee":null},"929:8":{"kind":"call","span":{"start":[929,8],"end":[929,21],"bytes":[25781,25794]},"callee":null},"934:10":{"kind":"call","span":{"start":[934,10],"end":[934,20],"bytes":[25829,25839]},"callee":null},"939:18":{"kind":"call","span":{"start":[939,18],"end":[939,33],"bytes":[25896,25911]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate"},"941:7":{"kind":"call","span":{"start":[941,7],"end":[941,32],"bytes":[25936,25961]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"944:4":{"kind":"call","span":{"start":[944,4],"end":[944,59],"bytes":[25985,26040]},"callee":null},"950:5":{"kind":"call","span":{"start":[950,5],"end":[954,6],"bytes":[26123,26251]},"callee":null}}},"github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","kind":"method","span":{"start":[735,1],"end":[763,2],"bytes":[19838,20640]},"signature":"github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[735,1],"end":[735,61],"bytes":[19838,19898]}}],"metrics":{"cyclomatic":5},"body":{"741:6":{"kind":"call","span":{"start":[741,6],"end":[741,21],"bytes":[19968,19983]},"callee":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing"},"747:18":{"kind":"call","span":{"start":[747,18],"end":[747,28],"bytes":[20165,20175]},"callee":null},"748:6":{"kind":"call","span":{"start":[748,6],"end":[748,41],"bytes":[20199,20234]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy"},"755:2":{"kind":"call","span":{"start":[755,2],"end":[755,17],"bytes":[20446,20461]},"callee":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing"},"757:12":{"kind":"call","span":{"start":[757,12],"end":[757,24],"bytes":[20474,20486]},"callee":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping"},"758:3":{"kind":"call","span":{"start":[758,3],"end":[758,71],"bytes":[20503,20571]},"callee":null},"762:2":{"kind":"call","span":{"start":[762,2],"end":[762,54],"bytes":[20586,20638]},"callee":null}}},"github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","kind":"method","span":{"start":[682,1],"end":[702,2],"bytes":[18528,18869]},"signature":"github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","parameters":[],"metrics":{"cyclomatic":4},"body":{"683:2":{"kind":"call","span":{"start":[683,2],"end":[683,13],"bytes":[18579,18590]},"callee":null},"684:8":{"kind":"call","span":{"start":[684,8],"end":[684,21],"bytes":[18598,18611]},"callee":null},"692:6":{"kind":"call","span":{"start":[692,6],"end":[692,34],"bytes":[18710,18738]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked"},"697:2":{"kind":"call","span":{"start":[697,2],"end":[697,13],"bytes":[18789,18800]},"callee":null},"698:5":{"kind":"call","span":{"start":[698,5],"end":[701,5],"bytes":[18805,18867]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded.closure_1","kind":"function","span":{"start":[698,1],"end":[701,5],"bytes":[18801,18867]},"signature":"github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded.closure_1","parameters":[],"body":{"699:9":{"kind":"call","span":{"start":[699,9],"end":[699,20],"bytes":[18822,18833]},"callee":null},"700:3":{"kind":"call","span":{"start":[700,3],"end":[700,29],"bytes":[18836,18862]},"callee":null}}}}}},"fields":{"CompactionMonitorEnabled":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/CompactionMonitorEnabled","kind":"field","type":"bool","span":{"start":[128,1],"end":[128,31],"bytes":[4255,4285]}},"Heartbeat":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/Heartbeat","kind":"field","type":"*github.com/benbjohnson/litestream.HeartbeatClient","span":{"start":[147,1],"end":[147,28],"bytes":[4980,5007]}},"HeartbeatCheckInterval":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/HeartbeatCheckInterval","kind":"field","type":"time.Duration","span":{"start":[143,1],"end":[143,38],"bytes":[4800,4837]}},"L0Retention":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/L0Retention","kind":"field","type":"time.Duration","span":{"start":[123,1],"end":[123,27],"bytes":[4061,4087]}},"L0RetentionCheckInterval":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/L0RetentionCheckInterval","kind":"field","type":"time.Duration","span":{"start":[125,1],"end":[125,40],"bytes":[4133,4172]}},"Logger":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/Logger","kind":"field","type":"*log/slog.Logger","span":{"start":[155,1],"end":[155,21],"bytes":[5237,5257]}},"RetentionEnabled":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/RetentionEnabled","kind":"field","type":"bool","span":{"start":[136,1],"end":[136,23],"bytes":[4611,4633]}},"ShutdownSyncInterval":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/ShutdownSyncInterval","kind":"field","type":"time.Duration","span":{"start":[140,1],"end":[140,36],"bytes":[4705,4740]}},"ShutdownSyncTimeout":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/ShutdownSyncTimeout","kind":"field","type":"time.Duration","span":{"start":[139,1],"end":[139,36],"bytes":[4669,4704]}},"SnapshotInterval":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/SnapshotInterval","kind":"field","type":"time.Duration","span":{"start":[118,1],"end":[118,32],"bytes":[3853,3884]}},"SnapshotRetention":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/SnapshotRetention","kind":"field","type":"time.Duration","span":{"start":[120,1],"end":[120,33],"bytes":[3956,3988]}},"ValidationInterval":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/ValidationInterval","kind":"field","type":"time.Duration","span":{"start":[153,1],"end":[153,34],"bytes":[5202,5235]}},"VerifyCompaction":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/VerifyCompaction","kind":"field","type":"bool","span":{"start":[131,1],"end":[131,23],"bytes":[4368,4390]}},"cancel":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/cancel","kind":"field","type":"func()","span":{"start":[114,1],"end":[114,15],"bytes":[3781,3795]}},"ctx":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/ctx","kind":"field","type":"context.Context","span":{"start":[113,1],"end":[113,24],"bytes":[3757,3780]}},"dbs":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/dbs","kind":"field","type":"[]*github.com/benbjohnson/litestream.DB","span":{"start":[109,1],"end":[109,14],"bytes":[3694,3707]}},"done":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/done","kind":"field","type":"\u003c-chan struct{}","span":{"start":[115,1],"end":[115,24],"bytes":[3796,3819]}},"heartbeatMonitorRunning":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/heartbeatMonitorRunning","kind":"field","type":"bool","span":{"start":[150,1],"end":[150,30],"bytes":[5096,5125]}},"levels":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/levels","kind":"field","type":"github.com/benbjohnson/litestream.CompactionLevels","span":{"start":[110,1],"end":[110,25],"bytes":[3708,3732]}},"mu":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/mu","kind":"field","type":"sync.Mutex","span":{"start":[108,1],"end":[108,19],"bytes":[3675,3693]}},"wg":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[112,1],"end":[112,23],"bytes":[3734,3756]}}}},"SyncDBResult":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.SyncDBResult","kind":"struct","span":{"start":[443,1],"end":[447,2],"bytes":[12109,12204]},"callables":{},"fields":{"Changed":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.SyncDBResult/Changed","kind":"field","type":"bool","span":{"start":[446,1],"end":[446,21],"bytes":[12182,12202]}},"ReplicatedTXID":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.SyncDBResult/ReplicatedTXID","kind":"field","type":"uint64","span":{"start":[445,1],"end":[445,23],"bytes":[12159,12181]}},"TXID":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.SyncDBResult/TXID","kind":"field","type":"uint64","span":{"start":[444,1],"end":[444,23],"bytes":[12136,12158]}}}},"ValidationResult":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.ValidationResult","kind":"struct","span":{"start":[878,1],"end":[881,2],"bytes":[24104,24235]},"callables":{},"fields":{"Errors":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.ValidationResult/Errors","kind":"field","type":"[]github.com/benbjohnson/litestream.ValidationError","span":{"start":[880,1],"end":[880,46],"bytes":[24188,24233]}},"Valid":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.ValidationResult/Valid","kind":"field","type":"bool","span":{"start":[879,1],"end":[879,53],"bytes":[24135,24187]}}}}},"functions":{"github.com/benbjohnson/litestream.NewStore":{"id":"can://go/litestream/store.go/github.com/benbjohnson/litestream.NewStore","kind":"function","span":{"start":[158,1],"end":[185,2],"bytes":[5261,6292]},"signature":"github.com/benbjohnson/litestream.NewStore","parameters":[{"name":"dbs","type":"[]*github.com/benbjohnson/litestream.DB","span":{"start":[158,1],"end":[158,59],"bytes":[5261,5319]}},{"name":"levels","type":"github.com/benbjohnson/litestream.CompactionLevels","span":{"start":[158,1],"end":[158,59],"bytes":[5261,5319]}}],"return_type":"*github.com/benbjohnson/litestream.Store","metrics":{"cyclomatic":2},"body":{"172:29":{"kind":"call","span":{"start":[172,29],"end":[172,43],"bytes":[5852,5866]},"callee":null},"176:16":{"kind":"call","span":{"start":[176,16],"end":[176,65],"bytes":[5948,5997]},"callee":null},"176:3":{"kind":"call","span":{"start":[176,3],"end":[176,66],"bytes":[5935,5998]},"callee":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError"},"176:40":{"kind":"call","span":{"start":[176,40],"end":[176,64],"bytes":[5972,5996]},"callee":null},"176:54":{"kind":"call","span":{"start":[176,54],"end":[176,63],"bytes":[5986,5995]},"callee":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"183:20":{"kind":"call","span":{"start":[183,20],"end":[183,60],"bytes":[6240,6280]},"callee":null},"183:39":{"kind":"call","span":{"start":[183,39],"end":[183,59],"bytes":[6259,6279]},"callee":null}}}},"content_hash":"ebb3c05192c82c74a49e88667d7b47c61959023edf56d51b1d552976bc44341e"},"v3.go":{"id":"can://go/litestream/v3.go","kind":"module","span":{"start":[1,1],"end":[176,1],"bytes":[0,5940]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// PosV3 represents a position in a v0.3.x backup.\ntype PosV3 struct {\n\tGeneration string // 16-char hex string\n\tIndex int // WAL index\n\tOffset int64 // Offset within WAL segment\n}\n\n// IsZero returns true if the position is the zero value.\nfunc (p PosV3) IsZero() bool {\n\treturn p == (PosV3{})\n}\n\n// String returns a string representation of the position.\nfunc (p PosV3) String() string {\n\tif p.IsZero() {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s/%08x:%016x\", p.Generation, p.Index, p.Offset)\n}\n\n// SnapshotInfoV3 contains metadata about a v0.3.x snapshot.\ntype SnapshotInfoV3 struct {\n\tGeneration string\n\tIndex int\n\tSize int64\n\tCreatedAt time.Time\n}\n\n// Pos returns the position of this snapshot.\nfunc (info SnapshotInfoV3) Pos() PosV3 {\n\treturn PosV3{Generation: info.Generation, Index: info.Index, Offset: 0}\n}\n\n// WALSegmentInfoV3 contains metadata about a v0.3.x WAL segment.\ntype WALSegmentInfoV3 struct {\n\tGeneration string\n\tIndex int\n\tOffset int64\n\tSize int64\n\tCreatedAt time.Time\n}\n\n// Pos returns the position of this WAL segment.\nfunc (info WALSegmentInfoV3) Pos() PosV3 {\n\treturn PosV3{Generation: info.Generation, Index: info.Index, Offset: info.Offset}\n}\n\n// v0.3.x path constants.\nconst (\n\tGenerationsDirV3 = \"generations\"\n\tSnapshotsDirV3 = \"snapshots\"\n\tWALDirV3 = \"wal\"\n)\n\n// GenerationsPathV3 returns the path to the generations directory.\nfunc GenerationsPathV3(root string) string {\n\treturn path.Join(root, GenerationsDirV3)\n}\n\n// GenerationPathV3 returns the path to a specific generation.\nfunc GenerationPathV3(root, generation string) string {\n\treturn path.Join(root, GenerationsDirV3, generation)\n}\n\n// SnapshotsPathV3 returns the path to snapshots within a generation.\nfunc SnapshotsPathV3(root, generation string) string {\n\treturn path.Join(root, GenerationsDirV3, generation, SnapshotsDirV3)\n}\n\n// WALPathV3 returns the path to WAL segments within a generation.\nfunc WALPathV3(root, generation string) string {\n\treturn path.Join(root, GenerationsDirV3, generation, WALDirV3)\n}\n\n// SnapshotPathV3 returns the full path to a v0.3.x snapshot file.\nfunc SnapshotPathV3(root, generation string, index int) string {\n\treturn path.Join(SnapshotsPathV3(root, generation), FormatSnapshotFilenameV3(index))\n}\n\n// WALSegmentPathV3 returns the full path to a v0.3.x WAL segment file.\nfunc WALSegmentPathV3(root, generation string, index int, offset int64) string {\n\treturn path.Join(WALPathV3(root, generation), FormatWALSegmentFilenameV3(index, offset))\n}\n\n// FormatSnapshotFilenameV3 returns the filename for a v0.3.x snapshot.\n// Format: {index:08x}.snapshot.lz4\nfunc FormatSnapshotFilenameV3(index int) string {\n\treturn fmt.Sprintf(\"%08x.snapshot.lz4\", index)\n}\n\n// FormatWALSegmentFilenameV3 returns the filename for a v0.3.x WAL segment.\n// Format: {index:08x}_{offset:08x}.wal.lz4\nfunc FormatWALSegmentFilenameV3(index int, offset int64) string {\n\treturn fmt.Sprintf(\"%08x_%08x.wal.lz4\", index, offset)\n}\n\nvar (\n\tsnapshotRegexV3 = regexp.MustCompile(`^([0-9a-f]{8})\\.snapshot\\.lz4$`)\n\twalSegmentRegexV3 = regexp.MustCompile(`^([0-9a-f]{8})_([0-9a-f]{8,16})\\.wal\\.lz4$`)\n\tgenerationRegexV3 = regexp.MustCompile(`^[0-9a-f]{16}$`)\n)\n\n// ParseSnapshotFilenameV3 parses a v0.3.x snapshot filename and returns the index.\n// Returns an error if the filename does not match the expected format.\nfunc ParseSnapshotFilenameV3(filename string) (index int, err error) {\n\tm := snapshotRegexV3.FindStringSubmatch(filename)\n\tif m == nil {\n\t\treturn 0, fmt.Errorf(\"invalid v0.3.x snapshot filename: %q\", filename)\n\t}\n\tidx, err := strconv.ParseInt(m[1], 16, 32)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"invalid snapshot path: %s: %w\", filename, err)\n\t}\n\treturn int(idx), nil\n}\n\n// ParseWALSegmentFilenameV3 parses a v0.3.x WAL segment filename.\n// Returns the WAL index and byte offset, or an error if the filename is invalid.\nfunc ParseWALSegmentFilenameV3(filename string) (index int, offset int64, err error) {\n\tm := walSegmentRegexV3.FindStringSubmatch(filename)\n\tif m == nil {\n\t\treturn 0, 0, fmt.Errorf(\"invalid v0.3.x WAL segment filename: %q\", filename)\n\t}\n\tidx, err := strconv.ParseInt(m[1], 16, 32)\n\tif err != nil {\n\t\treturn 0, 0, fmt.Errorf(\"invalid wal segment path: %s: %w\", filename, err)\n\t}\n\toff, err := strconv.ParseInt(m[2], 16, 64)\n\tif err != nil {\n\t\treturn 0, 0, fmt.Errorf(\"invalid wal segment path: %s: %w\", filename, err)\n\t}\n\treturn int(idx), off, nil\n}\n\n// IsGenerationIDV3 returns true if s is a valid v0.3.x generation ID (16 hex chars).\nfunc IsGenerationIDV3(s string) bool {\n\treturn generationRegexV3.MatchString(s)\n}\n\n// ReplicaClientV3 reads v0.3.x backup data.\n// ReplicaClient implementations that support v0.3.x restore should implement this interface.\ntype ReplicaClientV3 interface {\n\t// GenerationsV3 returns a list of generation IDs in the replica.\n\t// Returns an empty slice if no v0.3.x backups exist.\n\t// Generation IDs are sorted in ascending order.\n\tGenerationsV3(ctx context.Context) ([]string, error)\n\n\t// SnapshotsV3 returns snapshots for a generation, sorted by index.\n\t// Returns an empty slice if no snapshots exist.\n\tSnapshotsV3(ctx context.Context, generation string) ([]SnapshotInfoV3, error)\n\n\t// WALSegmentsV3 returns WAL segments for a generation, sorted by index then offset.\n\t// Returns an empty slice if no WAL segments exist.\n\tWALSegmentsV3(ctx context.Context, generation string) ([]WALSegmentInfoV3, error)\n\n\t// OpenSnapshotV3 opens a v0.3.x snapshot for reading.\n\t// The returned reader provides LZ4-decompressed data.\n\tOpenSnapshotV3(ctx context.Context, generation string, index int) (io.ReadCloser, error)\n\n\t// OpenWALSegmentV3 opens a v0.3.x WAL segment for reading.\n\t// The returned reader provides LZ4-decompressed data.\n\tOpenWALSegmentV3(ctx context.Context, generation string, index int, offset int64) (io.ReadCloser, error)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"fmt","path":"fmt","span":{"start":[5,1],"end":[5,7],"bytes":[40,46]}},{"name":"io","path":"io","span":{"start":[6,1],"end":[6,6],"bytes":[47,52]}},{"name":"path","path":"path","span":{"start":[7,1],"end":[7,8],"bytes":[53,60]}},{"name":"regexp","path":"regexp","span":{"start":[8,1],"end":[8,10],"bytes":[61,70]}},{"name":"strconv","path":"strconv","span":{"start":[9,1],"end":[9,11],"bytes":[71,81]}},{"name":"time","path":"time","span":{"start":[10,1],"end":[10,8],"bytes":[82,89]}}],"types":{"PosV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3","kind":"struct","span":{"start":[14,1],"end":[18,2],"bytes":[144,286]},"callables":{"github.com/benbjohnson/litestream.PosV3.IsZero":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.IsZero","kind":"method","span":{"start":[21,1],"end":[23,2],"bytes":[346,401]},"signature":"github.com/benbjohnson/litestream.PosV3.IsZero","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.PosV3.String":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.String","kind":"method","span":{"start":[26,1],"end":[31,2],"bytes":[462,598]},"signature":"github.com/benbjohnson/litestream.PosV3.String","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,15],"bytes":[499,509]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.IsZero"},"30:9":{"kind":"call","span":{"start":[30,9],"end":[30,70],"bytes":[535,596]},"callee":null}}}},"fields":{"Generation":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3/Generation","kind":"field","type":"string","span":{"start":[15,1],"end":[15,41],"bytes":[164,204]}},"Index":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3/Index","kind":"field","type":"int","span":{"start":[16,1],"end":[16,32],"bytes":[205,236]}},"Offset":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3/Offset","kind":"field","type":"int64","span":{"start":[17,1],"end":[17,48],"bytes":[237,284]}}}},"ReplicaClientV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3","kind":"interface","span":{"start":[154,1],"end":[175,2],"bytes":[4830,5939]},"callables":{"github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","kind":"method","span":{"start":[158,1],"end":[158,54],"bytes":[5035,5088]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[158,1],"end":[158,54],"bytes":[5035,5088]}}],"return_type":"([]string, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3","kind":"method","span":{"start":[170,1],"end":[170,90],"bytes":[5624,5713]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[170,1],"end":[170,90],"bytes":[5624,5713]}},{"name":"generation","type":"string","span":{"start":[170,1],"end":[170,90],"bytes":[5624,5713]}},{"name":"index","type":"int","span":{"start":[170,1],"end":[170,90],"bytes":[5624,5713]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3","kind":"method","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]}},{"name":"generation","type":"string","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]}},{"name":"index","type":"int","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]}},{"name":"offset","type":"int64","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","kind":"method","span":{"start":[162,1],"end":[162,79],"bytes":[5209,5287]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[162,1],"end":[162,79],"bytes":[5209,5287]}},{"name":"generation","type":"string","span":{"start":[162,1],"end":[162,79],"bytes":[5209,5287]}}],"return_type":"([]github.com/benbjohnson/litestream.SnapshotInfoV3, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3","kind":"method","span":{"start":[166,1],"end":[166,83],"bytes":[5428,5510]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[166,1],"end":[166,83],"bytes":[5428,5510]}},{"name":"generation","type":"string","span":{"start":[166,1],"end":[166,83],"bytes":[5428,5510]}}],"return_type":"([]github.com/benbjohnson/litestream.WALSegmentInfoV3, error)","error_channel":["error"],"body":{}}}},"SnapshotInfoV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3","kind":"struct","span":{"start":[34,1],"end":[39,2],"bytes":[661,766]},"callables":{"github.com/benbjohnson/litestream.SnapshotInfoV3.Pos":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/github.com/benbjohnson/litestream.SnapshotInfoV3.Pos","kind":"method","span":{"start":[42,1],"end":[44,2],"bytes":[814,929]},"signature":"github.com/benbjohnson/litestream.SnapshotInfoV3.Pos","parameters":[],"return_type":"github.com/benbjohnson/litestream.PosV3","metrics":{"cyclomatic":1},"body":{}}},"fields":{"CreatedAt":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/CreatedAt","kind":"field","type":"time.Time","span":{"start":[38,1],"end":[38,22],"bytes":[743,764]}},"Generation":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/Generation","kind":"field","type":"string","span":{"start":[35,1],"end":[35,19],"bytes":[690,708]}},"Index":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/Index","kind":"field","type":"int","span":{"start":[36,1],"end":[36,16],"bytes":[709,724]}},"Size":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/Size","kind":"field","type":"int64","span":{"start":[37,1],"end":[37,18],"bytes":[725,742]}}}},"WALSegmentInfoV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3","kind":"struct","span":{"start":[47,1],"end":[53,2],"bytes":[997,1122]},"callables":{"github.com/benbjohnson/litestream.WALSegmentInfoV3.Pos":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/github.com/benbjohnson/litestream.WALSegmentInfoV3.Pos","kind":"method","span":{"start":[56,1],"end":[58,2],"bytes":[1173,1300]},"signature":"github.com/benbjohnson/litestream.WALSegmentInfoV3.Pos","parameters":[],"return_type":"github.com/benbjohnson/litestream.PosV3","metrics":{"cyclomatic":1},"body":{}}},"fields":{"CreatedAt":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/CreatedAt","kind":"field","type":"time.Time","span":{"start":[52,1],"end":[52,22],"bytes":[1099,1120]}},"Generation":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/Generation","kind":"field","type":"string","span":{"start":[48,1],"end":[48,19],"bytes":[1028,1046]}},"Index":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/Index","kind":"field","type":"int","span":{"start":[49,1],"end":[49,16],"bytes":[1047,1062]}},"Offset":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/Offset","kind":"field","type":"int64","span":{"start":[50,1],"end":[50,18],"bytes":[1063,1080]}},"Size":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/Size","kind":"field","type":"int64","span":{"start":[51,1],"end":[51,18],"bytes":[1081,1098]}}}}},"functions":{"github.com/benbjohnson/litestream.FormatSnapshotFilenameV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","kind":"function","span":{"start":[99,1],"end":[101,2],"bytes":[2721,2820]},"signature":"github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","parameters":[{"name":"index","type":"int","span":{"start":[99,1],"end":[99,50],"bytes":[2721,2770]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"100:9":{"kind":"call","span":{"start":[100,9],"end":[100,48],"bytes":[2779,2818]},"callee":null}}},"github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","kind":"function","span":{"start":[105,1],"end":[107,2],"bytes":[2943,3066]},"signature":"github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","parameters":[{"name":"index","type":"int","span":{"start":[105,1],"end":[105,66],"bytes":[2943,3008]}},{"name":"offset","type":"int64","span":{"start":[105,1],"end":[105,66],"bytes":[2943,3008]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"106:9":{"kind":"call","span":{"start":[106,9],"end":[106,56],"bytes":[3017,3064]},"callee":null}}},"github.com/benbjohnson/litestream.GenerationPathV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.GenerationPathV3","kind":"function","span":{"start":[73,1],"end":[75,2],"bytes":[1652,1763]},"signature":"github.com/benbjohnson/litestream.GenerationPathV3","parameters":[{"name":"root","type":"string","span":{"start":[73,1],"end":[73,56],"bytes":[1652,1707]}},{"name":"generation","type":"string","span":{"start":[73,1],"end":[73,56],"bytes":[1652,1707]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"74:9":{"kind":"call","span":{"start":[74,9],"end":[74,54],"bytes":[1716,1761]},"callee":null}}},"github.com/benbjohnson/litestream.GenerationsPathV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.GenerationsPathV3","kind":"function","span":{"start":[68,1],"end":[70,2],"bytes":[1499,1587]},"signature":"github.com/benbjohnson/litestream.GenerationsPathV3","parameters":[{"name":"root","type":"string","span":{"start":[68,1],"end":[68,45],"bytes":[1499,1543]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"69:9":{"kind":"call","span":{"start":[69,9],"end":[69,42],"bytes":[1552,1585]},"callee":null}}},"github.com/benbjohnson/litestream.IsGenerationIDV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3","kind":"function","span":{"start":[148,1],"end":[150,2],"bytes":[4608,4689]},"signature":"github.com/benbjohnson/litestream.IsGenerationIDV3","parameters":[{"name":"s","type":"string","span":{"start":[148,1],"end":[148,39],"bytes":[4608,4646]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"149:9":{"kind":"call","span":{"start":[149,9],"end":[149,41],"bytes":[4655,4687]},"callee":null}}},"github.com/benbjohnson/litestream.ParseSnapshotFilenameV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","kind":"function","span":{"start":[117,1],"end":[127,2],"bytes":[3451,3822]},"signature":"github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","parameters":[{"name":"filename","type":"string","span":{"start":[117,1],"end":[117,71],"bytes":[3451,3521]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"118:7":{"kind":"call","span":{"start":[118,7],"end":[118,51],"bytes":[3528,3572]},"callee":null},"120:13":{"kind":"call","span":{"start":[120,13],"end":[120,73],"bytes":[3600,3660]},"callee":null},"122:14":{"kind":"call","span":{"start":[122,14],"end":[122,44],"bytes":[3677,3707]},"callee":null},"124:13":{"kind":"call","span":{"start":[124,13],"end":[124,71],"bytes":[3737,3795]},"callee":null},"126:9":{"kind":"call","span":{"start":[126,9],"end":[126,17],"bytes":[3807,3815]},"callee":null}}},"github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","kind":"function","span":{"start":[131,1],"end":[145,2],"bytes":[3973,4520]},"signature":"github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","parameters":[{"name":"filename","type":"string","span":{"start":[131,1],"end":[131,87],"bytes":[3973,4059]}}],"return_type":"(int, int64, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"132:7":{"kind":"call","span":{"start":[132,7],"end":[132,53],"bytes":[4066,4112]},"callee":null},"134:16":{"kind":"call","span":{"start":[134,16],"end":[134,79],"bytes":[4143,4206]},"callee":null},"136:14":{"kind":"call","span":{"start":[136,14],"end":[136,44],"bytes":[4223,4253]},"callee":null},"138:16":{"kind":"call","span":{"start":[138,16],"end":[138,77],"bytes":[4286,4347]},"callee":null},"140:14":{"kind":"call","span":{"start":[140,14],"end":[140,44],"bytes":[4364,4394]},"callee":null},"142:16":{"kind":"call","span":{"start":[142,16],"end":[142,77],"bytes":[4427,4488]},"callee":null},"144:9":{"kind":"call","span":{"start":[144,9],"end":[144,17],"bytes":[4500,4508]},"callee":null}}},"github.com/benbjohnson/litestream.SnapshotPathV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","kind":"function","span":{"start":[88,1],"end":[90,2],"bytes":[2213,2365]},"signature":"github.com/benbjohnson/litestream.SnapshotPathV3","parameters":[{"name":"root","type":"string","span":{"start":[88,1],"end":[88,65],"bytes":[2213,2277]}},{"name":"generation","type":"string","span":{"start":[88,1],"end":[88,65],"bytes":[2213,2277]}},{"name":"index","type":"int","span":{"start":[88,1],"end":[88,65],"bytes":[2213,2277]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"89:19":{"kind":"call","span":{"start":[89,19],"end":[89,52],"bytes":[2296,2329]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3"},"89:54":{"kind":"call","span":{"start":[89,54],"end":[89,85],"bytes":[2331,2362]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3"},"89:9":{"kind":"call","span":{"start":[89,9],"end":[89,86],"bytes":[2286,2363]},"callee":null}}},"github.com/benbjohnson/litestream.SnapshotsPathV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3","kind":"function","span":{"start":[78,1],"end":[80,2],"bytes":[1835,1961]},"signature":"github.com/benbjohnson/litestream.SnapshotsPathV3","parameters":[{"name":"root","type":"string","span":{"start":[78,1],"end":[78,55],"bytes":[1835,1889]}},{"name":"generation","type":"string","span":{"start":[78,1],"end":[78,55],"bytes":[1835,1889]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"79:9":{"kind":"call","span":{"start":[79,9],"end":[79,70],"bytes":[1898,1959]},"callee":null}}},"github.com/benbjohnson/litestream.WALPathV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALPathV3","kind":"function","span":{"start":[83,1],"end":[85,2],"bytes":[2030,2144]},"signature":"github.com/benbjohnson/litestream.WALPathV3","parameters":[{"name":"root","type":"string","span":{"start":[83,1],"end":[83,49],"bytes":[2030,2078]}},{"name":"generation","type":"string","span":{"start":[83,1],"end":[83,49],"bytes":[2030,2078]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"84:9":{"kind":"call","span":{"start":[84,9],"end":[84,64],"bytes":[2087,2142]},"callee":null}}},"github.com/benbjohnson/litestream.WALSegmentPathV3":{"id":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","kind":"function","span":{"start":[93,1],"end":[95,2],"bytes":[2439,2611]},"signature":"github.com/benbjohnson/litestream.WALSegmentPathV3","parameters":[{"name":"root","type":"string","span":{"start":[93,1],"end":[93,81],"bytes":[2439,2519]}},{"name":"generation","type":"string","span":{"start":[93,1],"end":[93,81],"bytes":[2439,2519]}},{"name":"index","type":"int","span":{"start":[93,1],"end":[93,81],"bytes":[2439,2519]}},{"name":"offset","type":"int64","span":{"start":[93,1],"end":[93,81],"bytes":[2439,2519]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"94:19":{"kind":"call","span":{"start":[94,19],"end":[94,46],"bytes":[2538,2565]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALPathV3"},"94:48":{"kind":"call","span":{"start":[94,48],"end":[94,89],"bytes":[2567,2608]},"callee":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3"},"94:9":{"kind":"call","span":{"start":[94,9],"end":[94,90],"bytes":[2528,2609]},"callee":null}}}},"content_hash":"3bf323f796fa9b0118b9e5f58dc008d33d364a47dafdf1657d0333a57bf1e546"},"wal_reader.go":{"id":"can://go/litestream/wal_reader.go","kind":"module","span":{"start":[1,1],"end":[318,1],"bytes":[0,9615]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// WALReader wraps an io.Reader and parses SQLite WAL frames.\n//\n// This reader verifies the salt \u0026 checksum integrity while it reads. It does\n// not enforce transaction boundaries (i.e. it may return uncommitted frames).\n// It is the responsibility of the caller to handle this.\ntype WALReader struct {\n\tr io.ReaderAt\n\tframeN int\n\n\tbo binary.ByteOrder\n\tpageSize uint32\n\tseq uint32\n\n\tsalt1, salt2 uint32\n\tchksum1, chksum2 uint32\n\n\tlogger *slog.Logger\n}\n\n// NewWALReader returns a new instance of WALReader.\nfunc NewWALReader(rd io.ReaderAt, logger *slog.Logger) (*WALReader, error) {\n\tr := \u0026WALReader{r: rd, logger: logger}\n\tif err := r.readHeader(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn r, nil\n}\n\n// NewWALReaderWithOffset returns a new instance of WALReader at a given offset.\n// Salt must match or else no frames will be returned. Checksum calculated from\n// from previous page.\nfunc NewWALReaderWithOffset(ctx context.Context, rd io.ReaderAt, offset int64, salt1, salt2 uint32, logger *slog.Logger) (*WALReader, error) {\n\t// Ensure we are not starting on the first page since we need to read the previous.\n\tif offset \u003c= WALHeaderSize {\n\t\treturn nil, fmt.Errorf(\"offset (%d) must be greater than the wal header size (%d)\", offset, WALHeaderSize)\n\t}\n\n\tr := \u0026WALReader{r: rd, logger: logger}\n\n\t// Read header to determine page size \u0026 byte order.\n\tif err := r.readHeader(); err != nil {\n\t\treturn nil, fmt.Errorf(\"read header: %w\", err)\n\t}\n\n\t// Load in salt in case the beginning of the file has been overwritten.\n\tr.salt1, r.salt2 = salt1, salt2\n\n\t// Ensure offset is positioned on a frame start.\n\tframeSize := int64(r.pageSize + WALFrameHeaderSize)\n\tif (offset-WALHeaderSize)%frameSize != 0 {\n\t\treturn nil, fmt.Errorf(\"unaligned wal offset %d for page size %d\", offset, r.pageSize)\n\t}\n\tr.frameN = int((offset - WALHeaderSize) / frameSize)\n\n\t// Read previous page to load checksum. Context errors are returned as-is\n\t// so callers don't mistake a cancellation for a frame mismatch.\n\tr.frameN--\n\tif _, _, err := r.readFrame(ctx, make([]byte, r.pageSize), false); err != nil {\n\t\tif ctx.Err() != nil {\n\t\t\treturn nil, context.Cause(ctx)\n\t\t}\n\t\treturn nil, \u0026PrevFrameMismatchError{Err: err}\n\t}\n\n\treturn r, nil\n}\n\n// PageSize returns the page size from the header. Must call ReadHeader() first.\nfunc (r *WALReader) PageSize() uint32 { return r.pageSize }\n\n// Offset returns the file offset of the last read frame.\n// Returns zero if no frames have been read.\nfunc (r *WALReader) Offset() int64 {\n\tif r.frameN == 0 {\n\t\treturn 0\n\t}\n\treturn WALHeaderSize + ((int64(r.frameN) - 1) * (WALFrameHeaderSize + int64(r.pageSize)))\n}\n\n// readHeader reads the WAL header into the reader. Returns io.EOF if WAL is invalid.\nfunc (r *WALReader) readHeader() error {\n\t// If we have a partial WAL, then mark WAL as done.\n\thdr := make([]byte, WALHeaderSize)\n\tif n, err := r.r.ReadAt(hdr, 0); n \u003c len(hdr) {\n\t\treturn io.EOF\n\t} else if err != nil {\n\t\treturn err\n\t}\n\n\t// Determine byte order of checksums.\n\tswitch magic := binary.BigEndian.Uint32(hdr[0:]); magic {\n\tcase 0x377f0682:\n\t\tr.bo = binary.LittleEndian\n\tcase 0x377f0683:\n\t\tr.bo = binary.BigEndian\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid wal header magic: %x\", magic)\n\t}\n\n\t// If the header checksum doesn't match then we may have failed with\n\t// a partial WAL header write during checkpointing.\n\tchksum1 := binary.BigEndian.Uint32(hdr[24:])\n\tchksum2 := binary.BigEndian.Uint32(hdr[28:])\n\tif v0, v1 := WALChecksum(r.bo, 0, 0, hdr[:24]); v0 != chksum1 || v1 != chksum2 {\n\t\treturn io.EOF\n\t}\n\n\t// Verify version is correct.\n\tif version := binary.BigEndian.Uint32(hdr[4:]); version != 3007000 {\n\t\treturn fmt.Errorf(\"unsupported wal version: %d\", version)\n\t}\n\n\tr.pageSize = binary.BigEndian.Uint32(hdr[8:])\n\tr.seq = binary.BigEndian.Uint32(hdr[12:])\n\tr.salt1 = binary.BigEndian.Uint32(hdr[16:])\n\tr.salt2 = binary.BigEndian.Uint32(hdr[20:])\n\tr.chksum1, r.chksum2 = chksum1, chksum2\n\n\treturn nil\n}\n\n// ReadFrame reads the next frame from the WAL and returns the page number.\n// Returns io.EOF at the end of the valid WAL.\nfunc (r *WALReader) ReadFrame(ctx context.Context, data []byte) (pgno, commit uint32, err error) {\n\treturn r.readFrame(ctx, data, true)\n}\n\nfunc (r *WALReader) readFrame(ctx context.Context, data []byte, verifyChecksum bool) (pgno, commit uint32, err error) {\n\tselect {\n\tcase \u003c-ctx.Done():\n\t\treturn 0, 0, context.Cause(ctx)\n\tdefault:\n\t}\n\n\tif len(data) != int(r.pageSize) {\n\t\treturn 0, 0, fmt.Errorf(\"WALReader.ReadFrame(): buffer size (%d) must match page size (%d)\", len(data), r.pageSize)\n\t}\n\n\tframeSize := r.pageSize + WALFrameHeaderSize\n\toffset := WALHeaderSize + (int64(r.frameN) * int64(frameSize))\n\n\t// Read WAL frame header.\n\thdr := make([]byte, WALFrameHeaderSize)\n\tif n, err := r.r.ReadAt(hdr, offset); n != len(hdr) {\n\t\treturn 0, 0, io.EOF\n\t} else if err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// Read WAL page data.\n\tif n, err := r.r.ReadAt(data, offset+WALFrameHeaderSize); n != len(data) {\n\t\treturn 0, 0, io.EOF\n\t} else if err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// Verify salt matches the salt in the header.\n\tsalt1 := binary.BigEndian.Uint32(hdr[8:])\n\tsalt2 := binary.BigEndian.Uint32(hdr[12:])\n\tif r.salt1 != salt1 || r.salt2 != salt2 {\n\t\treturn 0, 0, io.EOF\n\t}\n\n\t// Verify the checksum is valid. If checksum verification is disabled, it\n\t// is because we are jumping to an offset and not checksumming from the beginning.\n\tchksum1 := binary.BigEndian.Uint32(hdr[16:])\n\tchksum2 := binary.BigEndian.Uint32(hdr[20:])\n\tif verifyChecksum {\n\t\tr.chksum1, r.chksum2 = WALChecksum(r.bo, r.chksum1, r.chksum2, hdr[:8]) // frame header\n\t\tr.chksum1, r.chksum2 = WALChecksum(r.bo, r.chksum1, r.chksum2, data) // frame data\n\t\tif r.chksum1 != chksum1 || r.chksum2 != chksum2 {\n\t\t\treturn 0, 0, io.EOF\n\t\t}\n\t} else {\n\t\tr.chksum1, r.chksum2 = chksum1, chksum2\n\t}\n\n\tpgno = binary.BigEndian.Uint32(hdr[0:])\n\tcommit = binary.BigEndian.Uint32(hdr[4:])\n\n\tr.frameN++\n\n\treturn pgno, commit, nil\n}\n\n// PageMap reads all committed frames until the end of the file and returns a\n// map of pgno to offset of the latest version of each page. Also returns the\n// max offset of the wal segment read, and the final database size, in pages.\nfunc (r *WALReader) PageMap(ctx context.Context) (m map[uint32]int64, maxOffset int64, commit uint32, err error) {\n\tm, maxOffset, commit, _, err = r.pageMap(ctx, 0)\n\treturn m, maxOffset, commit, err\n}\n\nfunc (r *WALReader) pageMap(ctx context.Context, maxBytes int64) (m map[uint32]int64, maxOffset int64, commit uint32, limited bool, err error) {\n\tm = make(map[uint32]int64)\n\ttxMap := make(map[uint32]int64)\n\tdata := make([]byte, r.pageSize)\n\tframeSize := int64(WALFrameHeaderSize + r.pageSize)\n\tstartOffset := WALHeaderSize + int64(r.frameN)*frameSize\n\tfor {\n\t\tpgno, fcommit, err := r.ReadFrame(ctx, data)\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn nil, 0, 0, false, err\n\t\t}\n\n\t\t// Update latest offset for the page for this transaction.\n\t\t// Pages should not be saved to full map until we know txn is committed.\n\t\toffset := r.Offset()\n\t\ttxMap[pgno] = offset\n\n\t\t// For commit records, transfer offsets to full map and update db size.\n\t\tif fcommit != 0 {\n\t\t\tfor pgno, offset := range txMap {\n\t\t\t\tm[pgno] = offset\n\t\t\t}\n\t\t\ttxMap = make(map[uint32]int64)\n\t\t\tcommit = fcommit\n\n\t\t\tif maxBytes \u003e 0 \u0026\u0026 r.Offset()+frameSize-startOffset \u003e= maxBytes {\n\t\t\t\tlimited = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove pages that exceed the final commit size. This can occur when the\n\t// database shrinks (e.g., via VACUUM) between transactions in the WAL.\n\tfor pgno := range m {\n\t\tif pgno \u003e commit {\n\t\t\tdelete(m, pgno)\n\t\t}\n\t}\n\n\t// If full transactions available, return the original offset.\n\tif len(m) == 0 {\n\t\treturn m, 0, 0, limited, nil\n\t}\n\n\t// Compute the highest page offsets.\n\tvar end int64\n\tfor _, offset := range m {\n\t\tif end == 0 || offset \u003e end {\n\t\t\tend = offset\n\t\t}\n\t}\n\n\t// Extend to the end of the last frame read.\n\tend += WALFrameHeaderSize + int64(r.pageSize)\n\n\tr.logger.Log(ctx, internal.LevelTrace, \"page map complete\", \"n\", len(m), \"end\", end, \"commit\", commit)\n\treturn m, end, commit, limited, nil\n}\n\n// FrameSaltsUntil returns a set of all unique frame salts in the WAL file.\nfunc (r *WALReader) FrameSaltsUntil(ctx context.Context, until [2]uint32) (map[[2]uint32]struct{}, error) {\n\tm := make(map[[2]uint32]struct{})\n\tfor offset := int64(WALHeaderSize); ; offset += int64(WALFrameHeaderSize + r.pageSize) {\n\t\thdr := make([]byte, WALFrameHeaderSize)\n\t\tif n, err := r.r.ReadAt(hdr, offset); n != len(hdr) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tsalt1 := binary.BigEndian.Uint32(hdr[8:])\n\t\tsalt2 := binary.BigEndian.Uint32(hdr[12:])\n\n\t\t// Track unique salts.\n\t\tm[[2]uint32{salt1, salt2}] = struct{}{}\n\n\t\t// Only read salts until the last one we expect.\n\t\tif salt1 == until[0] \u0026\u0026 salt2 == until[1] {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn m, nil\n}\n\n// WALChecksum computes a running SQLite WAL checksum over a byte slice.\nfunc WALChecksum(bo binary.ByteOrder, s0, s1 uint32, b []byte) (uint32, uint32) {\n\tassert(len(b)%8 == 0, \"misaligned checksum byte slice\")\n\n\t// Iterate over 8-byte units and compute checksum.\n\tfor i := 0; i \u003c len(b); i += 8 {\n\t\ts0 += bo.Uint32(b[i:]) + s1\n\t\ts1 += bo.Uint32(b[i+4:]) + s0\n\t}\n\treturn s0, s1\n}\n\ntype PrevFrameMismatchError struct {\n\tErr error\n}\n\nfunc (e *PrevFrameMismatchError) Error() string {\n\treturn fmt.Sprintf(\"prev frame mismatch: %s\", e.Err)\n}\n\nfunc (e *PrevFrameMismatchError) Unwrap() error {\n\treturn e.Err\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"binary","path":"encoding/binary","span":{"start":[5,1],"end":[5,19],"bytes":[40,58]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[59,68]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[69,75]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[76,81]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[82,93]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[11,1],"end":[11,46],"bytes":[95,140]}}],"types":{"PrevFrameMismatchError":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError","kind":"struct","span":{"start":[307,1],"end":[309,2],"bytes":[9391,9440]},"callables":{"github.com/benbjohnson/litestream.PrevFrameMismatchError.Error":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError/github.com/benbjohnson/litestream.PrevFrameMismatchError.Error","kind":"method","span":{"start":[311,1],"end":[313,2],"bytes":[9442,9547]},"signature":"github.com/benbjohnson/litestream.PrevFrameMismatchError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{"312:9":{"kind":"call","span":{"start":[312,9],"end":[312,54],"bytes":[9500,9545]},"callee":null}}},"github.com/benbjohnson/litestream.PrevFrameMismatchError.Unwrap":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError/github.com/benbjohnson/litestream.PrevFrameMismatchError.Unwrap","kind":"method","span":{"start":[315,1],"end":[317,2],"bytes":[9549,9614]},"signature":"github.com/benbjohnson/litestream.PrevFrameMismatchError.Unwrap","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"Err":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError/Err","kind":"field","type":"error","span":{"start":[308,1],"end":[308,11],"bytes":[9428,9438]}}}},"WALReader":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader","kind":"struct","span":{"start":[19,1],"end":[31,2],"bytes":[424,616]},"callables":{"github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil","kind":"method","span":{"start":[270,1],"end":[293,2],"bytes":[8330,9007]},"signature":"github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[270,1],"end":[270,108],"bytes":[8330,8437]}},{"name":"until","type":"[2]uint32","span":{"start":[270,1],"end":[270,108],"bytes":[8330,8437]}}],"return_type":"(map[[2]uint32]struct{}, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"271:7":{"kind":"call","span":{"start":[271,7],"end":[271,35],"bytes":[8444,8472]},"callee":null},"272:16":{"kind":"call","span":{"start":[272,16],"end":[272,36],"bytes":[8488,8508]},"callee":null},"272:50":{"kind":"call","span":{"start":[272,50],"end":[272,88],"bytes":[8522,8560]},"callee":null},"273:10":{"kind":"call","span":{"start":[273,10],"end":[273,42],"bytes":[8572,8604]},"callee":null},"274:16":{"kind":"call","span":{"start":[274,16],"end":[274,39],"bytes":[8620,8643]},"callee":null},"274:46":{"kind":"call","span":{"start":[274,46],"end":[274,54],"bytes":[8650,8658]},"callee":null},"280:12":{"kind":"call","span":{"start":[280,12],"end":[280,44],"bytes":[8730,8762]},"callee":null},"281:12":{"kind":"call","span":{"start":[281,12],"end":[281,45],"bytes":[8774,8807]},"callee":null}}},"github.com/benbjohnson/litestream.WALReader.Offset":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset","kind":"method","span":{"start":[86,1],"end":[91,2],"bytes":[2621,2784]},"signature":"github.com/benbjohnson/litestream.WALReader.Offset","parameters":[],"return_type":"int64","metrics":{"cyclomatic":2},"body":{"90:27":{"kind":"call","span":{"start":[90,27],"end":[90,42],"bytes":[2718,2733]},"callee":null},"90:72":{"kind":"call","span":{"start":[90,72],"end":[90,89],"bytes":[2763,2780]},"callee":null}}},"github.com/benbjohnson/litestream.WALReader.PageMap":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.PageMap","kind":"method","span":{"start":[202,1],"end":[205,2],"bytes":[6328,6528]},"signature":"github.com/benbjohnson/litestream.WALReader.PageMap","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[202,1],"end":[202,115],"bytes":[6328,6442]}}],"return_type":"(map[uint32]int64, int64, uint32, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"203:33":{"kind":"call","span":{"start":[203,33],"end":[203,50],"bytes":[6475,6492]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap"}}},"github.com/benbjohnson/litestream.WALReader.PageSize":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.PageSize","kind":"method","span":{"start":[82,1],"end":[82,60],"bytes":[2457,2516]},"signature":"github.com/benbjohnson/litestream.WALReader.PageSize","parameters":[],"return_type":"uint32","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.WALReader.ReadFrame":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame","kind":"method","span":{"start":[137,1],"end":[139,2],"bytes":[4212,4349]},"signature":"github.com/benbjohnson/litestream.WALReader.ReadFrame","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[137,1],"end":[137,99],"bytes":[4212,4310]}},{"name":"data","type":"[]byte","span":{"start":[137,1],"end":[137,99],"bytes":[4212,4310]}}],"return_type":"(uint32, uint32, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"138:9":{"kind":"call","span":{"start":[138,9],"end":[138,37],"bytes":[4319,4347]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame"}}},"github.com/benbjohnson/litestream.WALReader.pageMap":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","kind":"method","span":{"start":[207,1],"end":[267,2],"bytes":[6530,8252]},"signature":"github.com/benbjohnson/litestream.WALReader.pageMap","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[207,1],"end":[207,145],"bytes":[6530,6674]}},{"name":"maxBytes","type":"int64","span":{"start":[207,1],"end":[207,145],"bytes":[6530,6674]}}],"return_type":"(map[uint32]int64, int64, uint32, bool, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"208:6":{"kind":"call","span":{"start":[208,6],"end":[208,28],"bytes":[6680,6702]},"callee":null},"209:11":{"kind":"call","span":{"start":[209,11],"end":[209,33],"bytes":[6713,6735]},"callee":null},"210:10":{"kind":"call","span":{"start":[210,10],"end":[210,34],"bytes":[6745,6769]},"callee":null},"211:15":{"kind":"call","span":{"start":[211,15],"end":[211,53],"bytes":[6784,6822]},"callee":null},"212:33":{"kind":"call","span":{"start":[212,33],"end":[212,48],"bytes":[6855,6870]},"callee":null},"214:25":{"kind":"call","span":{"start":[214,25],"end":[214,47],"bytes":[6912,6934]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame"},"215:6":{"kind":"call","span":{"start":[215,6],"end":[215,28],"bytes":[6940,6962]},"callee":null},"223:13":{"kind":"call","span":{"start":[223,13],"end":[223,23],"bytes":[7184,7194]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset"},"231:12":{"kind":"call","span":{"start":[231,12],"end":[231,34],"bytes":[7387,7409]},"callee":null},"234:23":{"kind":"call","span":{"start":[234,23],"end":[234,33],"bytes":[7453,7463]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset"},"245:4":{"kind":"call","span":{"start":[245,4],"end":[245,19],"bytes":[7738,7753]},"callee":null},"250:5":{"kind":"call","span":{"start":[250,5],"end":[250,11],"bytes":[7830,7836]},"callee":null},"263:30":{"kind":"call","span":{"start":[263,30],"end":[263,47],"bytes":[8091,8108]},"callee":null},"265:2":{"kind":"call","span":{"start":[265,2],"end":[265,104],"bytes":[8111,8213]},"callee":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded"},"265:67":{"kind":"call","span":{"start":[265,67],"end":[265,73],"bytes":[8176,8182]},"callee":null}}},"github.com/benbjohnson/litestream.WALReader.readFrame":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","kind":"method","span":{"start":[141,1],"end":[197,2],"bytes":[4351,6092]},"signature":"github.com/benbjohnson/litestream.WALReader.readFrame","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[141,1],"end":[141,120],"bytes":[4351,4470]}},{"name":"data","type":"[]byte","span":{"start":[141,1],"end":[141,120],"bytes":[4351,4470]}},{"name":"verifyChecksum","type":"bool","span":{"start":[141,1],"end":[141,120],"bytes":[4351,4470]}}],"return_type":"(uint32, uint32, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"143:9":{"kind":"call","span":{"start":[143,9],"end":[143,19],"bytes":[4489,4499]},"callee":null},"144:16":{"kind":"call","span":{"start":[144,16],"end":[144,34],"bytes":[4516,4534]},"callee":null},"148:18":{"kind":"call","span":{"start":[148,18],"end":[148,33],"bytes":[4566,4581]},"callee":null},"148:5":{"kind":"call","span":{"start":[148,5],"end":[148,14],"bytes":[4553,4562]},"callee":null},"149:16":{"kind":"call","span":{"start":[149,16],"end":[149,118],"bytes":[4599,4701]},"callee":null},"149:96":{"kind":"call","span":{"start":[149,96],"end":[149,105],"bytes":[4679,4688]},"callee":null},"153:29":{"kind":"call","span":{"start":[153,29],"end":[153,44],"bytes":[4780,4795]},"callee":null},"153:47":{"kind":"call","span":{"start":[153,47],"end":[153,63],"bytes":[4798,4814]},"callee":null},"156:9":{"kind":"call","span":{"start":[156,9],"end":[156,41],"bytes":[4852,4884]},"callee":null},"157:15":{"kind":"call","span":{"start":[157,15],"end":[157,38],"bytes":[4899,4922]},"callee":null},"157:45":{"kind":"call","span":{"start":[157,45],"end":[157,53],"bytes":[4929,4937]},"callee":null},"164:15":{"kind":"call","span":{"start":[164,15],"end":[164,58],"bytes":[5047,5090]},"callee":null},"164:65":{"kind":"call","span":{"start":[164,65],"end":[164,74],"bytes":[5097,5106]},"callee":null},"171:11":{"kind":"call","span":{"start":[171,11],"end":[171,43],"bytes":[5236,5268]},"callee":null},"172:11":{"kind":"call","span":{"start":[172,11],"end":[172,44],"bytes":[5279,5312]},"callee":null},"179:13":{"kind":"call","span":{"start":[179,13],"end":[179,46],"bytes":[5553,5586]},"callee":null},"180:13":{"kind":"call","span":{"start":[180,13],"end":[180,46],"bytes":[5599,5632]},"callee":null},"182:26":{"kind":"call","span":{"start":[182,26],"end":[182,74],"bytes":[5679,5727]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum"},"183:26":{"kind":"call","span":{"start":[183,26],"end":[183,71],"bytes":[5769,5814]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum"},"191:9":{"kind":"call","span":{"start":[191,9],"end":[191,41],"bytes":[5975,6007]},"callee":null},"192:11":{"kind":"call","span":{"start":[192,11],"end":[192,43],"bytes":[6018,6050]},"callee":null}}},"github.com/benbjohnson/litestream.WALReader.readHeader":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","kind":"method","span":{"start":[94,1],"end":[133,2],"bytes":[2872,4087]},"signature":"github.com/benbjohnson/litestream.WALReader.readHeader","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"104:18":{"kind":"call","span":{"start":[104,18],"end":[104,50],"bytes":[3164,3196]},"callee":null},"110:10":{"kind":"call","span":{"start":[110,10],"end":[110,59],"bytes":[3316,3365]},"callee":null},"115:13":{"kind":"call","span":{"start":[115,13],"end":[115,46],"bytes":[3505,3538]},"callee":null},"116:13":{"kind":"call","span":{"start":[116,13],"end":[116,46],"bytes":[3551,3584]},"callee":null},"117:15":{"kind":"call","span":{"start":[117,15],"end":[117,48],"bytes":[3599,3632]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum"},"122:16":{"kind":"call","span":{"start":[122,16],"end":[122,48],"bytes":[3733,3765]},"callee":null},"123:10":{"kind":"call","span":{"start":[123,10],"end":[123,60],"bytes":[3797,3847]},"callee":null},"126:15":{"kind":"call","span":{"start":[126,15],"end":[126,47],"bytes":[3866,3898]},"callee":null},"127:10":{"kind":"call","span":{"start":[127,10],"end":[127,43],"bytes":[3908,3941]},"callee":null},"128:12":{"kind":"call","span":{"start":[128,12],"end":[128,45],"bytes":[3953,3986]},"callee":null},"129:12":{"kind":"call","span":{"start":[129,12],"end":[129,45],"bytes":[3998,4031]},"callee":null},"96:9":{"kind":"call","span":{"start":[96,9],"end":[96,36],"bytes":[2974,3001]},"callee":null},"97:15":{"kind":"call","span":{"start":[97,15],"end":[97,33],"bytes":[3016,3034]},"callee":null},"97:39":{"kind":"call","span":{"start":[97,39],"end":[97,47],"bytes":[3040,3048]},"callee":null}}}},"fields":{"bo":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/bo","kind":"field","type":"encoding/binary.ByteOrder","span":{"start":[23,1],"end":[23,27],"bytes":[481,507]}},"chksum1":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/chksum1","kind":"field","type":"uint32","span":{"start":[28,1],"end":[28,25],"bytes":[568,592]}},"chksum2":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/chksum2","kind":"field","type":"uint32","span":{"start":[28,1],"end":[28,25],"bytes":[568,592]}},"frameN":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/frameN","kind":"field","type":"int","span":{"start":[21,1],"end":[21,12],"bytes":[468,479]}},"logger":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[30,1],"end":[30,21],"bytes":[594,614]}},"pageSize":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/pageSize","kind":"field","type":"uint32","span":{"start":[24,1],"end":[24,17],"bytes":[508,524]}},"r":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/r","kind":"field","type":"io.ReaderAt","span":{"start":[20,1],"end":[20,20],"bytes":[448,467]}},"salt1":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/salt1","kind":"field","type":"uint32","span":{"start":[27,1],"end":[27,25],"bytes":[543,567]}},"salt2":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/salt2","kind":"field","type":"uint32","span":{"start":[27,1],"end":[27,25],"bytes":[543,567]}},"seq":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/seq","kind":"field","type":"uint32","span":{"start":[25,1],"end":[25,17],"bytes":[525,541]}}}}},"functions":{"github.com/benbjohnson/litestream.NewWALReader":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","kind":"function","span":{"start":[34,1],"end":[40,2],"bytes":[671,865]},"signature":"github.com/benbjohnson/litestream.NewWALReader","parameters":[{"name":"rd","type":"io.ReaderAt","span":{"start":[34,1],"end":[34,77],"bytes":[671,747]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[34,1],"end":[34,77],"bytes":[671,747]}}],"return_type":"(*github.com/benbjohnson/litestream.WALReader, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"36:12":{"kind":"call","span":{"start":[36,12],"end":[36,26],"bytes":[799,813]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader"}}},"github.com/benbjohnson/litestream.NewWALReaderWithOffset":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","kind":"function","span":{"start":[45,1],"end":[79,2],"bytes":[1051,2374]},"signature":"github.com/benbjohnson/litestream.NewWALReaderWithOffset","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"rd","type":"io.ReaderAt","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"offset","type":"int64","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"salt1","type":"uint32","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"salt2","type":"uint32","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}}],"return_type":"(*github.com/benbjohnson/litestream.WALReader, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"48:15":{"kind":"call","span":{"start":[48,15],"end":[48,109],"bytes":[1323,1417]},"callee":null},"54:12":{"kind":"call","span":{"start":[54,12],"end":[54,26],"bytes":[1527,1541]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader"},"55:15":{"kind":"call","span":{"start":[55,15],"end":[55,49],"bytes":[1570,1604]},"callee":null},"62:15":{"kind":"call","span":{"start":[62,15],"end":[62,53],"bytes":[1780,1818]},"callee":null},"64:15":{"kind":"call","span":{"start":[64,15],"end":[64,89],"bytes":[1877,1951]},"callee":null},"66:13":{"kind":"call","span":{"start":[66,13],"end":[66,54],"bytes":[1967,2008]},"callee":null},"71:18":{"kind":"call","span":{"start":[71,18],"end":[71,67],"bytes":[2180,2229]},"callee":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame"},"71:35":{"kind":"call","span":{"start":[71,35],"end":[71,59],"bytes":[2197,2221]},"callee":null},"72:6":{"kind":"call","span":{"start":[72,6],"end":[72,15],"bytes":[2249,2258]},"callee":null},"73:16":{"kind":"call","span":{"start":[73,16],"end":[73,34],"bytes":[2283,2301]},"callee":null}}},"github.com/benbjohnson/litestream.WALChecksum":{"id":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","kind":"function","span":{"start":[296,1],"end":[305,2],"bytes":[9082,9389]},"signature":"github.com/benbjohnson/litestream.WALChecksum","parameters":[{"name":"bo","type":"encoding/binary.ByteOrder","span":{"start":[296,1],"end":[296,82],"bytes":[9082,9163]}},{"name":"s0","type":"uint32","span":{"start":[296,1],"end":[296,82],"bytes":[9082,9163]}},{"name":"s1","type":"uint32","span":{"start":[296,1],"end":[296,82],"bytes":[9082,9163]}},{"name":"b","type":"[]byte","span":{"start":[296,1],"end":[296,82],"bytes":[9082,9163]}}],"return_type":"(uint32, uint32)","metrics":{"cyclomatic":2},"body":{"297:2":{"kind":"call","span":{"start":[297,2],"end":[297,57],"bytes":[9165,9220]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert"},"297:9":{"kind":"call","span":{"start":[297,9],"end":[297,15],"bytes":[9172,9178]},"callee":null},"300:18":{"kind":"call","span":{"start":[300,18],"end":[300,24],"bytes":[9291,9297]},"callee":null},"301:9":{"kind":"call","span":{"start":[301,9],"end":[301,25],"bytes":[9316,9332]},"callee":null},"302:9":{"kind":"call","span":{"start":[302,9],"end":[302,27],"bytes":[9346,9364]},"callee":null}}}},"content_hash":"00f72ee5d55ca0780b8d6725f51cf1c0a5be718454fba7b3cfd642b4749a3297"},"webdav/replica_client.go":{"id":"can://go/litestream/webdav/replica_client.go","kind":"module","span":{"start":[1,1],"end":[372,1],"bytes":[0,10831]},"package":"webdav","source":"package webdav\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/studio-b12/gowebdav\"\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"webdav\", NewReplicaClientFromURL)\n\tlitestream.RegisterReplicaClientFactory(\"webdavs\", NewReplicaClientFromURL)\n}\n\nconst ReplicaClientType = \"webdav\"\n\nconst (\n\tDefaultTimeout = 30 * time.Second\n)\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tclient *gowebdav.Client\n\tlogger *slog.Logger\n\n\tURL string\n\tUsername string\n\tPassword string\n\tPath string\n\tTimeout time.Duration\n}\n\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tTimeout: DefaultTimeout,\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: webdav://[user[:password]@]host[:port]/path or webdavs://... (for HTTPS)\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\t// Determine HTTP or HTTPS based on scheme\n\thttpScheme := \"http\"\n\tif scheme == \"webdavs\" {\n\t\thttpScheme = \"https\"\n\t}\n\n\t// Extract credentials from userinfo\n\tif userinfo != nil {\n\t\tclient.Username = userinfo.Username()\n\t\tclient.Password, _ = userinfo.Password()\n\t}\n\n\tif host == \"\" {\n\t\treturn nil, fmt.Errorf(\"host required for webdav replica URL\")\n\t}\n\n\tclient.URL = fmt.Sprintf(\"%s://%s\", httpScheme, host)\n\tclient.Path = urlPath\n\n\treturn client, nil\n}\n\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\t_, err := c.init(ctx)\n\treturn err\n}\n\n// init initializes the connection and returns the WebDAV client.\nfunc (c *ReplicaClient) init(ctx context.Context) (_ *gowebdav.Client, err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.client != nil {\n\t\treturn c.client, nil\n\t}\n\n\tif c.URL == \"\" {\n\t\treturn nil, fmt.Errorf(\"webdav url required\")\n\t}\n\n\tc.client = gowebdav.NewClient(c.URL, c.Username, c.Password)\n\n\tc.client.SetTimeout(c.Timeout)\n\n\tif err := c.client.Connect(); err != nil {\n\t\tc.client = nil\n\t\treturn nil, fmt.Errorf(\"webdav: cannot connect to server: %w\", err)\n\t}\n\n\treturn c.client, nil\n}\n\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := client.RemoveAll(c.Path); err != nil \u0026\u0026 !os.IsNotExist(err) \u0026\u0026 !gowebdav.IsErrNotFound(err) {\n\t\treturn fmt.Errorf(\"webdav: cannot delete path %q: %w\", c.Path, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\n\treturn nil\n}\n\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, _ bool) (_ ltx.FileIterator, err error) {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdir := litestream.LTXLevelDir(c.Path, level)\n\tfiles, err := client.ReadDir(dir)\n\tif err != nil {\n\t\tif os.IsNotExist(err) || gowebdav.IsErrNotFound(err) {\n\t\t\treturn ltx.NewFileInfoSliceIterator(nil), nil\n\t\t}\n\t\treturn nil, fmt.Errorf(\"webdav: cannot read directory %q: %w\", dir, err)\n\t}\n\n\tinfos := make([]*ltx.FileInfo, 0, len(files))\n\tfor _, fi := range files {\n\t\tif fi.IsDir() {\n\t\t\tcontinue\n\t\t}\n\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(path.Base(fi.Name()))\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t} else if minTXID \u003c seek {\n\t\t\tcontinue\n\t\t}\n\n\t\tinfos = append(infos, \u0026ltx.FileInfo{\n\t\t\tLevel: level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: fi.Size(),\n\t\t\tCreatedAt: fi.ModTime().UTC(),\n\t\t})\n\t}\n\n\tsort.Slice(infos, func(i, j int) bool {\n\t\tif infos[i].MinTXID != infos[j].MinTXID {\n\t\t\treturn infos[i].MinTXID \u003c infos[j].MinTXID\n\t\t}\n\t\treturn infos[i].MaxTXID \u003c infos[j].MaxTXID\n\t})\n\n\treturn ltx.NewFileInfoSliceIterator(infos), nil\n}\n\n// WriteLTXFile writes an LTX file to the WebDAV server.\n//\n// WebDAV Upload Strategy - Temp File Approach:\n//\n// Unlike other replica backends (S3, SFTP, NATS, ABS) which stream directly using\n// internal.NewReadCounter, WebDAV requires a different approach due to library and\n// protocol constraints:\n//\n// 1. gowebdav Library Limitations:\n//\n// - WriteStream() buffers entire payload in memory for non-seekable readers\n//\n// - WriteStreamWithLength() requires both content-length AND seekable reader\n//\n// - No native support for HTTP chunked transfer encoding\n//\n// 2. Server Compatibility Issues:\n// Research shows HTTP chunked transfer encoding with WebDAV is unreliable:\n//\n// - Nginx + FastCGI: Discards request body → 0-byte files (silent data loss)\n//\n// - Lighttpd: Returns HTTP 411 (Length Required), rejects chunked requests\n//\n// - Apache + FastCGI: Request body never arrives at application\n//\n// - Only Apache + mod_php handles chunked encoding reliably (~30-40% of deployments)\n//\n// 3. LTX Header Requirement:\n// - Must peek at LTX header to extract timestamp before upload\n// - Peeking consumes data, making the reader non-seekable\n// - Cannot calculate content-length without fully reading stream\n//\n// Solution: Stage to temporary file\n//\n// To ensure universal compatibility and prevent silent data loss:\n// 1. Extract timestamp from LTX header (required for file metadata)\n// 2. Stream full contents to temporary file on disk\n// 3. Seek back to start of temp file (now seekable + known size)\n// 4. Upload using WriteStreamWithLength() with Content-Length header\n// 5. Clean up temp file\n//\n// Trade-offs:\n// - Universal compatibility with all WebDAV server configurations\n// - No risk of silent data loss or failed uploads\n// - Predictable, reliable behavior\n// - Additional disk I/O overhead\n// - Requires local disk space proportional to LTX file size\n// - Diverges from streaming pattern used by other backends\n//\n// References:\n// - https://github.com/studio-b12/gowebdav/issues/35 (chunked encoding issues)\n// - https://github.com/nextcloud/server/issues/7995 (0-byte file bug)\n// - https://evertpot.com/260/ (WebDAV chunked encoding compatibility)\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Stage to temporary file to get seekable reader with known size.\n\t// This ensures compatibility with all WebDAV servers and avoids the\n\t// unreliable chunked transfer encoding that causes silent data loss\n\t// on common configurations (Nginx+FastCGI, Lighttpd, Apache+FastCGI).\n\ttmpFile, err := os.CreateTemp(\"\", \"litestream-webdav-*.ltx\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot create temp file: %w\", err)\n\t}\n\tdefer func() {\n\t\t_ = tmpFile.Close()\n\t\t_ = os.Remove(tmpFile.Name())\n\t}()\n\n\tfullReader := io.MultiReader(\u0026buf, rd)\n\n\tsize, err := io.Copy(tmpFile, fullReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot copy to temp file: %w\", err)\n\t}\n\n\tif _, err := tmpFile.Seek(0, io.SeekStart); err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot seek temp file: %w\", err)\n\t}\n\n\tif err := client.MkdirAll(path.Dir(filename), 0755); err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot create parent directory %q: %w\", path.Dir(filename), err)\n\t}\n\n\t// Upload with Content-Length header using seekable temp file.\n\t// WriteStreamWithLength requires both a seekable reader and known size,\n\t// which we now have from the temp file. This avoids chunked encoding\n\t// and ensures reliable uploads across all WebDAV server configurations.\n\tif err := client.WriteStreamWithLength(filename, tmpFile, size, 0644); err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot write file %q: %w\", filename, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(size))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: size,\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (_ io.ReadCloser, err error) {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\n\tif size \u003e 0 {\n\t\trc, err := client.ReadStreamRange(filename, offset, size)\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) || gowebdav.IsErrNotFound(err) {\n\t\t\t\treturn nil, os.ErrNotExist\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"webdav: cannot read file %q: %w\", filename, err)\n\t\t}\n\t\treturn internal.LimitReadCloser(rc, size), nil\n\t}\n\n\tif offset \u003e 0 {\n\t\trc, err := client.ReadStream(filename)\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) || gowebdav.IsErrNotFound(err) {\n\t\t\t\treturn nil, os.ErrNotExist\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"webdav: cannot read file %q: %w\", filename, err)\n\t\t}\n\n\t\tif _, err := io.CopyN(io.Discard, rc, offset); err != nil {\n\t\t\tif err == io.EOF || err == io.ErrUnexpectedEOF {\n\t\t\t\t_ = rc.Close()\n\t\t\t\treturn io.NopCloser(bytes.NewReader(nil)), nil\n\t\t\t}\n\t\t\t_ = rc.Close()\n\t\t\treturn nil, fmt.Errorf(\"webdav: cannot skip offset in file %q: %w\", filename, err)\n\t\t}\n\n\t\treturn rc, nil\n\t}\n\n\trc, err := client.ReadStream(filename)\n\tif err != nil {\n\t\tif os.IsNotExist(err) || gowebdav.IsErrNotFound(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"webdav: cannot read file %q: %w\", filename, err)\n\t}\n\treturn rc, nil\n}\n\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, info := range a {\n\t\tfilename := litestream.LTXFilePath(c.Path, info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", filename)\n\n\t\tif err := client.Remove(filename); err != nil \u0026\u0026 !os.IsNotExist(err) \u0026\u0026 !gowebdav.IsErrNotFound(err) {\n\t\t\treturn fmt.Errorf(\"webdav: cannot delete ltx file %q: %w\", filename, err)\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[25,33]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[34,44]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[45,51]}},{"name":"io","path":"io","span":{"start":[7,1],"end":[7,6],"bytes":[52,57]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[58,69]}},{"name":"url","path":"net/url","span":{"start":[9,1],"end":[9,11],"bytes":[70,80]}},{"name":"os","path":"os","span":{"start":[10,1],"end":[10,6],"bytes":[81,86]}},{"name":"path","path":"path","span":{"start":[11,1],"end":[11,8],"bytes":[87,94]}},{"name":"sort","path":"sort","span":{"start":[12,1],"end":[12,8],"bytes":[95,102]}},{"name":"sync","path":"sync","span":{"start":[13,1],"end":[13,8],"bytes":[103,110]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[111,118]}},{"name":"gowebdav","path":"github.com/studio-b12/gowebdav","span":{"start":[16,1],"end":[16,34],"bytes":[120,153]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[17,1],"end":[17,27],"bytes":[154,180]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[19,1],"end":[19,37],"bytes":[182,218]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[20,1],"end":[20,46],"bytes":[219,264]}}],"types":{"ReplicaClient":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient","kind":"struct","span":{"start":[36,1],"end":[46,2],"bytes":[576,763]},"callables":{"github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll","kind":"method","span":{"start":[121,1],"end":[134,2],"bytes":[2598,3002]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[121,1],"end":[121,63],"bytes":[2598,2660]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"122:17":{"kind":"call","span":{"start":[122,17],"end":[122,28],"bytes":[2677,2688]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"127:12":{"kind":"call","span":{"start":[127,12],"end":[127,36],"bytes":[2734,2758]},"callee":null},"127:53":{"kind":"call","span":{"start":[127,53],"end":[127,71],"bytes":[2775,2793]},"callee":null},"127:76":{"kind":"call","span":{"start":[127,76],"end":[127,103],"bytes":[2798,2825]},"callee":null},"128:10":{"kind":"call","span":{"start":[128,10],"end":[128,70],"bytes":[2837,2897]},"callee":null},"131:2":{"kind":"call","span":{"start":[131,2],"end":[131,80],"bytes":[2903,2981]},"callee":null}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[353,1],"end":[371,2],"bytes":[10151,10830]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[353,1],"end":[353,87],"bytes":[10151,10237]}},{"name":"a","type":"[]*github.com/superfly/ltx.FileInfo","span":{"start":[353,1],"end":[353,87],"bytes":[10151,10237]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"354:17":{"kind":"call","span":{"start":[354,17],"end":[354,28],"bytes":[10254,10265]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"360:15":{"kind":"call","span":{"start":[360,15],"end":[360,85],"bytes":[10340,10410]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"362:3":{"kind":"call","span":{"start":[362,3],"end":[362,127],"bytes":[10414,10538]},"callee":null},"364:13":{"kind":"call","span":{"start":[364,13],"end":[364,36],"bytes":[10552,10575]},"callee":null},"364:53":{"kind":"call","span":{"start":[364,53],"end":[364,71],"bytes":[10592,10610]},"callee":null},"364:76":{"kind":"call","span":{"start":[364,76],"end":[364,103],"bytes":[10615,10642]},"callee":null},"365:11":{"kind":"call","span":{"start":[365,11],"end":[365,77],"bytes":[10655,10721]},"callee":null},"367:3":{"kind":"call","span":{"start":[367,3],"end":[367,81],"bytes":[10728,10806]},"callee":null}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.Init":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.Init","kind":"method","span":{"start":[91,1],"end":[94,2],"bytes":[1942,2036]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[91,1],"end":[91,58],"bytes":[1942,1999]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"92:12":{"kind":"call","span":{"start":[92,12],"end":[92,23],"bytes":[2011,2022]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","kind":"method","span":{"start":[136,1],"end":[181,2],"bytes":[3004,4142]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[136,1],"end":[136,122],"bytes":[3004,3125]}},{"name":"level","type":"int","span":{"start":[136,1],"end":[136,122],"bytes":[3004,3125]}},{"name":"seek","type":"github.com/superfly/ltx.TXID","span":{"start":[136,1],"end":[136,122],"bytes":[3004,3125]}},{"name":"_","type":"bool","span":{"start":[136,1],"end":[136,122],"bytes":[3004,3125]}}],"return_type":"(github.com/superfly/ltx.FileIterator, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"137:17":{"kind":"call","span":{"start":[137,17],"end":[137,28],"bytes":[3142,3153]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"142:9":{"kind":"call","span":{"start":[142,9],"end":[142,46],"bytes":[3201,3238]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"143:16":{"kind":"call","span":{"start":[143,16],"end":[143,35],"bytes":[3254,3273]},"callee":null},"145:28":{"kind":"call","span":{"start":[145,28],"end":[145,55],"bytes":[3318,3345]},"callee":null},"145:6":{"kind":"call","span":{"start":[145,6],"end":[145,24],"bytes":[3296,3314]},"callee":null},"146:11":{"kind":"call","span":{"start":[146,11],"end":[146,44],"bytes":[3358,3391]},"callee":null},"148:15":{"kind":"call","span":{"start":[148,15],"end":[148,75],"bytes":[3415,3475]},"callee":null},"151:11":{"kind":"call","span":{"start":[151,11],"end":[151,47],"bytes":[3490,3526]},"callee":null},"151:36":{"kind":"call","span":{"start":[151,36],"end":[151,46],"bytes":[3515,3525]},"callee":null},"153:6":{"kind":"call","span":{"start":[153,6],"end":[153,16],"bytes":[3560,3570]},"callee":null},"157:28":{"kind":"call","span":{"start":[157,28],"end":[157,67],"bytes":[3617,3656]},"callee":null},"157:46":{"kind":"call","span":{"start":[157,46],"end":[157,66],"bytes":[3635,3655]},"callee":null},"157:56":{"kind":"call","span":{"start":[157,56],"end":[157,65],"bytes":[3645,3654]},"callee":null},"164:11":{"kind":"call","span":{"start":[164,11],"end":[170,5],"bytes":[3743,3902]},"callee":null},"168:15":{"kind":"call","span":{"start":[168,15],"end":[168,24],"bytes":[3853,3862]},"callee":null},"169:15":{"kind":"call","span":{"start":[169,15],"end":[169,27],"bytes":[3878,3890]},"callee":null},"173:2":{"kind":"call","span":{"start":[173,2],"end":[178,4],"bytes":[3908,4090]},"callee":null},"180:9":{"kind":"call","span":{"start":[180,9],"end":[180,44],"bytes":[4100,4135]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles.closure_1","kind":"function","span":{"start":[173,1],"end":[178,4],"bytes":[3907,4090]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles.closure_1","parameters":[{"name":"i","type":"int","span":{"start":[173,1],"end":[173,41],"bytes":[3907,3947]}},{"name":"j","type":"int","span":{"start":[173,1],"end":[173,41],"bytes":[3907,3947]}}],"return_type":"bool","body":{}}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[301,1],"end":[351,2],"bytes":[8649,10149]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"level","type":"int","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"offset","type":"int64","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"size","type":"int64","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"302:17":{"kind":"call","span":{"start":[302,17],"end":[302,28],"bytes":[8811,8822]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"307:14":{"kind":"call","span":{"start":[307,14],"end":[307,69],"bytes":[8875,8930]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"309:2":{"kind":"call","span":{"start":[309,2],"end":[309,77],"bytes":[8933,9008]},"callee":null},"312:14":{"kind":"call","span":{"start":[312,14],"end":[312,60],"bytes":[9044,9090]},"callee":null},"314:29":{"kind":"call","span":{"start":[314,29],"end":[314,56],"bytes":[9137,9164]},"callee":null},"314:7":{"kind":"call","span":{"start":[314,7],"end":[314,25],"bytes":[9115,9133]},"callee":null},"317:16":{"kind":"call","span":{"start":[317,16],"end":[317,76],"bytes":[9218,9278]},"callee":null},"319:10":{"kind":"call","span":{"start":[319,10],"end":[319,44],"bytes":[9292,9326]},"callee":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser"},"323:14":{"kind":"call","span":{"start":[323,14],"end":[323,41],"bytes":[9366,9393]},"callee":null},"325:29":{"kind":"call","span":{"start":[325,29],"end":[325,56],"bytes":[9440,9467]},"callee":null},"325:7":{"kind":"call","span":{"start":[325,7],"end":[325,25],"bytes":[9418,9436]},"callee":null},"328:16":{"kind":"call","span":{"start":[328,16],"end":[328,76],"bytes":[9521,9581]},"callee":null},"331:16":{"kind":"call","span":{"start":[331,16],"end":[331,48],"bytes":[9602,9634]},"callee":null},"333:9":{"kind":"call","span":{"start":[333,9],"end":[333,19],"bytes":[9709,9719]},"callee":null},"334:12":{"kind":"call","span":{"start":[334,12],"end":[334,46],"bytes":[9731,9765]},"callee":null},"334:25":{"kind":"call","span":{"start":[334,25],"end":[334,45],"bytes":[9744,9764]},"callee":null},"336:8":{"kind":"call","span":{"start":[336,8],"end":[336,18],"bytes":[9783,9793]},"callee":null},"337:16":{"kind":"call","span":{"start":[337,16],"end":[337,86],"bytes":[9809,9879]},"callee":null},"343:13":{"kind":"call","span":{"start":[343,13],"end":[343,40],"bytes":[9918,9945]},"callee":null},"345:28":{"kind":"call","span":{"start":[345,28],"end":[345,55],"bytes":[9990,10017]},"callee":null},"345:6":{"kind":"call","span":{"start":[345,6],"end":[345,24],"bytes":[9968,9986]},"callee":null},"348:15":{"kind":"call","span":{"start":[348,15],"end":[348,75],"bytes":[10068,10128]},"callee":null}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.SetLogger":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.SetLogger","kind":"method","span":{"start":[55,1],"end":[57,2],"bytes":[919,1025]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[55,1],"end":[55,57],"bytes":[919,975]}}],"metrics":{"cyclomatic":1},"body":{"56:13":{"kind":"call","span":{"start":[56,13],"end":[56,48],"bytes":[988,1023]},"callee":null}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.Type":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.Type","kind":"method","span":{"start":[87,1],"end":[89,2],"bytes":[1873,1940]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[236,1],"end":[299,2],"bytes":[6374,8647]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}},{"name":"level","type":"int","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}},{"name":"minTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}},{"name":"maxTXID","type":"github.com/superfly/ltx.TXID","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}},{"name":"rd","type":"io.Reader","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}}],"return_type":"(*github.com/superfly/ltx.FileInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"237:17":{"kind":"call","span":{"start":[237,17],"end":[237,28],"bytes":[6534,6545]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"242:14":{"kind":"call","span":{"start":[242,14],"end":[242,69],"bytes":[6598,6653]},"callee":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"245:15":{"kind":"call","span":{"start":[245,15],"end":[245,37],"bytes":[6691,6713]},"callee":null},"247:17":{"kind":"call","span":{"start":[247,17],"end":[247,42],"bytes":[6731,6756]},"callee":null},"249:15":{"kind":"call","span":{"start":[249,15],"end":[249,71],"bytes":[6788,6844]},"callee":null},"251:15":{"kind":"call","span":{"start":[251,15],"end":[251,44],"bytes":[6862,6891]},"callee":null},"257:18":{"kind":"call","span":{"start":[257,18],"end":[257,62],"bytes":[7196,7240]},"callee":null},"259:15":{"kind":"call","span":{"start":[259,15],"end":[259,69],"bytes":[7272,7326]},"callee":null},"261:8":{"kind":"call","span":{"start":[261,8],"end":[264,5],"bytes":[7337,7404]},"callee":null},"266:16":{"kind":"call","span":{"start":[266,16],"end":[266,40],"bytes":[7421,7445]},"callee":null},"268:15":{"kind":"call","span":{"start":[268,15],"end":[268,43],"bytes":[7461,7489]},"callee":null},"270:15":{"kind":"call","span":{"start":[270,15],"end":[270,70],"bytes":[7521,7576]},"callee":null},"273:15":{"kind":"call","span":{"start":[273,15],"end":[273,44],"bytes":[7595,7624]},"callee":null},"274:15":{"kind":"call","span":{"start":[274,15],"end":[274,67],"bytes":[7653,7705]},"callee":null},"277:12":{"kind":"call","span":{"start":[277,12],"end":[277,53],"bytes":[7721,7762]},"callee":null},"277:28":{"kind":"call","span":{"start":[277,28],"end":[277,46],"bytes":[7737,7755]},"callee":null},"278:15":{"kind":"call","span":{"start":[278,15],"end":[278,99],"bytes":[7791,7875]},"callee":null},"278:75":{"kind":"call","span":{"start":[278,75],"end":[278,93],"bytes":[7851,7869]},"callee":null},"285:12":{"kind":"call","span":{"start":[285,12],"end":[285,71],"bytes":[8174,8233]},"callee":null},"286:15":{"kind":"call","span":{"start":[286,15],"end":[286,76],"bytes":[8262,8323]},"callee":null},"289:2":{"kind":"call","span":{"start":[289,2],"end":[289,77],"bytes":[8329,8404]},"callee":null},"290:2":{"kind":"call","span":{"start":[290,2],"end":[290,77],"bytes":[8412,8487]},"callee":null},"290:82":{"kind":"call","span":{"start":[290,82],"end":[290,95],"bytes":[8492,8505]},"callee":null}},"callables":{"closure_1":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1","kind":"function","span":{"start":[261,1],"end":[264,5],"bytes":[7330,7404]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1","parameters":[],"body":{"262:7":{"kind":"call","span":{"start":[262,7],"end":[262,22],"bytes":[7352,7367]},"callee":null},"263:17":{"kind":"call","span":{"start":[263,17],"end":[263,31],"bytes":[7384,7398]},"callee":null},"263:7":{"kind":"call","span":{"start":[263,7],"end":[263,32],"bytes":[7374,7399]},"callee":null}}}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.init":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","kind":"method","span":{"start":[97,1],"end":[119,2],"bytes":[2104,2596]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[97,1],"end":[97,84],"bytes":[2104,2187]}}],"return_type":"(*github.com/studio-b12/gowebdav.Client, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"106:15":{"kind":"call","span":{"start":[106,15],"end":[106,48],"bytes":[2304,2337]},"callee":null},"109:13":{"kind":"call","span":{"start":[109,13],"end":[109,62],"bytes":[2354,2403]},"callee":null},"111:2":{"kind":"call","span":{"start":[111,2],"end":[111,32],"bytes":[2406,2436]},"callee":null},"113:12":{"kind":"call","span":{"start":[113,12],"end":[113,30],"bytes":[2449,2467]},"callee":null},"115:15":{"kind":"call","span":{"start":[115,15],"end":[115,70],"bytes":[2513,2568]},"callee":null},"98:2":{"kind":"call","span":{"start":[98,2],"end":[98,13],"bytes":[2189,2200]},"callee":null},"99:8":{"kind":"call","span":{"start":[99,8],"end":[99,21],"bytes":[2208,2221]},"callee":null}}}},"fields":{"Password":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/Password","kind":"field","type":"string","span":{"start":[43,1],"end":[43,17],"bytes":[704,720]}},"Path":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[44,1],"end":[44,17],"bytes":[721,737]}},"Timeout":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/Timeout","kind":"field","type":"time.Duration","span":{"start":[45,1],"end":[45,24],"bytes":[738,761]}},"URL":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/URL","kind":"field","type":"string","span":{"start":[41,1],"end":[41,17],"bytes":[670,686]}},"Username":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/Username","kind":"field","type":"string","span":{"start":[42,1],"end":[42,17],"bytes":[687,703]}},"client":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/client","kind":"field","type":"*github.com/studio-b12/gowebdav.Client","span":{"start":[38,1],"end":[38,25],"bytes":[623,647]}},"logger":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[39,1],"end":[39,21],"bytes":[648,668]}},"mu":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[37,1],"end":[37,19],"bytes":[604,622]}}}}},"functions":{"github.com/benbjohnson/litestream/webdav.NewReplicaClient":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","kind":"function","span":{"start":[48,1],"end":[53,2],"bytes":[765,917]},"signature":"github.com/benbjohnson/litestream/webdav.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/webdav.ReplicaClient","metrics":{"cyclomatic":1},"body":{"50:12":{"kind":"call","span":{"start":[50,12],"end":[50,26],"bytes":[841,855]},"callee":null}}},"github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","kind":"function","span":{"start":[62,1],"end":[85,2],"bytes":[1251,1871]},"signature":"github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}},{"name":"host","type":"string","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}},{"name":"urlPath","type":"string","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}},{"name":"query","type":"net/url.Values","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"63:12":{"kind":"call","span":{"start":[63,12],"end":[63,30],"bytes":[1399,1417]},"callee":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient"},"73:21":{"kind":"call","span":{"start":[73,21],"end":[73,40],"bytes":[1618,1637]},"callee":null},"74:24":{"kind":"call","span":{"start":[74,24],"end":[74,43],"bytes":[1661,1680]},"callee":null},"78:15":{"kind":"call","span":{"start":[78,15],"end":[78,65],"bytes":[1716,1766]},"callee":null},"81:15":{"kind":"call","span":{"start":[81,15],"end":[81,55],"bytes":[1785,1825]},"callee":null}}},"github.com/benbjohnson/litestream/webdav.init":{"id":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.init","kind":"function","span":{"start":[23,1],"end":[26,2],"bytes":[268,436]},"signature":"github.com/benbjohnson/litestream/webdav.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"24:2":{"kind":"call","span":{"start":[24,2],"end":[24,76],"bytes":[283,357]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"},"25:2":{"kind":"call","span":{"start":[25,2],"end":[25,77],"bytes":[359,434]},"callee":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}}},"content_hash":"0663d9d2f104f9e08f85fb1d08c60dd84bbaa0f77b692584f583b18f7f092a35"}},"call_graph":[{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.init","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Next","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","prov":["go/types"],"weight":1},{"src":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","dst":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","dst":"can://go/litestream/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.NewMain","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://go/litestream/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://go/litestream/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://go/litestream/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://go/litestream/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize/github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.DefaultSocketConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.isWindowsService","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.runWindowsService","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetMetaPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.init","dst":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewMain","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.NewHeartbeatClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.NewServer","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.NewStore","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewRestoreOptions","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewRestoreOptions","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage","dst":"can://go/litestream/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://go/litestream/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","dst":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings","prov":["go/types"],"weight":1},{"src":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","dst":"can://go/litestream/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Level","dst":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.NextLevel","dst":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel","dst":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","dst":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID","dst":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewRestoreOptions","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","dst":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.setLogger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.calcWALSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.rollback","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.calcWALSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALFileAt","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.openLocalLTXFile","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.rollback","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.isDiskFullError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.readWALHeader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://go/litestream/compactor.go/github.com/benbjohnson/litestream.NewCompactor","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","prov":["go/types"],"weight":1},{"src":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/github.com/benbjohnson/litestream.snapshotReadCloser.Close","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClientFromURL","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.FileInfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.init","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.newLTXFileIterator","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.init","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump","dst":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.fixRootDirectory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Close","dst":"can://go/litestream/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive","dst":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile","dst":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr","dst":"can://go/litestream/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.LTXFileOpener/github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteAll","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","dst":"can://go/litestream/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","dst":"can://go/litestream/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://go/litestream/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.Checksum","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert","prov":["go/types"],"weight":1},{"src":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect","dst":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/nats/replica_client.go/github.com/benbjohnson/litestream/nats.init","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator","dst":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/oss/replica_client.go/github.com/benbjohnson/litestream/oss.init","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplicaWithClient","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.TXIDPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.checkIntegrity","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.checkIntegrity","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://go/litestream/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://go/litestream/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.TXIDPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","dst":"can://go/litestream/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://go/litestream/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.DeleteObject","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.GetObject","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.PutObject","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://go/litestream/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.GenerationsPathV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALPathV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://go/litestream/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.init","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects","dst":"can://go/litestream/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.NewDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.NewReplica","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://go/litestream/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Init","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.init","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","dst":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://go/litestream/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","dst":"can://go/litestream/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://go/litestream/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://go/litestream/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://go/litestream/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","prov":["go/types"],"weight":1},{"src":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked","prov":["go/types"],"weight":1},{"src":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.String","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.IsZero","prov":["go/types"],"weight":1},{"src":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","dst":"can://go/litestream/v3.go/github.com/benbjohnson/litestream.WALPathV3","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.assert","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.PageMap","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","dst":"can://go/litestream/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","prov":["go/types"],"weight":1},{"src":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","dst":"can://go/litestream/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.Init","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://go/litestream/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.init","dst":"can://go/litestream/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1}]}} \ No newline at end of file +{"identity_version":2,"schema_version":"2.0.0","language":"go","max_level":2,"analyzer":{"name":"codeanalyzer-go","version":"0.1.0"},"application":{"identity_version":2,"application_name":"litestream","identity_namespace":"litestream","id":"can://litestream/litestream","kind":"application","symbol_table":{"abs/replica_client.go":{"id":"can://litestream/litestream/go/abs/replica_client.go","kind":"module","span":{"start":[1,1],"end":[500,1],"bytes":[0,14566]},"package":"abs","source":"package abs\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror\"\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"abs\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"abs\"\n\n// MetadataKeyTimestamp is the metadata key for storing LTX file timestamps in Azure Blob Storage.\n// Azure metadata keys cannot contain hyphens, so we use litestreamtimestamp (C# identifier rules).\nconst MetadataKeyTimestamp = \"litestreamtimestamp\"\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to Azure Blob Storage.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tclient *azblob.Client\n\tlogger *slog.Logger\n\n\t// Azure credentials\n\tAccountName string\n\tAccountKey string\n\tSASToken string // SAS token for container-level access\n\tEndpoint string\n\n\t// Azure Blob Storage container information\n\tBucket string\n\tPath string\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: abs://[account-name@]container/path\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\t// Extract account name from userinfo if present (abs://account@container/path)\n\tif userinfo != nil {\n\t\tclient.AccountName = userinfo.Username()\n\t}\n\n\tclient.Bucket = host\n\tclient.Path = urlPath\n\tclient.Endpoint = query.Get(\"endpoint\")\n\n\tif client.Bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for abs replica URL\")\n\t}\n\n\treturn client, nil\n}\n\n// Type returns \"abs\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to Azure. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) (err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.client != nil {\n\t\treturn nil\n\t}\n\n\t// Validate required configuration\n\tif c.Bucket == \"\" {\n\t\treturn fmt.Errorf(\"abs: container name is required\")\n\t}\n\n\t// Construct \u0026 parse endpoint unless already set.\n\tendpoint := c.Endpoint\n\tif endpoint == \"\" {\n\t\tif c.AccountName == \"\" {\n\t\t\treturn fmt.Errorf(\"abs: account name is required when endpoint is not specified\")\n\t\t}\n\t\tendpoint = fmt.Sprintf(\"https://%s.blob.core.windows.net\", c.AccountName)\n\t}\n\n\t// Configure client options with retry policy\n\tclientOptions := \u0026azblob.ClientOptions{\n\t\tClientOptions: azcore.ClientOptions{\n\t\t\tRetry: policy.RetryOptions{\n\t\t\t\tMaxRetries: 10,\n\t\t\t\tRetryDelay: time.Second,\n\t\t\t\tMaxRetryDelay: 30 * time.Second,\n\t\t\t\tTryTimeout: 15 * time.Minute, // Reasonable timeout for blob operations\n\t\t\t\tStatusCodes: []int{\n\t\t\t\t\thttp.StatusRequestTimeout,\n\t\t\t\t\thttp.StatusTooManyRequests,\n\t\t\t\t\thttp.StatusInternalServerError,\n\t\t\t\t\thttp.StatusBadGateway,\n\t\t\t\t\thttp.StatusServiceUnavailable,\n\t\t\t\t\thttp.StatusGatewayTimeout,\n\t\t\t\t},\n\t\t\t},\n\t\t\tTelemetry: policy.TelemetryOptions{\n\t\t\t\tApplicationID: \"litestream\",\n\t\t\t},\n\t\t},\n\t}\n\n\t// Check for SAS token first (highest priority for explicit credentials)\n\tsasToken := c.SASToken\n\tif sasToken == \"\" {\n\t\tsasToken = os.Getenv(\"LITESTREAM_AZURE_SAS_TOKEN\")\n\t}\n\n\t// Check if we have explicit credentials or should use default credential chain\n\taccountKey := c.AccountKey\n\tif accountKey == \"\" {\n\t\taccountKey = os.Getenv(\"LITESTREAM_AZURE_ACCOUNT_KEY\")\n\t}\n\n\t// Create Azure Blob Storage client with appropriate authentication\n\t// Priority: SAS token \u003e Shared key \u003e Default credential chain\n\tvar client *azblob.Client\n\tif sasToken != \"\" {\n\t\t// SAS token authentication - append token to endpoint URL\n\t\tif accountKey != \"\" {\n\t\t\tslog.Warn(\"both SAS token and account key configured, using SAS token\")\n\t\t} else {\n\t\t\tslog.Debug(\"using SAS token authentication\")\n\t\t}\n\t\t// Strip leading \"?\" if present to avoid double \"?\"\n\t\tendpointWithSAS := fmt.Sprintf(\"%s?%s\", endpoint, strings.TrimPrefix(sasToken, \"?\"))\n\t\tclient, err = azblob.NewClientWithNoCredential(endpointWithSAS, clientOptions)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create azure blob client with SAS token: %w\", err)\n\t\t}\n\t} else if accountKey != \"\" \u0026\u0026 c.AccountName != \"\" {\n\t\t// Use shared key authentication (existing behavior)\n\t\tslog.Debug(\"using shared key authentication\")\n\t\tcredential, err := azblob.NewSharedKeyCredential(c.AccountName, accountKey)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create shared key credential: %w\", err)\n\t\t}\n\t\tclient, err = azblob.NewClientWithSharedKeyCredential(endpoint, credential, clientOptions)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create azure blob client with shared key: %w\", err)\n\t\t}\n\t} else {\n\t\t// Use default credential chain (similar to AWS SDK default credential chain)\n\t\t// This includes:\n\t\t// - Environment variables (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID)\n\t\t// - Managed Identity (for Azure VMs, App Service, etc.)\n\t\t// - Azure CLI credentials\n\t\t// - Visual Studio Code credentials\n\t\tslog.Debug(\"using default credential chain (managed identity, Azure CLI, environment variables, etc.)\")\n\t\tcredential, err := azidentity.NewDefaultAzureCredential(nil)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create default azure credential: %w\", err)\n\t\t}\n\t\tclient, err = azblob.NewClient(endpoint, credential, clientOptions)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot create azure blob client with default credential: %w\", err)\n\t\t}\n\t}\n\n\tc.client = client\n\treturn nil\n}\n\n// LTXFiles returns an iterator over all available LTX files.\n// Azure always uses accurate timestamps from metadata since they're included in LIST operations at zero cost.\n// The useMetadata parameter is ignored.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLTXFileIterator(ctx, c, level, seek), nil\n}\n\n// WriteLTXFile writes an LTX file to remote storage.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\trc := internal.NewReadCounter(io.MultiReader(\u0026buf, rd))\n\n\t// Upload blob with proper content type, access tier, and metadata\n\t// Azure metadata keys cannot contain hyphens, so use litestreamtimestamp\n\t_, err = c.client.UploadStream(ctx, c.Bucket, key, rc, \u0026azblob.UploadStreamOptions{\n\t\tHTTPHeaders: \u0026blob.HTTPHeaders{\n\t\t\tBlobContentType: to.Ptr(\"application/octet-stream\"),\n\t\t},\n\t\tAccessTier: to.Ptr(blob.AccessTierHot), // Use Hot tier as default\n\t\tMetadata: map[string]*string{\n\t\t\tMetadataKeyTimestamp: to.Ptr(timestamp.Format(time.RFC3339Nano)),\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"abs: cannot upload ltx file %q: %w\", key, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(rc.N()))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: rc.N(),\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// OpenLTXFile returns a reader for an LTX file.\n// Returns os.ErrNotExist if no matching min/max TXID is not found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\tresp, err := c.client.DownloadStream(ctx, c.Bucket, key, \u0026azblob.DownloadStreamOptions{\n\t\tRange: blob.HTTPRange{\n\t\t\tOffset: offset,\n\t\t\tCount: size,\n\t\t},\n\t})\n\n\tif isNotExists(err) {\n\t\treturn nil, os.ErrNotExist\n\t} else if err != nil {\n\t\treturn nil, fmt.Errorf(\"abs: cannot start new reader for %q: %w\", key, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\tif resp.ContentLength != nil {\n\t\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Add(float64(*resp.ContentLength))\n\t}\n\n\treturn resp.Body, nil\n}\n\n// DeleteLTXFiles deletes LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, info := range a {\n\t\tkey := litestream.LTXFilePath(c.Path, info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"key\", key)\n\n\t\t_, err := c.client.DeleteBlob(ctx, c.Bucket, key, nil)\n\t\tif isNotExists(err) {\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot delete ltx file %q: %w\", key, err)\n\t\t}\n\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\n// DeleteAll deletes all LTX files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t// List all blobs with the configured path prefix\n\tprefix := \"/\"\n\tif c.Path != \"\" {\n\t\tprefix = strings.TrimSuffix(c.Path, \"/\") + \"/\"\n\t}\n\n\tpager := c.client.NewListBlobsFlatPager(c.Bucket, \u0026azblob.ListBlobsFlatOptions{\n\t\tPrefix: \u0026prefix,\n\t\tInclude: azblob.ListBlobsInclude{Metadata: true},\n\t})\n\n\tfor pager.More() {\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"LIST\").Inc()\n\n\t\tresp, err := pager.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"abs: cannot list blobs: %w\", err)\n\t\t}\n\n\t\tfor _, item := range resp.Segment.BlobItems {\n\t\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\n\t\t\t_, err := c.client.DeleteBlob(ctx, c.Bucket, *item.Name, nil)\n\t\t\tif isNotExists(err) {\n\t\t\t\tcontinue\n\t\t\t} else if err != nil {\n\t\t\t\treturn fmt.Errorf(\"abs: cannot delete blob %q: %w\", *item.Name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype ltxFileIterator struct {\n\tctx context.Context\n\tcancel context.CancelFunc\n\tclient *ReplicaClient\n\tlevel int\n\tseek ltx.TXID\n\n\tpager *runtime.Pager[azblob.ListBlobsFlatResponse]\n\tpageItems []*ltx.FileInfo\n\tpageIndex int\n\n\tclosed bool\n\terr error\n\tinfo *ltx.FileInfo\n}\n\nfunc newLTXFileIterator(ctx context.Context, client *ReplicaClient, level int, seek ltx.TXID) *ltxFileIterator {\n\tctx, cancel := context.WithCancel(ctx)\n\n\titr := \u0026ltxFileIterator{\n\t\tctx: ctx,\n\t\tcancel: cancel,\n\t\tclient: client,\n\t\tlevel: level,\n\t\tseek: seek,\n\t}\n\n\t// Create paginator for listing blobs with level prefix\n\tdir := litestream.LTXLevelDir(client.Path, level)\n\tprefix := dir + \"/\"\n\n\titr.pager = client.client.NewListBlobsFlatPager(client.Bucket, \u0026azblob.ListBlobsFlatOptions{\n\t\tPrefix: \u0026prefix,\n\t\tInclude: azblob.ListBlobsInclude{Metadata: true},\n\t})\n\n\treturn itr\n}\n\nfunc (itr *ltxFileIterator) Close() (err error) {\n\titr.closed = true\n\titr.cancel()\n\treturn itr.err\n}\n\nfunc (itr *ltxFileIterator) Next() bool {\n\tif itr.closed || itr.err != nil {\n\t\treturn false\n\t}\n\n\t// Process blobs until we find a valid LTX file\n\tfor {\n\t\t// Load next page if needed\n\t\tif itr.pageItems == nil || itr.pageIndex \u003e= len(itr.pageItems) {\n\t\t\tif !itr.loadNextPage() {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// Process current item from page\n\t\tif itr.pageIndex \u003c len(itr.pageItems) {\n\t\t\titr.info = itr.pageItems[itr.pageIndex]\n\t\t\titr.pageIndex++\n\t\t\treturn true\n\t\t}\n\t}\n}\n\n// loadNextPage loads the next page of blobs and extracts valid LTX files\nfunc (itr *ltxFileIterator) loadNextPage() bool {\n\tif !itr.pager.More() {\n\t\treturn false\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"LIST\").Inc()\n\n\tresp, err := itr.pager.NextPage(itr.ctx)\n\tif err != nil {\n\t\titr.err = fmt.Errorf(\"abs: cannot list blobs: %w\", err)\n\t\treturn false\n\t}\n\n\t// Extract blob items directly from the response\n\titr.pageItems = nil\n\titr.pageIndex = 0\n\n\tfor _, item := range resp.Segment.BlobItems {\n\t\tkey := path.Base(*item.Name)\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(key)\n\t\tif err != nil {\n\t\t\tcontinue // Skip non-LTX files\n\t\t}\n\n\t\t// Build file info\n\t\tinfo := \u0026ltx.FileInfo{\n\t\t\tLevel: itr.level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: *item.Properties.ContentLength,\n\t\t}\n\n\t\t// Skip if below seek TXID\n\t\tif info.MinTXID \u003c itr.seek {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Skip if wrong level\n\t\tif info.Level != itr.level {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Always use accurate timestamp from metadata since it's zero-cost\n\t\t// Azure includes metadata in LIST operations, so no extra API call needed\n\t\tinfo.CreatedAt = item.Properties.CreationTime.UTC()\n\t\tif item.Metadata != nil {\n\t\t\tif ts, ok := item.Metadata[MetadataKeyTimestamp]; ok \u0026\u0026 ts != nil {\n\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, *ts); err == nil {\n\t\t\t\t\tinfo.CreatedAt = parsed\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\titr.pageItems = append(itr.pageItems, info)\n\t}\n\n\treturn len(itr.pageItems) \u003e 0 || itr.pager.More()\n}\n\nfunc (itr *ltxFileIterator) Err() error { return itr.err }\n\nfunc (itr *ltxFileIterator) Item() *ltx.FileInfo {\n\treturn itr.info\n}\n\nfunc isNotExists(err error) bool {\n\tvar respErr *azcore.ResponseError\n\tif errors.As(err, \u0026respErr) {\n\t\treturn respErr.ErrorCode == string(bloberror.BlobNotFound) || respErr.ErrorCode == string(bloberror.ContainerNotFound)\n\t}\n\treturn false\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[22,30]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[31,41]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[42,51]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[52,58]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[59,64]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[65,76]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[77,88]}},{"name":"url","path":"net/url","span":{"start":[11,1],"end":[11,11],"bytes":[89,99]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[100,105]}},{"name":"path","path":"path","span":{"start":[13,1],"end":[13,8],"bytes":[106,113]}},{"name":"strings","path":"strings","span":{"start":[14,1],"end":[14,11],"bytes":[114,124]}},{"name":"sync","path":"sync","span":{"start":[15,1],"end":[15,8],"bytes":[125,132]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[133,140]}},{"name":"azcore","path":"github.com/Azure/azure-sdk-for-go/sdk/azcore","span":{"start":[18,1],"end":[18,48],"bytes":[142,189]}},{"name":"policy","path":"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy","span":{"start":[19,1],"end":[19,55],"bytes":[190,244]}},{"name":"runtime","path":"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime","span":{"start":[20,1],"end":[20,56],"bytes":[245,300]}},{"name":"to","path":"github.com/Azure/azure-sdk-for-go/sdk/azcore/to","span":{"start":[21,1],"end":[21,51],"bytes":[301,351]}},{"name":"azidentity","path":"github.com/Azure/azure-sdk-for-go/sdk/azidentity","span":{"start":[22,1],"end":[22,52],"bytes":[352,403]}},{"name":"azblob","path":"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob","span":{"start":[23,1],"end":[23,56],"bytes":[404,459]}},{"name":"blob","path":"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob","span":{"start":[24,1],"end":[24,61],"bytes":[460,520]}},{"name":"bloberror","path":"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/bloberror","span":{"start":[25,1],"end":[25,66],"bytes":[521,586]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[26,1],"end":[26,27],"bytes":[587,613]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[28,1],"end":[28,37],"bytes":[615,651]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[29,1],"end":[29,46],"bytes":[652,697]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient","kind":"struct","span":{"start":[46,1],"end":[60,2],"bytes":[1263,1574]},"callables":{"github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","kind":"method","span":{"start":[320,1],"end":[357,2],"bytes":[10261,11259]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[320,1],"end":[320,63],"bytes":[10261,10323]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"321:12":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@321:12","span":{"start":[321,12],"end":[321,23],"bytes":[10335,10346]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"328:12":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@328:12","span":{"start":[328,12],"end":[328,43],"bytes":[10474,10505]},"callee":"can://litestream/litestream/@external/strings/TrimSuffix"},"331:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@331:11","span":{"start":[331,11],"end":[334,4],"bytes":[10526,10672]},"callee":null},"336:6":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@336:6","span":{"start":[336,6],"end":[336,18],"bytes":[10679,10691]},"callee":null},"337:3":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@337:3","span":{"start":[337,3],"end":[337,85],"bytes":[10696,10778]},"callee":null},"337:3/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@337:3/2","span":{"start":[337,3],"end":[337,79],"bytes":[10696,10772]},"callee":null},"339:16":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@339:16","span":{"start":[339,16],"end":[339,35],"bytes":[10795,10814]},"callee":null},"341:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@341:11","span":{"start":[341,11],"end":[341,56],"bytes":[10843,10888]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"345:4":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@345:4","span":{"start":[345,4],"end":[345,88],"bytes":[10945,11029]},"callee":null},"345:4/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@345:4/2","span":{"start":[345,4],"end":[345,82],"bytes":[10945,11023]},"callee":null},"347:14":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@347:14","span":{"start":[347,14],"end":[347,65],"bytes":[11044,11095]},"callee":null},"348:7":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@348:7","span":{"start":[348,7],"end":[348,23],"bytes":[11102,11118]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists"},"351:12":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll@351:12","span":{"start":[351,12],"end":[351,73],"bytes":[11171,11232]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[296,1],"end":[317,2],"bytes":[9557,10223]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[296,1],"end":[296,87],"bytes":[9557,9643]}},{"name":"a","type":"[]invalid type","span":{"start":[296,1],"end":[296,87],"bytes":[9557,9643]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"297:12":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles@297:12","span":{"start":[297,12],"end":[297,23],"bytes":[9655,9666]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"302:10":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles@302:10","span":{"start":[302,10],"end":[302,80],"bytes":[9733,9803]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"304:3":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles@304:3","span":{"start":[304,3],"end":[304,121],"bytes":[9807,9925]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"306:13":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles@306:13","span":{"start":[306,13],"end":[306,57],"bytes":[9939,9983]},"callee":null},"307:6":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles@307:6","span":{"start":[307,6],"end":[307,22],"bytes":[9989,10005]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists"},"310:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles@310:11","span":{"start":[310,11],"end":[310,69],"bytes":[10055,10113]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"313:3":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles@313:3","span":{"start":[313,3],"end":[313,87],"bytes":[10121,10205]},"callee":null},"313:3/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles@313:3/2","span":{"start":[313,3],"end":[313,81],"bytes":[10121,10199]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.Init":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","kind":"method","span":{"start":[101,1],"end":[205,2],"bytes":[2766,6407]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[101,1],"end":[101,64],"bytes":[2766,2829]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":15},"body":{"102:2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@102:2","span":{"start":[102,2],"end":[102,13],"bytes":[2831,2842]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"103:8":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@103:8","span":{"start":[103,8],"end":[103,21],"bytes":[2850,2863]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"111:10":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@111:10","span":{"start":[111,10],"end":[111,55],"bytes":[2970,3015]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"118:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@118:11","span":{"start":[118,11],"end":[118,85],"bytes":[3153,3227]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"120:14":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@120:14","span":{"start":[120,14],"end":[120,76],"bytes":[3245,3307]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"149:14":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@149:14","span":{"start":[149,14],"end":[149,53],"bytes":[4095,4134]},"callee":"can://litestream/litestream/@external/os/Getenv"},"155:16":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@155:16","span":{"start":[155,16],"end":[155,57],"bytes":[4286,4327]},"callee":"can://litestream/litestream/@external/os/Getenv"},"164:4":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@164:4","span":{"start":[164,4],"end":[164,75],"bytes":[4601,4672]},"callee":"can://litestream/litestream/@external/log/slog/Warn"},"166:4":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@166:4","span":{"start":[166,4],"end":[166,48],"bytes":[4687,4731]},"callee":"can://litestream/litestream/@external/log/slog/Debug"},"169:22":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@169:22","span":{"start":[169,22],"end":[169,87],"bytes":[4811,4876]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"169:53":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@169:53","span":{"start":[169,53],"end":[169,86],"bytes":[4842,4875]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"170:17":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@170:17","span":{"start":[170,17],"end":[170,81],"bytes":[4893,4957]},"callee":null},"172:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@172:11","span":{"start":[172,11],"end":[172,85],"bytes":[4986,5060]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"176:3":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@176:3","span":{"start":[176,3],"end":[176,48],"bytes":[5175,5220]},"callee":"can://litestream/litestream/@external/log/slog/Debug"},"177:22":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@177:22","span":{"start":[177,22],"end":[177,78],"bytes":[5242,5298]},"callee":null},"179:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@179:11","span":{"start":[179,11],"end":[179,74],"bytes":[5327,5390]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"181:17":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@181:17","span":{"start":[181,17],"end":[181,93],"bytes":[5411,5487]},"callee":null},"183:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@183:11","span":{"start":[183,11],"end":[183,86],"bytes":[5516,5591]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"192:3":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@192:3","span":{"start":[192,3],"end":[192,106],"bytes":[5919,6022]},"callee":"can://litestream/litestream/@external/log/slog/Debug"},"193:22":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@193:22","span":{"start":[193,22],"end":[193,63],"bytes":[6044,6085]},"callee":null},"195:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@195:11","span":{"start":[195,11],"end":[195,77],"bytes":[6114,6180]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"197:17":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@197:17","span":{"start":[197,17],"end":[197,70],"bytes":[6201,6254]},"callee":null},"199:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init@199:11","span":{"start":[199,11],"end":[199,94],"bytes":[6283,6366]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles","kind":"method","span":{"start":[210,1],"end":[215,2],"bytes":[6623,6861]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[210,1],"end":[210,126],"bytes":[6623,6748]}},{"name":"level","type":"int","span":{"start":[210,1],"end":[210,126],"bytes":[6623,6748]}},{"name":"seek","type":"invalid type","span":{"start":[210,1],"end":[210,126],"bytes":[6623,6748]}},{"name":"useMetadata","type":"bool","span":{"start":[210,1],"end":[210,126],"bytes":[6623,6748]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"211:12":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles@211:12","span":{"start":[211,12],"end":[211,23],"bytes":[6760,6771]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"214:9":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles@214:9","span":{"start":[214,9],"end":[214,48],"bytes":[6815,6854]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator"}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[268,1],"end":[293,2],"bytes":[8682,9518]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"level","type":"int","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"minTXID","type":"invalid type","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"maxTXID","type":"invalid type","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"offset","type":"int64","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}},{"name":"size","type":"int64","span":{"start":[268,1],"end":[268,140],"bytes":[8682,8821]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"269:12":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@269:12","span":{"start":[269,12],"end":[269,23],"bytes":[8833,8844]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"273:9":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@273:9","span":{"start":[273,9],"end":[273,64],"bytes":[8889,8944]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"274:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@274:15","span":{"start":[274,15],"end":[279,4],"bytes":[8959,9103]},"callee":null},"281:5":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@281:5","span":{"start":[281,5],"end":[281,21],"bytes":[9109,9125]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists"},"284:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@284:15","span":{"start":[284,15],"end":[284,78],"bytes":[9195,9258]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"287:2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@287:2","span":{"start":[287,2],"end":[287,83],"bytes":[9264,9345]},"callee":null},"287:2/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@287:2/2","span":{"start":[287,2],"end":[287,77],"bytes":[9264,9339]},"callee":null},"289:3":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@289:3","span":{"start":[289,3],"end":[289,112],"bytes":[9380,9489]},"callee":null},"289:3/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@289:3/2","span":{"start":[289,3],"end":[289,78],"bytes":[9380,9455]},"callee":null},"289:83":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile@289:83","span":{"start":[289,83],"end":[289,111],"bytes":[9460,9488]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.SetLogger","kind":"method","span":{"start":[69,1],"end":[71,2],"bytes":[1763,1869]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[69,1],"end":[69,57],"bytes":[1763,1819]}}],"metrics":{"cyclomatic":1},"body":{"70:13":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.SetLogger@70:13","span":{"start":[70,13],"end":[70,48],"bytes":[1832,1867]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/abs.ReplicaClient.Type":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Type","kind":"method","span":{"start":[96,1],"end":[98,2],"bytes":[2622,2689]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[218,1],"end":[264,2],"bytes":[6917,8563]},"signature":"github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}},{"name":"level","type":"int","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}},{"name":"minTXID","type":"invalid type","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}},{"name":"maxTXID","type":"invalid type","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}},{"name":"rd","type":"io.Reader","span":{"start":[218,1],"end":[218,144],"bytes":[6917,7060]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"219:12":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@219:12","span":{"start":[219,12],"end":[219,23],"bytes":[7072,7083]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init"},"223:9":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@223:9","span":{"start":[223,9],"end":[223,64],"bytes":[7128,7183]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"227:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@227:15","span":{"start":[227,15],"end":[227,37],"bytes":[7294,7316]},"callee":"can://litestream/litestream/@external/io/TeeReader"},"230:17":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@230:17","span":{"start":[230,17],"end":[230,42],"bytes":[7372,7397]},"callee":null},"232:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@232:15","span":{"start":[232,15],"end":[232,71],"bytes":[7429,7485]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"234:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@234:15","span":{"start":[234,15],"end":[234,50],"bytes":[7503,7538]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"234:15/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@234:15/2","span":{"start":[234,15],"end":[234,44],"bytes":[7503,7532]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"237:32":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@237:32","span":{"start":[237,32],"end":[237,56],"bytes":[7617,7641]},"callee":"can://litestream/litestream/@external/io/MultiReader"},"237:8":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@237:8","span":{"start":[237,8],"end":[237,57],"bytes":[7593,7642]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter"},"241:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@241:11","span":{"start":[241,11],"end":[249,4],"bytes":[7797,8145]},"callee":null},"243:21":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@243:21","span":{"start":[243,21],"end":[243,55],"bytes":[7926,7960]},"callee":null},"245:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@245:15","span":{"start":[245,15],"end":[245,41],"bytes":[7981,8007]},"callee":null},"247:26":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@247:26","span":{"start":[247,26],"end":[247,68],"bytes":[8093,8135]},"callee":null},"247:33":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@247:33","span":{"start":[247,33],"end":[247,67],"bytes":[8100,8134]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"251:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@251:15","span":{"start":[251,15],"end":[251,73],"bytes":[8177,8235]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"254:2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@254:2","span":{"start":[254,2],"end":[254,83],"bytes":[8241,8322]},"callee":null},"254:2/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@254:2/2","span":{"start":[254,2],"end":[254,77],"bytes":[8241,8316]},"callee":null},"255:2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@255:2","span":{"start":[255,2],"end":[255,98],"bytes":[8324,8420]},"callee":null},"255:2/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@255:2/2","span":{"start":[255,2],"end":[255,77],"bytes":[8324,8399]},"callee":null},"255:82":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@255:82","span":{"start":[255,82],"end":[255,97],"bytes":[8404,8419]},"callee":null},"255:90":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@255:90","span":{"start":[255,90],"end":[255,96],"bytes":[8412,8418]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"},"261:14":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile@261:14","span":{"start":[261,14],"end":[261,20],"bytes":[8522,8528]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"}}}},"fields":{"AccountKey":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/AccountKey","kind":"field","type":"string","span":{"start":[53,1],"end":[53,20],"bytes":[1397,1416]}},"AccountName":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/AccountName","kind":"field","type":"string","span":{"start":[52,1],"end":[52,20],"bytes":[1377,1396]}},"Bucket":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/Bucket","kind":"field","type":"string","span":{"start":[58,1],"end":[58,15],"bytes":[1543,1557]}},"Endpoint":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/Endpoint","kind":"field","type":"string","span":{"start":[55,1],"end":[55,20],"bytes":[1477,1496]}},"Path":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[59,1],"end":[59,15],"bytes":[1558,1572]}},"SASToken":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/SASToken","kind":"field","type":"string","span":{"start":[54,1],"end":[54,60],"bytes":[1417,1476]}},"client":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/client","kind":"field","type":"invalid type","span":{"start":[48,1],"end":[48,23],"bytes":[1310,1332]}},"logger":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[49,1],"end":[49,21],"bytes":[1333,1353]}},"mu":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[47,1],"end":[47,19],"bytes":[1291,1309]}}}},"ltxFileIterator":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator","kind":"struct","span":{"start":[359,1],"end":[373,2],"bytes":[11261,11544]},"callables":{"github.com/benbjohnson/litestream/abs.ltxFileIterator.Close":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Close","kind":"method","span":{"start":[398,1],"end":[402,2],"bytes":[12130,12230]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"400:2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Close@400:2","span":{"start":[400,2],"end":[400,14],"bytes":[12200,12212]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ltxFileIterator.Err":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Err","kind":"method","span":{"start":[487,1],"end":[487,59],"bytes":[14194,14252]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/abs.ltxFileIterator.Item":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Item","kind":"method","span":{"start":[489,1],"end":[491,2],"bytes":[14254,14323]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.Item","parameters":[],"return_type":"invalid type","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/abs.ltxFileIterator.Next":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Next","kind":"method","span":{"start":[404,1],"end":[425,2],"bytes":[12232,12699]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":6},"body":{"412:47":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Next@412:47","span":{"start":[412,47],"end":[412,65],"bytes":[12460,12478]},"callee":null},"413:8":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Next@413:8","span":{"start":[413,8],"end":[413,26],"bytes":[12488,12506]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage"},"419:22":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Next@419:22","span":{"start":[419,22],"end":[419,40],"bytes":[12593,12611]},"callee":null}}},"github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","kind":"method","span":{"start":[428,1],"end":[485,2],"bytes":[12775,14192]},"signature":"github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","parameters":[],"return_type":"bool","metrics":{"cyclomatic":10},"body":{"429:6":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@429:6","span":{"start":[429,6],"end":[429,22],"bytes":[12830,12846]},"callee":null},"433:2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@433:2","span":{"start":[433,2],"end":[433,84],"bytes":[12869,12951]},"callee":null},"433:2/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@433:2/2","span":{"start":[433,2],"end":[433,78],"bytes":[12869,12945]},"callee":null},"435:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@435:15","span":{"start":[435,15],"end":[435,42],"bytes":[12967,12994]},"callee":null},"437:13":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@437:13","span":{"start":[437,13],"end":[437,58],"bytes":[13024,13069]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"446:10":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@446:10","span":{"start":[446,10],"end":[446,31],"bytes":[13236,13257]},"callee":"can://litestream/litestream/@external/path/Base"},"447:28":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@447:28","span":{"start":[447,28],"end":[447,50],"bytes":[13285,13307]},"callee":null},"472:20":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@472:20","span":{"start":[472,20],"end":[472,54],"bytes":[13841,13875]},"callee":null},"475:23":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@475:23","span":{"start":[475,23],"end":[475,56],"bytes":[13997,14030]},"callee":"can://litestream/litestream/@external/time/Parse"},"481:19":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@481:19","span":{"start":[481,19],"end":[481,46],"bytes":[14108,14135]},"callee":null},"484:35":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@484:35","span":{"start":[484,35],"end":[484,51],"bytes":[14174,14190]},"callee":null},"484:9":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage@484:9","span":{"start":[484,9],"end":[484,27],"bytes":[14148,14166]},"callee":null}}}},"fields":{"cancel":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[361,1],"end":[361,27],"bytes":[11315,11341]}},"client":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/client","kind":"field","type":"*github.com/benbjohnson/litestream/abs.ReplicaClient","span":{"start":[362,1],"end":[362,23],"bytes":[11342,11364]}},"closed":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/closed","kind":"field","type":"bool","span":{"start":[370,1],"end":[370,13],"bytes":[11494,11506]}},"ctx":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/ctx","kind":"field","type":"context.Context","span":{"start":[360,1],"end":[360,24],"bytes":[11291,11314]}},"err":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/err","kind":"field","type":"error","span":{"start":[371,1],"end":[371,14],"bytes":[11507,11520]}},"info":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/info","kind":"field","type":"invalid type","span":{"start":[372,1],"end":[372,22],"bytes":[11521,11542]}},"level":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/level","kind":"field","type":"int","span":{"start":[363,1],"end":[363,12],"bytes":[11365,11376]}},"pageIndex":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/pageIndex","kind":"field","type":"int","span":{"start":[368,1],"end":[368,15],"bytes":[11478,11492]}},"pageItems":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/pageItems","kind":"field","type":"[]invalid type","span":{"start":[367,1],"end":[367,27],"bytes":[11451,11477]}},"pager":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/pager","kind":"field","type":"invalid type","span":{"start":[366,1],"end":[366,56],"bytes":[11395,11450]}},"seek":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/seek","kind":"field","type":"invalid type","span":{"start":[364,1],"end":[364,17],"bytes":[11377,11393]}}}}},"functions":{"github.com/benbjohnson/litestream/abs.NewReplicaClient":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","kind":"function","span":{"start":[63,1],"end":[67,2],"bytes":[1637,1761]},"signature":"github.com/benbjohnson/litestream/abs.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/abs.ReplicaClient","metrics":{"cyclomatic":1},"body":{"65:11":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient@65:11","span":{"start":[65,11],"end":[65,54],"bytes":[1712,1755]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"65:11/2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient@65:11/2","span":{"start":[65,11],"end":[65,25],"bytes":[1712,1726]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","kind":"function","span":{"start":[76,1],"end":[93,2],"bytes":[2058,2578]},"signature":"github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}},{"name":"host","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}},{"name":"urlPath","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}},{"name":"query","type":"net/url.Values","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[76,1],"end":[76,137],"bytes":[2058,2194]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"77:12":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL@77:12","span":{"start":[77,12],"end":[77,30],"bytes":[2206,2224]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient"},"81:24":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL@81:24","span":{"start":[81,24],"end":[81,43],"bytes":[2352,2371]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Username"},"86:20":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL@86:20","span":{"start":[86,20],"end":[86,41],"bytes":[2440,2461]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"89:15":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL@89:15","span":{"start":[89,15],"end":[89,64],"bytes":[2503,2552]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/abs.init":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.init","kind":"function","span":{"start":[32,1],"end":[34,2],"bytes":[701,789]},"signature":"github.com/benbjohnson/litestream/abs.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"33:2":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.init@33:2","span":{"start":[33,2],"end":[33,73],"bytes":[716,787]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/abs.isNotExists":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","kind":"function","span":{"start":[493,1],"end":[499,2],"bytes":[14325,14565]},"signature":"github.com/benbjohnson/litestream/abs.isNotExists","parameters":[{"name":"err","type":"error","span":{"start":[493,1],"end":[493,35],"bytes":[14325,14359]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"495:5":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists@495:5","span":{"start":[495,5],"end":[495,29],"bytes":[14399,14423]},"callee":"can://litestream/litestream/@external/errors/As"},"496:31":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists@496:31","span":{"start":[496,31],"end":[496,61],"bytes":[14456,14486]},"callee":null},"496:86":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists@496:86","span":{"start":[496,86],"end":[496,121],"bytes":[14511,14546]},"callee":null}}},"github.com/benbjohnson/litestream/abs.newLTXFileIterator":{"id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator","kind":"function","span":{"start":[375,1],"end":[396,2],"bytes":[11546,12128]},"signature":"github.com/benbjohnson/litestream/abs.newLTXFileIterator","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[375,1],"end":[375,113],"bytes":[11546,11658]}},{"name":"client","type":"*github.com/benbjohnson/litestream/abs.ReplicaClient","span":{"start":[375,1],"end":[375,113],"bytes":[11546,11658]}},{"name":"level","type":"int","span":{"start":[375,1],"end":[375,113],"bytes":[11546,11658]}},{"name":"seek","type":"invalid type","span":{"start":[375,1],"end":[375,113],"bytes":[11546,11658]}}],"return_type":"*github.com/benbjohnson/litestream/abs.ltxFileIterator","metrics":{"cyclomatic":1},"body":{"376:17":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator@376:17","span":{"start":[376,17],"end":[376,40],"bytes":[11675,11698]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"387:9":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator@387:9","span":{"start":[387,9],"end":[387,51],"bytes":[11879,11921]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"390:14":{"kind":"call","id":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator@390:14","span":{"start":[390,14],"end":[393,4],"bytes":[11957,12113]},"callee":null}}}},"content_hash":"c7db1d1f59a3eba397f1aaf250de94ac365294a2e7006e25b32337d5bd5f5c63"},"cmd/litestream-test/load.go":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go","kind":"module","span":{"start":[1,1],"end":[334,1],"bytes":[0,8040]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\tcryptorand \"crypto/rand\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math/rand\"\n\t\"os\"\n\t\"os/signal\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"syscall\"\n\t\"time\"\n\n\t_ \"github.com/mattn/go-sqlite3\"\n)\n\ntype LoadCommand struct {\n\tMain *Main\n\n\tDB string\n\tWriteRate int\n\tDuration time.Duration\n\tPattern string\n\tPayloadSize int\n\tReadRatio float64\n\tWorkers int\n}\n\ntype LoadStats struct {\n\twrites int64\n\treads int64\n\terrors int64\n\tstartTime time.Time\n\tlastReport time.Time\n\tmu sync.Mutex\n}\n\nfunc (c *LoadCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test load\", flag.ExitOnError)\n\tfs.StringVar(\u0026c.DB, \"db\", \"\", \"Database path (required)\")\n\tfs.IntVar(\u0026c.WriteRate, \"write-rate\", 100, \"Writes per second\")\n\tfs.DurationVar(\u0026c.Duration, \"duration\", 1*time.Minute, \"How long to run\")\n\tfs.StringVar(\u0026c.Pattern, \"pattern\", \"constant\", \"Write pattern (constant, burst, random, wave)\")\n\tfs.IntVar(\u0026c.PayloadSize, \"payload-size\", 1024, \"Size of each write operation in bytes\")\n\tfs.Float64Var(\u0026c.ReadRatio, \"read-ratio\", 0.2, \"Read/write ratio (0.0-1.0)\")\n\tfs.IntVar(\u0026c.Workers, \"workers\", 1, \"Number of concurrent workers\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif c.DB == \"\" {\n\t\treturn fmt.Errorf(\"database path required\")\n\t}\n\n\tif _, err := os.Stat(c.DB); err != nil {\n\t\treturn fmt.Errorf(\"database does not exist: %w\", err)\n\t}\n\n\tslog.Info(\"Starting load generation\",\n\t\t\"db\", c.DB,\n\t\t\"write_rate\", c.WriteRate,\n\t\t\"duration\", c.Duration,\n\t\t\"pattern\", c.Pattern,\n\t\t\"payload_size\", c.PayloadSize,\n\t\t\"read_ratio\", c.ReadRatio,\n\t\t\"workers\", c.Workers,\n\t)\n\n\treturn c.generateLoad(ctx)\n}\n\nfunc (c *LoadCommand) generateLoad(ctx context.Context) error {\n\tdb, err := sql.Open(\"sqlite3\", c.DB+\"?_journal_mode=WAL\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database: %w\", err)\n\t}\n\tdefer db.Close()\n\n\tdb.SetMaxOpenConns(c.Workers + 1)\n\tdb.SetMaxIdleConns(c.Workers)\n\n\tif err := c.ensureTestTable(db); err != nil {\n\t\treturn fmt.Errorf(\"ensure test table: %w\", err)\n\t}\n\n\tctx, cancel := context.WithTimeout(ctx, c.Duration)\n\tdefer cancel()\n\n\tsigChan := make(chan os.Signal, 1)\n\tsignal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)\n\tgo func() {\n\t\t\u003c-sigChan\n\t\tslog.Info(\"Received interrupt signal, stopping load generation\")\n\t\tcancel()\n\t}()\n\n\tstats := \u0026LoadStats{\n\t\tstartTime: time.Now(),\n\t\tlastReport: time.Now(),\n\t}\n\n\tvar wg sync.WaitGroup\n\tfor i := 0; i \u003c c.Workers; i++ {\n\t\twg.Add(1)\n\t\tgo func(workerID int) {\n\t\t\tdefer wg.Done()\n\t\t\tc.worker(ctx, db, workerID, stats)\n\t\t}(i)\n\t}\n\n\tgo c.reportStats(ctx, stats)\n\n\twg.Wait()\n\n\tc.finalReport(stats)\n\treturn nil\n}\n\nfunc (c *LoadCommand) worker(ctx context.Context, db *sql.DB, workerID int, stats *LoadStats) {\n\tticker := time.NewTicker(time.Second / time.Duration(c.WriteRate/c.Workers))\n\tdefer ticker.Stop()\n\n\tdata := make([]byte, c.PayloadSize)\n\tcryptorand.Read(data)\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn\n\t\tcase \u003c-ticker.C:\n\t\t\t// calculateRate() returns a modulation factor (not a multiplier\n\t\t\t// on the number of ops). The ticker already fires at the base\n\t\t\t// write-rate, so rate is used only to gate whether this tick\n\t\t\t// produces an operation: \u003c=0 means skip, \u003c1 means probabilistic,\n\t\t\t// \u003e=1 means always fire.\n\t\t\trate := c.calculateRate(stats)\n\t\t\tif rate \u003c= 0 || (rate \u003c 1.0 \u0026\u0026 rand.Float64() \u003e rate) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif rand.Float64() \u003c c.ReadRatio {\n\t\t\t\tif err := c.performRead(db); err != nil {\n\t\t\t\t\tatomic.AddInt64(\u0026stats.errors, 1)\n\t\t\t\t\tslog.Error(\"Read failed\", \"error\", err)\n\t\t\t\t} else {\n\t\t\t\t\tatomic.AddInt64(\u0026stats.reads, 1)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err := c.performWrite(db, data); err != nil {\n\t\t\t\t\tatomic.AddInt64(\u0026stats.errors, 1)\n\t\t\t\t\tslog.Error(\"Write failed\", \"error\", err)\n\t\t\t\t} else {\n\t\t\t\t\tatomic.AddInt64(\u0026stats.writes, 1)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (c *LoadCommand) calculateRate(stats *LoadStats) float64 {\n\telapsed := time.Since(stats.startTime).Seconds()\n\n\tswitch c.Pattern {\n\tcase \"burst\":\n\t\tif int(elapsed)%10 \u003c 3 {\n\t\t\treturn 2.0\n\t\t}\n\t\treturn 0.0\n\tcase \"random\":\n\t\treturn rand.Float64() * 2.0\n\tcase \"wave\":\n\t\treturn 1.0 + 0.4*sinApprox(elapsed/10.0)\n\tdefault:\n\t\treturn 1.0\n\t}\n}\n\nfunc sinApprox(x float64) float64 {\n\tconst twoPi = 2 * 3.14159265359\n\tx = x - float64(int(x/twoPi))*twoPi\n\n\tif x \u003c 3.14159265359 {\n\t\treturn 4 * x * (3.14159265359 - x) / (3.14159265359 * 3.14159265359)\n\t}\n\tx = x - 3.14159265359\n\treturn -4 * x * (3.14159265359 - x) / (3.14159265359 * 3.14159265359)\n}\n\nfunc (c *LoadCommand) ensureTestTable(db *sql.DB) error {\n\tcreateSQL := `\n\t\tCREATE TABLE IF NOT EXISTS load_test (\n\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\tdata BLOB,\n\t\t\ttext_field TEXT,\n\t\t\tint_field INTEGER,\n\t\t\ttimestamp INTEGER\n\t\t)\n\t`\n\t_, err := db.Exec(createSQL)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create table: %w\", err)\n\t}\n\n\t_, err = db.Exec(\"CREATE INDEX IF NOT EXISTS idx_load_test_timestamp ON load_test(timestamp)\")\n\treturn err\n}\n\nfunc (c *LoadCommand) performWrite(db *sql.DB, data []byte) error {\n\ttextField := fmt.Sprintf(\"load_%d\", time.Now().UnixNano())\n\tintField := rand.Int63()\n\ttimestamp := time.Now().Unix()\n\n\t_, err := db.Exec(`\n\t\tINSERT INTO load_test (data, text_field, int_field, timestamp)\n\t\tVALUES (?, ?, ?, ?)\n\t`, data, textField, intField, timestamp)\n\n\treturn err\n}\n\nfunc (c *LoadCommand) performRead(db *sql.DB) error {\n\tvar count int\n\tquery := `SELECT COUNT(*) FROM load_test WHERE timestamp \u003e ?`\n\ttimestamp := time.Now().Add(-1 * time.Hour).Unix()\n\n\treturn db.QueryRow(query, timestamp).Scan(\u0026count)\n}\n\nfunc (c *LoadCommand) reportStats(ctx context.Context, stats *LoadStats) {\n\tticker := time.NewTicker(5 * time.Second)\n\tdefer ticker.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn\n\t\tcase \u003c-ticker.C:\n\t\t\tstats.mu.Lock()\n\t\t\telapsed := time.Since(stats.lastReport).Seconds()\n\t\t\twrites := atomic.LoadInt64(\u0026stats.writes)\n\t\t\treads := atomic.LoadInt64(\u0026stats.reads)\n\t\t\terrors := atomic.LoadInt64(\u0026stats.errors)\n\n\t\t\twriteRate := float64(writes) / elapsed\n\t\t\treadRate := float64(reads) / elapsed\n\n\t\t\tslog.Info(\"Load statistics\",\n\t\t\t\t\"writes_per_sec\", fmt.Sprintf(\"%.1f\", writeRate),\n\t\t\t\t\"reads_per_sec\", fmt.Sprintf(\"%.1f\", readRate),\n\t\t\t\t\"total_writes\", writes,\n\t\t\t\t\"total_reads\", reads,\n\t\t\t\t\"errors\", errors,\n\t\t\t\t\"elapsed\", time.Since(stats.startTime).Round(time.Second),\n\t\t\t)\n\n\t\t\tatomic.StoreInt64(\u0026stats.writes, 0)\n\t\t\tatomic.StoreInt64(\u0026stats.reads, 0)\n\t\t\tstats.lastReport = time.Now()\n\t\t\tstats.mu.Unlock()\n\t\t}\n\t}\n}\n\nfunc (c *LoadCommand) finalReport(stats *LoadStats) {\n\ttotalTime := time.Since(stats.startTime)\n\twrites := atomic.LoadInt64(\u0026stats.writes)\n\treads := atomic.LoadInt64(\u0026stats.reads)\n\terrors := atomic.LoadInt64(\u0026stats.errors)\n\n\tslog.Info(\"Load generation complete\",\n\t\t\"duration\", totalTime.Round(time.Second),\n\t\t\"total_writes\", writes,\n\t\t\"total_reads\", reads,\n\t\t\"total_errors\", errors,\n\t\t\"avg_writes_per_sec\", fmt.Sprintf(\"%.1f\", float64(writes)/totalTime.Seconds()),\n\t\t\"avg_reads_per_sec\", fmt.Sprintf(\"%.1f\", float64(reads)/totalTime.Seconds()),\n\t)\n}\n\nfunc (c *LoadCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nGenerate continuous load on a SQLite database for testing.\n\nUsage:\n\n\tlitestream-test load [options]\n\nOptions:\n\n\t-db PATH\n\t Database path (required)\n\n\t-write-rate RATE\n\t Target writes per second\n\t Default: 100\n\n\t-duration DURATION\n\t How long to run (e.g., \"10m\", \"1h\")\n\t Default: 1m\n\n\t-pattern PATTERN\n\t Write pattern: constant, burst, random, wave\n\t Default: constant\n\n\t-payload-size SIZE\n\t Size of each write operation in bytes\n\t Default: 1024\n\n\t-read-ratio RATIO\n\t Read/write ratio (0.0-1.0)\n\t Default: 0.2\n\n\t-workers COUNT\n\t Number of concurrent workers\n\t Default: 1\n\nExamples:\n\n\t# Generate constant load for 10 minutes\n\tlitestream-test load -db /tmp/test.db -write-rate 100 -duration 10m\n\n\t# Generate burst pattern load\n\tlitestream-test load -db /tmp/test.db -pattern burst -duration 1h\n\n\t# Heavy write load with multiple workers\n\tlitestream-test load -db /tmp/test.db -write-rate 1000 -workers 4 -read-ratio 0.1\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"rand","path":"crypto/rand","alias":"cryptorand","span":{"start":[5,1],"end":[5,26],"bytes":[34,59]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[60,75]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[76,83]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[84,90]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[91,102]}},{"name":"rand","path":"math/rand","span":{"start":[10,1],"end":[10,13],"bytes":[103,115]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[116,121]}},{"name":"signal","path":"os/signal","span":{"start":[12,1],"end":[12,13],"bytes":[122,134]}},{"name":"sync","path":"sync","span":{"start":[13,1],"end":[13,8],"bytes":[135,142]}},{"name":"atomic","path":"sync/atomic","span":{"start":[14,1],"end":[14,15],"bytes":[143,157]}},{"name":"syscall","path":"syscall","span":{"start":[15,1],"end":[15,11],"bytes":[158,168]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[169,176]}},{"name":"go-sqlite3","path":"github.com/mattn/go-sqlite3","alias":"_","span":{"start":[18,1],"end":[18,33],"bytes":[178,210]}}],"types":{"LoadCommand":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand","kind":"struct","span":{"start":[21,1],"end":[31,2],"bytes":[214,393]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","kind":"method","span":{"start":[42,1],"end":[75,2],"bytes":[543,1709]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[42,1],"end":[42,70],"bytes":[543,612]}},{"name":"args","type":"[]string","span":{"start":[42,1],"end":[42,70],"bytes":[543,612]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"43:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@43:8","span":{"start":[43,8],"end":[43,65],"bytes":[620,677]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"44:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@44:2","span":{"start":[44,2],"end":[44,59],"bytes":[679,736]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"45:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@45:2","span":{"start":[45,2],"end":[45,65],"bytes":[738,801]},"callee":"can://litestream/litestream/@external/flag/FlagSet.IntVar"},"46:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@46:2","span":{"start":[46,2],"end":[46,75],"bytes":[803,876]},"callee":"can://litestream/litestream/@external/flag/FlagSet.DurationVar"},"47:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@47:2","span":{"start":[47,2],"end":[47,98],"bytes":[878,974]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"48:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@48:2","span":{"start":[48,2],"end":[48,90],"bytes":[976,1064]},"callee":"can://litestream/litestream/@external/flag/FlagSet.IntVar"},"49:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@49:2","span":{"start":[49,2],"end":[49,78],"bytes":[1066,1142]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Float64Var"},"50:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@50:2","span":{"start":[50,2],"end":[50,69],"bytes":[1144,1211]},"callee":"can://litestream/litestream/@external/flag/FlagSet.IntVar"},"52:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@52:12","span":{"start":[52,12],"end":[52,26],"bytes":[1243,1257]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"57:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@57:10","span":{"start":[57,10],"end":[57,46],"bytes":[1315,1351]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"60:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@60:15","span":{"start":[60,15],"end":[60,28],"bytes":[1370,1383]},"callee":"can://litestream/litestream/@external/os/Stat"},"61:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@61:10","span":{"start":[61,10],"end":[61,56],"bytes":[1407,1453]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"64:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@64:2","span":{"start":[64,2],"end":[72,3],"bytes":[1459,1678]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"74:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run@74:9","span":{"start":[74,9],"end":[74,28],"bytes":[1688,1707]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Usage","kind":"method","span":{"start":[285,1],"end":[333,2],"bytes":[7012,8039]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"286:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Usage@286:2","span":{"start":[286,2],"end":[332,7],"bytes":[7045,8037]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","kind":"method","span":{"start":[165,1],"end":[181,2],"bytes":[3859,4197]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","parameters":[{"name":"stats","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","span":{"start":[165,1],"end":[165,64],"bytes":[3859,3922]}}],"return_type":"float64","metrics":{"cyclomatic":7},"body":{"166:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate@166:13","span":{"start":[166,13],"end":[166,50],"bytes":[3935,3972]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"166:13/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate@166:13/2","span":{"start":[166,13],"end":[166,40],"bytes":[3935,3962]},"callee":"can://litestream/litestream/@external/time/Since"},"170:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate@170:6","span":{"start":[170,6],"end":[170,18],"bytes":[4014,4026]},"callee":null},"175:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate@175:10","span":{"start":[175,10],"end":[175,24],"bytes":[4092,4106]},"callee":"can://litestream/litestream/@external/math/rand/Float64"},"177:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate@177:20","span":{"start":[177,20],"end":[177,43],"bytes":[4146,4169]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable","kind":"method","span":{"start":[194,1],"end":[211,2],"bytes":[4501,4946]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[194,1],"end":[194,58],"bytes":[4501,4558]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"204:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable@204:12","span":{"start":[204,12],"end":[204,30],"bytes":[4752,4770]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"206:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable@206:10","span":{"start":[206,10],"end":[206,45],"bytes":[4797,4832]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"209:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable@209:11","span":{"start":[209,11],"end":[209,96],"bytes":[4847,4932]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","kind":"method","span":{"start":[269,1],"end":[283,2],"bytes":[6461,7010]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","parameters":[{"name":"stats","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","span":{"start":[269,1],"end":[269,54],"bytes":[6461,6514]}}],"metrics":{"cyclomatic":1},"body":{"270:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@270:15","span":{"start":[270,15],"end":[270,42],"bytes":[6529,6556]},"callee":"can://litestream/litestream/@external/time/Since"},"271:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@271:12","span":{"start":[271,12],"end":[271,43],"bytes":[6568,6599]},"callee":"can://litestream/litestream/@external/sync/atomic/LoadInt64"},"272:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@272:11","span":{"start":[272,11],"end":[272,41],"bytes":[6610,6640]},"callee":"can://litestream/litestream/@external/sync/atomic/LoadInt64"},"273:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@273:12","span":{"start":[273,12],"end":[273,43],"bytes":[6652,6683]},"callee":"can://litestream/litestream/@external/sync/atomic/LoadInt64"},"275:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@275:2","span":{"start":[275,2],"end":[282,3],"bytes":[6686,7008]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"276:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@276:15","span":{"start":[276,15],"end":[276,43],"bytes":[6738,6766]},"callee":"can://litestream/litestream/@external/time/Duration.Round"},"280:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@280:25","span":{"start":[280,25],"end":[280,81],"bytes":[6868,6924]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"280:45":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@280:45","span":{"start":[280,45],"end":[280,60],"bytes":[6888,6903]},"callee":null},"280:61":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@280:61","span":{"start":[280,61],"end":[280,80],"bytes":[6904,6923]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"281:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@281:24","span":{"start":[281,24],"end":[281,79],"bytes":[6949,7004]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"281:44":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@281:44","span":{"start":[281,44],"end":[281,58],"bytes":[6969,6983]},"callee":null},"281:59":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport@281:59","span":{"start":[281,59],"end":[281,78],"bytes":[6984,7003]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","kind":"method","span":{"start":[77,1],"end":[122,2],"bytes":[1711,2676]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[77,1],"end":[77,64],"bytes":[1711,1774]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"103:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@103:15","span":{"start":[103,15],"end":[103,25],"bytes":[2393,2403]},"callee":"can://litestream/litestream/@external/time/Now"},"104:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@104:15","span":{"start":[104,15],"end":[104,25],"bytes":[2419,2429]},"callee":"can://litestream/litestream/@external/time/Now"},"109:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@109:3","span":{"start":[109,3],"end":[109,12],"bytes":[2494,2503]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"110:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@110:6","span":{"start":[110,6],"end":[113,7],"bytes":[2509,2593]},"callee":null,"is_goroutine":true},"116:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@116:5","span":{"start":[116,5],"end":[116,30],"bytes":[2602,2627]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","is_goroutine":true},"118:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@118:2","span":{"start":[118,2],"end":[118,11],"bytes":[2630,2639]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Wait"},"120:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@120:2","span":{"start":[120,2],"end":[120,22],"bytes":[2642,2662]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport"},"78:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@78:13","span":{"start":[78,13],"end":[78,59],"bytes":[1787,1833]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"80:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@80:10","span":{"start":[80,10],"end":[80,46],"bytes":[1860,1896]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"82:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@82:8","span":{"start":[82,8],"end":[82,18],"bytes":[1907,1917]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close","is_deferred":true},"84:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@84:2","span":{"start":[84,2],"end":[84,35],"bytes":[1920,1953]},"callee":"can://litestream/litestream/@external/database/sql/DB.SetMaxOpenConns"},"85:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@85:2","span":{"start":[85,2],"end":[85,31],"bytes":[1955,1984]},"callee":"can://litestream/litestream/@external/database/sql/DB.SetMaxIdleConns"},"87:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@87:12","span":{"start":[87,12],"end":[87,33],"bytes":[1997,2018]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable"},"88:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@88:10","span":{"start":[88,10],"end":[88,50],"bytes":[2042,2082]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"91:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@91:17","span":{"start":[91,17],"end":[91,53],"bytes":[2103,2139]},"callee":"can://litestream/litestream/@external/context/WithTimeout"},"92:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@92:8","span":{"start":[92,8],"end":[92,16],"bytes":[2147,2155]},"callee":null,"is_deferred":true},"94:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@94:13","span":{"start":[94,13],"end":[94,36],"bytes":[2169,2192]},"callee":null},"95:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@95:2","span":{"start":[95,2],"end":[95,55],"bytes":[2194,2247]},"callee":"can://litestream/litestream/@external/os/signal/Notify"},"96:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad@96:5","span":{"start":[96,5],"end":[100,5],"bytes":[2252,2355]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_1","kind":"function","span":{"start":[96,1],"end":[100,5],"bytes":[2248,2355]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_1","parameters":[],"body":{"98:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_1@98:3","span":{"start":[98,3],"end":[98,67],"bytes":[2275,2339]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"99:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_1@99:3","span":{"start":[99,3],"end":[99,11],"bytes":[2342,2350]},"callee":null}}},"closure_2":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_2","kind":"function","span":{"start":[110,1],"end":[113,7],"bytes":[2504,2593]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_2","parameters":[{"name":"workerID","type":"int","span":{"start":[110,1],"end":[110,26],"bytes":[2504,2529]}}],"body":{"111:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_2@111:10","span":{"start":[111,10],"end":[111,19],"bytes":[2539,2548]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"112:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_2@112:4","span":{"start":[112,4],"end":[112,38],"bytes":[2552,2586]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker"}}}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","kind":"method","span":{"start":[226,1],"end":[232,2],"bytes":[5301,5538]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[226,1],"end":[226,54],"bytes":[5301,5354]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"229:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead@229:15","span":{"start":[229,15],"end":[229,52],"bytes":[5447,5484]},"callee":"can://litestream/litestream/@external/time/Time.Unix"},"229:15/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead@229:15/2","span":{"start":[229,15],"end":[229,45],"bytes":[5447,5477]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"229:15/3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead@229:15/3","span":{"start":[229,15],"end":[229,25],"bytes":[5447,5457]},"callee":"can://litestream/litestream/@external/time/Now"},"231:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead@231:9","span":{"start":[231,9],"end":[231,51],"bytes":[5494,5536]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"231:9/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead@231:9/2","span":{"start":[231,9],"end":[231,38],"bytes":[5494,5523]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRow"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","kind":"method","span":{"start":[213,1],"end":[224,2],"bytes":[4948,5299]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[213,1],"end":[213,68],"bytes":[4948,5015]}},{"name":"data","type":"[]byte","span":{"start":[213,1],"end":[213,68],"bytes":[4948,5015]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"214:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite@214:15","span":{"start":[214,15],"end":[214,60],"bytes":[5030,5075]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"214:38":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite@214:38","span":{"start":[214,38],"end":[214,59],"bytes":[5053,5074]},"callee":"can://litestream/litestream/@external/time/Time.UnixNano"},"214:38/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite@214:38/2","span":{"start":[214,38],"end":[214,48],"bytes":[5053,5063]},"callee":"can://litestream/litestream/@external/time/Now"},"215:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite@215:14","span":{"start":[215,14],"end":[215,26],"bytes":[5089,5101]},"callee":"can://litestream/litestream/@external/math/rand/Int63"},"216:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite@216:15","span":{"start":[216,15],"end":[216,32],"bytes":[5116,5133]},"callee":"can://litestream/litestream/@external/time/Time.Unix"},"216:15/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite@216:15/2","span":{"start":[216,15],"end":[216,25],"bytes":[5116,5126]},"callee":"can://litestream/litestream/@external/time/Now"},"218:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite@218:12","span":{"start":[218,12],"end":[221,42],"bytes":[5146,5284]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","kind":"method","span":{"start":[234,1],"end":[267,2],"bytes":[5540,6459]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[234,1],"end":[234,75],"bytes":[5540,5614]}},{"name":"stats","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","span":{"start":[234,1],"end":[234,75],"bytes":[5540,5614]}}],"metrics":{"cyclomatic":5},"body":{"235:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@235:12","span":{"start":[235,12],"end":[235,43],"bytes":[5626,5657]},"callee":"can://litestream/litestream/@external/time/NewTicker"},"236:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@236:8","span":{"start":[236,8],"end":[236,21],"bytes":[5665,5678]},"callee":"can://litestream/litestream/@external/time/Ticker.Stop","is_deferred":true},"240:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@240:10","span":{"start":[240,10],"end":[240,20],"bytes":[5707,5717]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"243:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@243:4","span":{"start":[243,4],"end":[243,19],"bytes":[5751,5766]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"244:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@244:15","span":{"start":[244,15],"end":[244,53],"bytes":[5781,5819]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"244:15/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@244:15/2","span":{"start":[244,15],"end":[244,43],"bytes":[5781,5809]},"callee":"can://litestream/litestream/@external/time/Since"},"245:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@245:14","span":{"start":[245,14],"end":[245,45],"bytes":[5833,5864]},"callee":"can://litestream/litestream/@external/sync/atomic/LoadInt64"},"246:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@246:13","span":{"start":[246,13],"end":[246,43],"bytes":[5877,5907]},"callee":"can://litestream/litestream/@external/sync/atomic/LoadInt64"},"247:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@247:14","span":{"start":[247,14],"end":[247,45],"bytes":[5921,5952]},"callee":"can://litestream/litestream/@external/sync/atomic/LoadInt64"},"249:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@249:17","span":{"start":[249,17],"end":[249,32],"bytes":[5970,5985]},"callee":null},"250:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@250:16","span":{"start":[250,16],"end":[250,30],"bytes":[6011,6025]},"callee":null},"252:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@252:4","span":{"start":[252,4],"end":[259,5],"bytes":[6040,6318]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"253:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@253:23","span":{"start":[253,23],"end":[253,53],"bytes":[6091,6121]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"254:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@254:22","span":{"start":[254,22],"end":[254,51],"bytes":[6144,6173]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"258:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@258:16","span":{"start":[258,16],"end":[258,62],"bytes":[6266,6312]},"callee":"can://litestream/litestream/@external/time/Duration.Round"},"258:16/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@258:16/2","span":{"start":[258,16],"end":[258,43],"bytes":[6266,6293]},"callee":"can://litestream/litestream/@external/time/Since"},"261:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@261:4","span":{"start":[261,4],"end":[261,39],"bytes":[6323,6358]},"callee":"can://litestream/litestream/@external/sync/atomic/StoreInt64"},"262:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@262:4","span":{"start":[262,4],"end":[262,38],"bytes":[6362,6396]},"callee":"can://litestream/litestream/@external/sync/atomic/StoreInt64"},"263:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@263:23","span":{"start":[263,23],"end":[263,33],"bytes":[6419,6429]},"callee":"can://litestream/litestream/@external/time/Now"},"264:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats@264:4","span":{"start":[264,4],"end":[264,21],"bytes":[6433,6450]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","kind":"method","span":{"start":[124,1],"end":[163,2],"bytes":[2678,3857]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[124,1],"end":[124,96],"bytes":[2678,2773]}},{"name":"db","type":"*database/sql.DB","span":{"start":[124,1],"end":[124,96],"bytes":[2678,2773]}},{"name":"workerID","type":"int","span":{"start":[124,1],"end":[124,96],"bytes":[2678,2773]}},{"name":"stats","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","span":{"start":[124,1],"end":[124,96],"bytes":[2678,2773]}}],"metrics":{"cyclomatic":9},"body":{"125:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@125:12","span":{"start":[125,12],"end":[125,78],"bytes":[2785,2851]},"callee":"can://litestream/litestream/@external/time/NewTicker"},"125:41":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@125:41","span":{"start":[125,41],"end":[125,77],"bytes":[2814,2850]},"callee":null},"126:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@126:8","span":{"start":[126,8],"end":[126,21],"bytes":[2859,2872]},"callee":"can://litestream/litestream/@external/time/Ticker.Stop","is_deferred":true},"128:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@128:10","span":{"start":[128,10],"end":[128,37],"bytes":[2883,2910]},"callee":null},"129:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@129:2","span":{"start":[129,2],"end":[129,23],"bytes":[2912,2933]},"callee":"can://litestream/litestream/@external/crypto/rand/Read"},"133:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@133:10","span":{"start":[133,10],"end":[133,20],"bytes":[2962,2972]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"141:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@141:12","span":{"start":[141,12],"end":[141,34],"bytes":[3311,3333]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate"},"142:35":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@142:35","span":{"start":[142,35],"end":[142,49],"bytes":[3368,3382]},"callee":"can://litestream/litestream/@external/math/rand/Float64"},"146:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@146:7","span":{"start":[146,7],"end":[146,21],"bytes":[3418,3432]},"callee":"can://litestream/litestream/@external/math/rand/Float64"},"147:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@147:15","span":{"start":[147,15],"end":[147,32],"bytes":[3463,3480]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead"},"148:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@148:6","span":{"start":[148,6],"end":[148,39],"bytes":[3500,3533]},"callee":"can://litestream/litestream/@external/sync/atomic/AddInt64"},"149:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@149:6","span":{"start":[149,6],"end":[149,45],"bytes":[3539,3578]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"151:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@151:6","span":{"start":[151,6],"end":[151,38],"bytes":[3597,3629]},"callee":"can://litestream/litestream/@external/sync/atomic/AddInt64"},"154:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@154:15","span":{"start":[154,15],"end":[154,39],"bytes":[3662,3686]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite"},"155:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@155:6","span":{"start":[155,6],"end":[155,39],"bytes":[3706,3739]},"callee":"can://litestream/litestream/@external/sync/atomic/AddInt64"},"156:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@156:6","span":{"start":[156,6],"end":[156,46],"bytes":[3745,3785]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"158:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker@158:6","span":{"start":[158,6],"end":[158,39],"bytes":[3804,3837]},"callee":"can://litestream/litestream/@external/sync/atomic/AddInt64"}}}},"fields":{"DB":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/DB","kind":"field","type":"string","span":{"start":[24,1],"end":[24,20],"bytes":[253,272]}},"Duration":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/Duration","kind":"field","type":"time.Duration","span":{"start":[26,1],"end":[26,27],"bytes":[290,316]}},"Main":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[22,1],"end":[22,12],"bytes":[240,251]}},"Pattern":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/Pattern","kind":"field","type":"string","span":{"start":[27,1],"end":[27,20],"bytes":[317,336]}},"PayloadSize":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/PayloadSize","kind":"field","type":"int","span":{"start":[28,1],"end":[28,17],"bytes":[337,353]}},"ReadRatio":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/ReadRatio","kind":"field","type":"float64","span":{"start":[29,1],"end":[29,21],"bytes":[354,374]}},"Workers":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/Workers","kind":"field","type":"int","span":{"start":[30,1],"end":[30,17],"bytes":[375,391]}},"WriteRate":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/WriteRate","kind":"field","type":"int","span":{"start":[25,1],"end":[25,17],"bytes":[273,289]}}}},"LoadStats":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats","kind":"struct","span":{"start":[33,1],"end":[40,2],"bytes":[395,541]},"callables":{},"fields":{"errors":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/errors","kind":"field","type":"int64","span":{"start":[36,1],"end":[36,18],"bytes":[455,472]}},"lastReport":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/lastReport","kind":"field","type":"time.Time","span":{"start":[38,1],"end":[38,22],"bytes":[495,516]}},"mu":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/mu","kind":"field","type":"sync.Mutex","span":{"start":[39,1],"end":[39,23],"bytes":[517,539]}},"reads":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/reads","kind":"field","type":"int64","span":{"start":[35,1],"end":[35,18],"bytes":[437,454]}},"startTime":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/startTime","kind":"field","type":"time.Time","span":{"start":[37,1],"end":[37,22],"bytes":[473,494]}},"writes":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadStats/writes","kind":"field","type":"int64","span":{"start":[34,1],"end":[34,18],"bytes":[419,436]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox":{"id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox","kind":"function","span":{"start":[183,1],"end":[192,2],"bytes":[4199,4499]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox","parameters":[{"name":"x","type":"float64","span":{"start":[183,1],"end":[183,36],"bytes":[4199,4234]}}],"return_type":"float64","metrics":{"cyclomatic":2},"body":{"185:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox@185:10","span":{"start":[185,10],"end":[185,31],"bytes":[4277,4298]},"callee":null},"185:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox@185:18","span":{"start":[185,18],"end":[185,30],"bytes":[4285,4297]},"callee":null}}}},"content_hash":"4a3c39cc4c30c25d8696d208ee058c8172951cbd2841a2652d75332912515aa9"},"cmd/litestream-test/main.go":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go","kind":"module","span":{"start":[1,1],"end":[124,1],"bytes":[0,2525]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n)\n\nvar (\n\tVersion = \"development\"\n\tCommit = \"\"\n)\n\nfunc main() {\n\tm := NewMain()\n\tif err := m.Run(context.Background(), os.Args[1:]); err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n}\n\ntype Main struct {\n\tStdin io.Reader\n\tStdout io.Writer\n\tStderr io.Writer\n}\n\nfunc NewMain() *Main {\n\treturn \u0026Main{\n\t\tStdin: os.Stdin,\n\t\tStdout: os.Stdout,\n\t\tStderr: os.Stderr,\n\t}\n}\n\nfunc (m *Main) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test\", flag.ExitOnError)\n\tfs.Usage = m.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 || fs.Arg(0) == \"help\" {\n\t\tm.Usage()\n\t\treturn nil\n\t}\n\n\tswitch fs.Arg(0) {\n\tcase \"populate\":\n\t\treturn (\u0026PopulateCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tcase \"load\":\n\t\treturn (\u0026LoadCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tcase \"shrink\":\n\t\treturn (\u0026ShrinkCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tcase \"validate\":\n\t\treturn (\u0026ValidateCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tcase \"version\":\n\t\treturn (\u0026VersionCommand{Main: m}).Run(ctx, fs.Args()[1:])\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown command: %s\", fs.Arg(0))\n\t}\n}\n\nfunc (m *Main) Usage() {\n\tfmt.Fprintln(m.Stdout, `\nlitestream-test is a testing harness for Litestream database replication.\n\nUsage:\n\n\tlitestream-test \u003ccommand\u003e [arguments]\n\nCommands:\n\n\tpopulate Quickly populate a database to a target size\n\tload Generate continuous load on a database\n\tshrink Shrink a database by deleting data\n\tvalidate Validate replication integrity\n\tversion Show version information\n\nUse \"litestream-test \u003ccommand\u003e -h\" for more information about a command.\n`[1:])\n}\n\ntype VersionCommand struct {\n\tMain *Main\n}\n\nfunc (c *VersionCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test version\", flag.ExitOnError)\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tfmt.Fprintf(c.Main.Stdout, \"litestream-test %s\\n\", Version)\n\tif Commit != \"\" {\n\t\tfmt.Fprintf(c.Main.Stdout, \"commit: %s\\n\", Commit)\n\t}\n\tfmt.Fprintf(c.Main.Stdout, \"go: %s\\n\", strings.TrimPrefix(runtime.Version(), \"go\"))\n\treturn nil\n}\n\nfunc (c *VersionCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nShow version information for litestream-test.\n\nUsage:\n\n\tlitestream-test version\n`[1:])\n}\n\nfunc init() {\n\tlogger := slog.New(slog.NewTextHandler(os.Stderr, \u0026slog.HandlerOptions{\n\t\tLevel: slog.LevelInfo,\n\t}))\n\tslog.SetDefault(logger)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"flag","path":"flag","span":{"start":[5,1],"end":[5,8],"bytes":[34,41]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[42,48]}},{"name":"io","path":"io","span":{"start":[7,1],"end":[7,6],"bytes":[49,54]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[55,66]}},{"name":"os","path":"os","span":{"start":[9,1],"end":[9,6],"bytes":[67,72]}},{"name":"runtime","path":"runtime","span":{"start":[10,1],"end":[10,11],"bytes":[73,83]}},{"name":"strings","path":"strings","span":{"start":[11,1],"end":[11,11],"bytes":[84,94]}}],"types":{"Main":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main","kind":"struct","span":{"start":[27,1],"end":[31,2],"bytes":[292,366]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","kind":"method","span":{"start":[41,1],"end":[67,2],"bytes":[474,1216]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[41,1],"end":[41,63],"bytes":[474,536]}},{"name":"args","type":"[]string","span":{"start":[41,1],"end":[41,63],"bytes":[474,536]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"42:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@42:8","span":{"start":[42,8],"end":[42,60],"bytes":[544,596]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"44:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@44:12","span":{"start":[44,12],"end":[44,26],"bytes":[628,642]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"48:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@48:23","span":{"start":[48,23],"end":[48,32],"bytes":[696,705]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"48:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@48:5","span":{"start":[48,5],"end":[48,14],"bytes":[678,687]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"49:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@49:3","span":{"start":[49,3],"end":[49,12],"bytes":[720,729]},"callee":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage"},"53:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@53:9","span":{"start":[53,9],"end":[53,18],"bytes":[755,764]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"55:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@55:10","span":{"start":[55,10],"end":[55,61],"bytes":[794,845]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run"},"55:47":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@55:47","span":{"start":[55,47],"end":[55,56],"bytes":[831,840]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Args"},"57:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@57:10","span":{"start":[57,10],"end":[57,57],"bytes":[869,916]},"callee":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run"},"57:43":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@57:43","span":{"start":[57,43],"end":[57,52],"bytes":[902,911]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Args"},"59:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@59:10","span":{"start":[59,10],"end":[59,59],"bytes":[942,991]},"callee":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run"},"59:45":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@59:45","span":{"start":[59,45],"end":[59,54],"bytes":[977,986]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Args"},"61:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@61:10","span":{"start":[61,10],"end":[61,61],"bytes":[1019,1070]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run"},"61:47":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@61:47","span":{"start":[61,47],"end":[61,56],"bytes":[1056,1065]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Args"},"63:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@63:10","span":{"start":[63,10],"end":[63,60],"bytes":[1097,1147]},"callee":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run"},"63:46":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@63:46","span":{"start":[63,46],"end":[63,55],"bytes":[1133,1142]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Args"},"65:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@65:10","span":{"start":[65,10],"end":[65,54],"bytes":[1167,1211]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"65:44":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run@65:44","span":{"start":[65,44],"end":[65,53],"bytes":[1201,1210]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage","kind":"method","span":{"start":[69,1],"end":[87,2],"bytes":[1218,1725]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"70:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage@70:2","span":{"start":[70,2],"end":[86,7],"bytes":[1244,1723]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"}}}},"fields":{"Stderr":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/Stderr","kind":"field","type":"io.Writer","span":{"start":[30,1],"end":[30,18],"bytes":[347,364]}},"Stdin":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/Stdin","kind":"field","type":"io.Reader","span":{"start":[28,1],"end":[28,18],"bytes":[311,328]}},"Stdout":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/Stdout","kind":"field","type":"io.Writer","span":{"start":[29,1],"end":[29,18],"bytes":[329,346]}}}},"VersionCommand":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand","kind":"struct","span":{"start":[89,1],"end":[91,2],"bytes":[1727,1769]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","kind":"method","span":{"start":[93,1],"end":[106,2],"bytes":[1771,2223]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[93,1],"end":[93,73],"bytes":[1771,1843]}},{"name":"args","type":"[]string","span":{"start":[93,1],"end":[93,73],"bytes":[1771,1843]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"100:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run@100:2","span":{"start":[100,2],"end":[100,61],"bytes":[1990,2049]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"},"102:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run@102:3","span":{"start":[102,3],"end":[102,53],"bytes":[2071,2121]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"},"104:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run@104:2","span":{"start":[104,2],"end":[104,85],"bytes":[2126,2209]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"},"104:41":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run@104:41","span":{"start":[104,41],"end":[104,84],"bytes":[2165,2208]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"104:60":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run@104:60","span":{"start":[104,60],"end":[104,77],"bytes":[2184,2201]},"callee":"can://litestream/litestream/@external/runtime/Version"},"94:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run@94:8","span":{"start":[94,8],"end":[94,68],"bytes":[1851,1911]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"96:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run@96:12","span":{"start":[96,12],"end":[96,26],"bytes":[1943,1957]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Usage","kind":"method","span":{"start":[108,1],"end":[116,2],"bytes":[2225,2379]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"109:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Usage@109:2","span":{"start":[109,2],"end":[115,7],"bytes":[2261,2377]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"}}}},"fields":{"Main":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[90,1],"end":[90,12],"bytes":[1756,1767]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream-test.NewMain":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.NewMain","kind":"function","span":{"start":[33,1],"end":[39,2],"bytes":[368,472]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.NewMain","parameters":[],"return_type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream-test.init":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.init","kind":"function","span":{"start":[118,1],"end":[123,2],"bytes":[2381,2524]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"119:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.init@119:12","span":{"start":[119,12],"end":[121,5],"bytes":[2406,2497]},"callee":"can://litestream/litestream/@external/log/slog/New"},"119:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.init@119:21","span":{"start":[119,21],"end":[121,4],"bytes":[2415,2496]},"callee":"can://litestream/litestream/@external/log/slog/NewTextHandler"},"122:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.init@122:2","span":{"start":[122,2],"end":[122,25],"bytes":[2499,2522]},"callee":"can://litestream/litestream/@external/log/slog/SetDefault"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.main":{"id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","kind":"function","span":{"start":[19,1],"end":[25,2],"bytes":[146,290]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.main","parameters":[],"metrics":{"cyclomatic":2},"body":{"20:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main@20:7","span":{"start":[20,7],"end":[20,16],"bytes":[166,175]},"callee":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.NewMain"},"21:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main@21:12","span":{"start":[21,12],"end":[21,52],"bytes":[187,227]},"callee":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run"},"21:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main@21:18","span":{"start":[21,18],"end":[21,38],"bytes":[193,213]},"callee":"can://litestream/litestream/@external/context/Background"},"22:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main@22:3","span":{"start":[22,3],"end":[22,31],"bytes":[244,272]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"},"23:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main@23:3","span":{"start":[23,3],"end":[23,13],"bytes":[275,285]},"callee":"can://litestream/litestream/@external/os/Exit"}}}},"content_hash":"1aec89087aea47d1cabfc7a216b2c37b7b7cf96292167f8e81e81125e0bc17b9"},"cmd/litestream-test/populate.go":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go","kind":"module","span":{"start":[1,1],"end":[323,1],"bytes":[0,7805]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\tcryptorand \"crypto/rand\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"math/rand\"\n\t\"os\"\n\t\"time\"\n\n\t_ \"github.com/mattn/go-sqlite3\"\n)\n\ntype PopulateCommand struct {\n\tMain *Main\n\n\tDB string\n\tTargetSize string\n\tRowSize int\n\tBatchSize int\n\tTableCount int\n\tIndexRatio float64\n\tPageSize int\n}\n\nfunc (c *PopulateCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test populate\", flag.ExitOnError)\n\tfs.StringVar(\u0026c.DB, \"db\", \"\", \"Database path (required)\")\n\tfs.StringVar(\u0026c.TargetSize, \"target-size\", \"100MB\", \"Target database size (e.g., 1GB, 500MB)\")\n\tfs.IntVar(\u0026c.RowSize, \"row-size\", 1024, \"Average row size in bytes\")\n\tfs.IntVar(\u0026c.BatchSize, \"batch-size\", 1000, \"Rows per transaction\")\n\tfs.IntVar(\u0026c.TableCount, \"table-count\", 1, \"Number of tables to create\")\n\tfs.Float64Var(\u0026c.IndexRatio, \"index-ratio\", 0.2, \"Percentage of columns to index (0.0-1.0)\")\n\tfs.IntVar(\u0026c.PageSize, \"page-size\", 4096, \"SQLite page size in bytes\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif c.DB == \"\" {\n\t\treturn fmt.Errorf(\"database path required\")\n\t}\n\n\ttargetBytes, err := parseSize(c.TargetSize)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid target size: %w\", err)\n\t}\n\n\tslog.Info(\"Starting database population\",\n\t\t\"db\", c.DB,\n\t\t\"target_size\", c.TargetSize,\n\t\t\"row_size\", c.RowSize,\n\t\t\"batch_size\", c.BatchSize,\n\t\t\"table_count\", c.TableCount,\n\t\t\"page_size\", c.PageSize,\n\t)\n\n\tif err := c.populateDatabase(ctx, targetBytes); err != nil {\n\t\treturn fmt.Errorf(\"populate database: %w\", err)\n\t}\n\n\tslog.Info(\"Database population complete\", \"db\", c.DB)\n\treturn nil\n}\n\nfunc (c *PopulateCommand) populateDatabase(ctx context.Context, targetBytes int64) error {\n\tif err := os.Remove(c.DB); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\tslog.Warn(\"Could not remove existing database\", \"error\", err)\n\t}\n\n\tdb, err := sql.Open(\"sqlite3\", c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database: %w\", err)\n\t}\n\tdefer db.Close()\n\n\tif _, err := db.Exec(fmt.Sprintf(\"PRAGMA page_size = %d\", c.PageSize)); err != nil {\n\t\treturn fmt.Errorf(\"set page size: %w\", err)\n\t}\n\n\tif _, err := db.Exec(\"PRAGMA journal_mode = WAL\"); err != nil {\n\t\treturn fmt.Errorf(\"set journal mode: %w\", err)\n\t}\n\n\tif _, err := db.Exec(\"PRAGMA synchronous = NORMAL\"); err != nil {\n\t\treturn fmt.Errorf(\"set synchronous: %w\", err)\n\t}\n\n\tfor i := 0; i \u003c c.TableCount; i++ {\n\t\ttableName := fmt.Sprintf(\"test_table_%d\", i)\n\n\t\tcreateSQL := fmt.Sprintf(`\n\t\t\tCREATE TABLE %s (\n\t\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\t\tdata BLOB,\n\t\t\t\ttext_field TEXT,\n\t\t\t\tint_field INTEGER,\n\t\t\t\tfloat_field REAL,\n\t\t\t\ttimestamp INTEGER\n\t\t\t)\n\t\t`, tableName)\n\n\t\tif _, err := db.Exec(createSQL); err != nil {\n\t\t\treturn fmt.Errorf(\"create table %s: %w\", tableName, err)\n\t\t}\n\n\t\tif c.IndexRatio \u003e 0 {\n\t\t\tif rand.Float64() \u003c c.IndexRatio {\n\t\t\t\tindexSQL := fmt.Sprintf(\"CREATE INDEX idx_%s_timestamp ON %s(timestamp)\", tableName, tableName)\n\t\t\t\tif _, err := db.Exec(indexSQL); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"create index: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif rand.Float64() \u003c c.IndexRatio {\n\t\t\t\tindexSQL := fmt.Sprintf(\"CREATE INDEX idx_%s_int ON %s(int_field)\", tableName, tableName)\n\t\t\t\tif _, err := db.Exec(indexSQL); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"create index: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ttotalRows := int(targetBytes / int64(c.RowSize))\n\trowsPerTable := totalRows / c.TableCount\n\tif rowsPerTable == 0 {\n\t\trowsPerTable = 1\n\t}\n\n\tslog.Info(\"Populating database\",\n\t\t\"target_bytes\", targetBytes,\n\t\t\"total_rows\", totalRows,\n\t\t\"rows_per_table\", rowsPerTable,\n\t)\n\n\tstartTime := time.Now()\n\tfor tableIdx := 0; tableIdx \u003c c.TableCount; tableIdx++ {\n\t\ttableName := fmt.Sprintf(\"test_table_%d\", tableIdx)\n\n\t\tif err := c.populateTable(ctx, db, tableName, rowsPerTable); err != nil {\n\t\t\treturn fmt.Errorf(\"populate table %s: %w\", tableName, err)\n\t\t}\n\n\t\tcurrentSize, _ := getDatabaseSize(c.DB)\n\t\tprogress := float64(currentSize) / float64(targetBytes) * 100\n\t\tslog.Info(\"Progress\",\n\t\t\t\"table\", tableName,\n\t\t\t\"current_size_mb\", currentSize/1024/1024,\n\t\t\t\"progress_percent\", fmt.Sprintf(\"%.1f\", progress),\n\t\t)\n\n\t\tif currentSize \u003e= targetBytes {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tduration := time.Since(startTime)\n\tfinalSize, _ := getDatabaseSize(c.DB)\n\n\tslog.Info(\"Population complete\",\n\t\t\"duration\", duration,\n\t\t\"final_size_mb\", finalSize/1024/1024,\n\t\t\"throughput_mb_per_sec\", fmt.Sprintf(\"%.2f\", float64(finalSize)/1024/1024/duration.Seconds()),\n\t)\n\n\treturn nil\n}\n\nfunc (c *PopulateCommand) populateTable(ctx context.Context, db *sql.DB, tableName string, rowCount int) error {\n\tdata := make([]byte, c.RowSize)\n\n\tfor i := 0; i \u003c rowCount; i += c.BatchSize {\n\t\ttx, err := db.Begin()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"begin transaction: %w\", err)\n\t\t}\n\n\t\tstmt, err := tx.Prepare(fmt.Sprintf(`\n\t\t\tINSERT INTO %s (data, text_field, int_field, float_field, timestamp)\n\t\t\tVALUES (?, ?, ?, ?, ?)\n\t\t`, tableName))\n\t\tif err != nil {\n\t\t\ttx.Rollback()\n\t\t\treturn fmt.Errorf(\"prepare statement: %w\", err)\n\t\t}\n\n\t\tbatchEnd := i + c.BatchSize\n\t\tif batchEnd \u003e rowCount {\n\t\t\tbatchEnd = rowCount\n\t\t}\n\n\t\tfor j := i; j \u003c batchEnd; j++ {\n\t\t\tcryptorand.Read(data)\n\t\t\ttextField := fmt.Sprintf(\"row_%d_%d\", i, j)\n\t\t\tintField := rand.Int63()\n\t\t\tfloatField := rand.Float64() * 1000\n\t\t\ttimestamp := time.Now().Unix()\n\n\t\t\tif _, err := stmt.Exec(data, textField, intField, floatField, timestamp); err != nil {\n\t\t\t\tstmt.Close()\n\t\t\t\ttx.Rollback()\n\t\t\t\treturn fmt.Errorf(\"insert row: %w\", err)\n\t\t\t}\n\t\t}\n\n\t\tstmt.Close()\n\t\tif err := tx.Commit(); err != nil {\n\t\t\treturn fmt.Errorf(\"commit transaction: %w\", err)\n\t\t}\n\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn ctx.Err()\n\t\tdefault:\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (c *PopulateCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nPopulate a SQLite database to a target size for testing.\n\nUsage:\n\n\tlitestream-test populate [options]\n\nOptions:\n\n\t-db PATH\n\t Database path (required)\n\n\t-target-size SIZE\n\t Target database size (e.g., \"1GB\", \"500MB\")\n\t Default: 100MB\n\n\t-row-size SIZE\n\t Average row size in bytes\n\t Default: 1024\n\n\t-batch-size COUNT\n\t Number of rows per transaction\n\t Default: 1000\n\n\t-table-count COUNT\n\t Number of tables to create\n\t Default: 1\n\n\t-index-ratio RATIO\n\t Percentage of columns to index (0.0-1.0)\n\t Default: 0.2\n\n\t-page-size SIZE\n\t SQLite page size in bytes\n\t Default: 4096\n\nExamples:\n\n\t# Create a 1GB database with default settings\n\tlitestream-test populate -db /tmp/test.db -target-size 1GB\n\n\t# Create a 2GB database with larger rows\n\tlitestream-test populate -db /tmp/test.db -target-size 2GB -row-size 4096\n\n\t# Test lock page with different page sizes\n\tlitestream-test populate -db /tmp/test.db -target-size 1.5GB -page-size 8192\n`[1:])\n}\n\nfunc parseSize(s string) (int64, error) {\n\t// Check suffixes in order from longest to shortest to avoid \"B\" matching before \"MB\"\n\tsuffixes := []struct {\n\t\tsuffix string\n\t\tmultiplier int64\n\t}{\n\t\t{\"TB\", 1024 * 1024 * 1024 * 1024},\n\t\t{\"GB\", 1024 * 1024 * 1024},\n\t\t{\"MB\", 1024 * 1024},\n\t\t{\"KB\", 1024},\n\t\t{\"B\", 1},\n\t}\n\n\tfor _, sf := range suffixes {\n\t\tif len(s) \u003e len(sf.suffix) \u0026\u0026 s[len(s)-len(sf.suffix):] == sf.suffix {\n\t\t\tvar value float64\n\t\t\tif _, err := fmt.Sscanf(s[:len(s)-len(sf.suffix)], \"%f\", \u0026value); err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\treturn int64(value * float64(sf.multiplier)), nil\n\t\t}\n\t}\n\n\tvar value int64\n\tif _, err := fmt.Sscanf(s, \"%d\", \u0026value); err != nil {\n\t\treturn 0, err\n\t}\n\treturn value, nil\n}\n\nfunc getDatabaseSize(path string) (int64, error) {\n\tinfo, err := os.Stat(path)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tsize := info.Size()\n\n\twalPath := path + \"-wal\"\n\tif walInfo, err := os.Stat(walPath); err == nil {\n\t\tsize += walInfo.Size()\n\t}\n\n\tshmPath := path + \"-shm\"\n\tif shmInfo, err := os.Stat(shmPath); err == nil {\n\t\tsize += shmInfo.Size()\n\t}\n\n\treturn size, nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"rand","path":"crypto/rand","alias":"cryptorand","span":{"start":[5,1],"end":[5,26],"bytes":[34,59]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[60,75]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[76,83]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[84,90]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[91,102]}},{"name":"rand","path":"math/rand","span":{"start":[10,1],"end":[10,13],"bytes":[103,115]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[116,121]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[122,129]}},{"name":"go-sqlite3","path":"github.com/mattn/go-sqlite3","alias":"_","span":{"start":[14,1],"end":[14,33],"bytes":[131,163]}}],"types":{"PopulateCommand":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand","kind":"struct","span":{"start":[17,1],"end":[27,2],"bytes":[167,333]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","kind":"method","span":{"start":[29,1],"end":[67,2],"bytes":[335,1662]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[29,1],"end":[29,74],"bytes":[335,408]}},{"name":"args","type":"[]string","span":{"start":[29,1],"end":[29,74],"bytes":[335,408]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"30:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@30:8","span":{"start":[30,8],"end":[30,69],"bytes":[416,477]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"31:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@31:2","span":{"start":[31,2],"end":[31,59],"bytes":[479,536]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"32:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@32:2","span":{"start":[32,2],"end":[32,96],"bytes":[538,632]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"33:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@33:2","span":{"start":[33,2],"end":[33,70],"bytes":[634,702]},"callee":"can://litestream/litestream/@external/flag/FlagSet.IntVar"},"34:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@34:2","span":{"start":[34,2],"end":[34,69],"bytes":[704,771]},"callee":"can://litestream/litestream/@external/flag/FlagSet.IntVar"},"35:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@35:2","span":{"start":[35,2],"end":[35,74],"bytes":[773,845]},"callee":"can://litestream/litestream/@external/flag/FlagSet.IntVar"},"36:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@36:2","span":{"start":[36,2],"end":[36,94],"bytes":[847,939]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Float64Var"},"37:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@37:2","span":{"start":[37,2],"end":[37,72],"bytes":[941,1011]},"callee":"can://litestream/litestream/@external/flag/FlagSet.IntVar"},"39:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@39:12","span":{"start":[39,12],"end":[39,26],"bytes":[1043,1057]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"44:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@44:10","span":{"start":[44,10],"end":[44,46],"bytes":[1115,1151]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"47:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@47:22","span":{"start":[47,22],"end":[47,45],"bytes":[1177,1200]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize"},"49:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@49:10","span":{"start":[49,10],"end":[49,52],"bytes":[1227,1269]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"52:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@52:2","span":{"start":[52,2],"end":[59,3],"bytes":[1275,1476]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"61:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@61:12","span":{"start":[61,12],"end":[61,48],"bytes":[1489,1525]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase"},"62:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@62:10","span":{"start":[62,10],"end":[62,50],"bytes":[1549,1589]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"65:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run@65:2","span":{"start":[65,2],"end":[65,55],"bytes":[1595,1648]},"callee":"can://litestream/litestream/@external/log/slog/Info"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Usage","kind":"method","span":{"start":[223,1],"end":[271,2],"bytes":[5669,6710]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"224:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Usage@224:2","span":{"start":[224,2],"end":[270,7],"bytes":[5706,6708]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","kind":"method","span":{"start":[69,1],"end":[169,2],"bytes":[1664,4461]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[69,1],"end":[69,91],"bytes":[1664,1754]}},{"name":"targetBytes","type":"int64","span":{"start":[69,1],"end":[69,91],"bytes":[1664,1754]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":17},"body":{"106:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@106:16","span":{"start":[106,16],"end":[106,34],"bytes":[2700,2718]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"107:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@107:11","span":{"start":[107,11],"end":[107,60],"bytes":[2743,2792]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"111:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@111:7","span":{"start":[111,7],"end":[111,21],"bytes":[2828,2842]},"callee":"can://litestream/litestream/@external/math/rand/Float64"},"112:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@112:17","span":{"start":[112,17],"end":[112,100],"bytes":[2876,2959]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"113:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@113:18","span":{"start":[113,18],"end":[113,35],"bytes":[2977,2994]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"114:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@114:13","span":{"start":[114,13],"end":[114,48],"bytes":[3021,3056]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"117:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@117:7","span":{"start":[117,7],"end":[117,21],"bytes":[3074,3088]},"callee":"can://litestream/litestream/@external/math/rand/Float64"},"118:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@118:17","span":{"start":[118,17],"end":[118,94],"bytes":[3122,3199]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"119:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@119:18","span":{"start":[119,18],"end":[119,35],"bytes":[3217,3234]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"120:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@120:13","span":{"start":[120,13],"end":[120,48],"bytes":[3261,3296]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"126:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@126:15","span":{"start":[126,15],"end":[126,50],"bytes":[3330,3365]},"callee":null},"126:33":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@126:33","span":{"start":[126,33],"end":[126,49],"bytes":[3348,3364]},"callee":null},"132:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@132:2","span":{"start":[132,2],"end":[136,3],"bytes":[3456,3583]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"138:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@138:15","span":{"start":[138,15],"end":[138,25],"bytes":[3599,3609]},"callee":"can://litestream/litestream/@external/time/Now"},"140:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@140:16","span":{"start":[140,16],"end":[140,54],"bytes":[3683,3721]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"142:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@142:13","span":{"start":[142,13],"end":[142,62],"bytes":[3735,3784]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable"},"143:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@143:11","span":{"start":[143,11],"end":[143,62],"bytes":[3809,3860]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"146:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@146:21","span":{"start":[146,21],"end":[146,42],"bytes":[3886,3907]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"147:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@147:15","span":{"start":[147,15],"end":[147,35],"bytes":[3922,3942]},"callee":null},"147:38":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@147:38","span":{"start":[147,38],"end":[147,58],"bytes":[3945,3965]},"callee":null},"148:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@148:3","span":{"start":[148,3],"end":[152,4],"bytes":[3974,4121]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"151:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@151:24","span":{"start":[151,24],"end":[151,53],"bytes":[4087,4116]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"159:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@159:14","span":{"start":[159,14],"end":[159,35],"bytes":[4187,4208]},"callee":"can://litestream/litestream/@external/time/Since"},"160:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@160:18","span":{"start":[160,18],"end":[160,39],"bytes":[4226,4247]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"162:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@162:2","span":{"start":[162,2],"end":[166,3],"bytes":[4250,4446]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"165:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@165:28","span":{"start":[165,28],"end":[165,96],"bytes":[4374,4442]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"165:48":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@165:48","span":{"start":[165,48],"end":[165,66],"bytes":[4394,4412]},"callee":null},"165:77":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@165:77","span":{"start":[165,77],"end":[165,95],"bytes":[4423,4441]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"70:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@70:12","span":{"start":[70,12],"end":[70,27],"bytes":[1766,1781]},"callee":"can://litestream/litestream/@external/os/Remove"},"70:44":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@70:44","span":{"start":[70,44],"end":[70,62],"bytes":[1798,1816]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"71:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@71:3","span":{"start":[71,3],"end":[71,64],"bytes":[1821,1882]},"callee":"can://litestream/litestream/@external/log/slog/Warn"},"74:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@74:13","span":{"start":[74,13],"end":[74,38],"bytes":[1899,1924]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"76:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@76:10","span":{"start":[76,10],"end":[76,46],"bytes":[1951,1987]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"78:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@78:8","span":{"start":[78,8],"end":[78,18],"bytes":[1998,2008]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close","is_deferred":true},"80:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@80:15","span":{"start":[80,15],"end":[80,72],"bytes":[2024,2081]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"80:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@80:23","span":{"start":[80,23],"end":[80,71],"bytes":[2032,2080]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"81:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@81:10","span":{"start":[81,10],"end":[81,46],"bytes":[2105,2141]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"84:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@84:15","span":{"start":[84,15],"end":[84,51],"bytes":[2160,2196]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"85:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@85:10","span":{"start":[85,10],"end":[85,49],"bytes":[2220,2259]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"88:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@88:15","span":{"start":[88,15],"end":[88,53],"bytes":[2278,2316]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"89:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@89:10","span":{"start":[89,10],"end":[89,48],"bytes":[2340,2378]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"93:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@93:16","span":{"start":[93,16],"end":[93,47],"bytes":[2435,2466]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"95:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase@95:16","span":{"start":[95,16],"end":[104,16],"bytes":[2483,2683]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","kind":"method","span":{"start":[171,1],"end":[221,2],"bytes":[4463,5667]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[171,1],"end":[171,113],"bytes":[4463,4575]}},{"name":"db","type":"*database/sql.DB","span":{"start":[171,1],"end":[171,113],"bytes":[4463,4575]}},{"name":"tableName","type":"string","span":{"start":[171,1],"end":[171,113],"bytes":[4463,4575]}},{"name":"rowCount","type":"int","span":{"start":[171,1],"end":[171,113],"bytes":[4463,4575]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"172:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@172:10","span":{"start":[172,10],"end":[172,33],"bytes":[4585,4608]},"callee":null},"175:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@175:14","span":{"start":[175,14],"end":[175,24],"bytes":[4669,4679]},"callee":"can://litestream/litestream/@external/database/sql/DB.Begin"},"177:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@177:11","span":{"start":[177,11],"end":[177,51],"bytes":[4708,4748]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"180:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@180:16","span":{"start":[180,16],"end":[183,17],"bytes":[4769,4908]},"callee":"can://litestream/litestream/@external/database/sql/Tx.Prepare"},"180:27":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@180:27","span":{"start":[180,27],"end":[183,16],"bytes":[4780,4907]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"185:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@185:4","span":{"start":[185,4],"end":[185,17],"bytes":[4930,4943]},"callee":"can://litestream/litestream/@external/database/sql/Tx.Rollback"},"186:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@186:11","span":{"start":[186,11],"end":[186,51],"bytes":[4954,4994]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"195:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@195:4","span":{"start":[195,4],"end":[195,25],"bytes":[5122,5143]},"callee":"can://litestream/litestream/@external/crypto/rand/Read"},"196:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@196:17","span":{"start":[196,17],"end":[196,47],"bytes":[5160,5190]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"197:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@197:16","span":{"start":[197,16],"end":[197,28],"bytes":[5206,5218]},"callee":"can://litestream/litestream/@external/math/rand/Int63"},"198:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@198:18","span":{"start":[198,18],"end":[198,32],"bytes":[5236,5250]},"callee":"can://litestream/litestream/@external/math/rand/Float64"},"199:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@199:17","span":{"start":[199,17],"end":[199,34],"bytes":[5274,5291]},"callee":"can://litestream/litestream/@external/time/Time.Unix"},"199:17/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@199:17/2","span":{"start":[199,17],"end":[199,27],"bytes":[5274,5284]},"callee":"can://litestream/litestream/@external/time/Now"},"201:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@201:17","span":{"start":[201,17],"end":[201,76],"bytes":[5309,5368]},"callee":"can://litestream/litestream/@external/database/sql/Stmt.Exec"},"202:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@202:5","span":{"start":[202,5],"end":[202,17],"bytes":[5387,5399]},"callee":"can://litestream/litestream/@external/database/sql/Stmt.Close"},"203:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@203:5","span":{"start":[203,5],"end":[203,18],"bytes":[5404,5417]},"callee":"can://litestream/litestream/@external/database/sql/Tx.Rollback"},"204:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@204:12","span":{"start":[204,12],"end":[204,45],"bytes":[5429,5462]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"208:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@208:3","span":{"start":[208,3],"end":[208,15],"bytes":[5475,5487]},"callee":"can://litestream/litestream/@external/database/sql/Stmt.Close"},"209:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@209:13","span":{"start":[209,13],"end":[209,24],"bytes":[5500,5511]},"callee":"can://litestream/litestream/@external/database/sql/Tx.Commit"},"210:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@210:11","span":{"start":[210,11],"end":[210,52],"bytes":[5536,5577]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"214:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@214:10","span":{"start":[214,10],"end":[214,20],"bytes":[5603,5613]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"215:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable@215:11","span":{"start":[215,11],"end":[215,20],"bytes":[5625,5634]},"callee":"can://litestream/litestream/@external/context/Context.Err"}}}},"fields":{"BatchSize":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/BatchSize","kind":"field","type":"int","span":{"start":[23,1],"end":[23,16],"bytes":[264,279]}},"DB":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/DB","kind":"field","type":"string","span":{"start":[20,1],"end":[20,19],"bytes":[210,228]}},"IndexRatio":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/IndexRatio","kind":"field","type":"float64","span":{"start":[25,1],"end":[25,20],"bytes":[296,315]}},"Main":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[18,1],"end":[18,12],"bytes":[197,208]}},"PageSize":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/PageSize","kind":"field","type":"int","span":{"start":[26,1],"end":[26,16],"bytes":[316,331]}},"RowSize":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/RowSize","kind":"field","type":"int","span":{"start":[22,1],"end":[22,16],"bytes":[248,263]}},"TableCount":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/TableCount","kind":"field","type":"int","span":{"start":[24,1],"end":[24,16],"bytes":[280,295]}},"TargetSize":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/TargetSize","kind":"field","type":"string","span":{"start":[21,1],"end":[21,19],"bytes":[229,247]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","kind":"function","span":{"start":[303,1],"end":[322,2],"bytes":[7435,7804]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","parameters":[{"name":"path","type":"string","span":{"start":[303,1],"end":[303,51],"bytes":[7435,7485]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"304:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize@304:15","span":{"start":[304,15],"end":[304,28],"bytes":[7500,7513]},"callee":"can://litestream/litestream/@external/os/Stat"},"309:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize@309:10","span":{"start":[309,10],"end":[309,21],"bytes":[7560,7571]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"312:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize@312:21","span":{"start":[312,21],"end":[312,37],"bytes":[7619,7635]},"callee":"can://litestream/litestream/@external/os/Stat"},"313:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize@313:11","span":{"start":[313,11],"end":[313,25],"bytes":[7660,7674]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"317:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize@317:21","span":{"start":[317,21],"end":[317,37],"bytes":[7725,7741]},"callee":"can://litestream/litestream/@external/os/Stat"},"318:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize@318:11","span":{"start":[318,11],"end":[318,25],"bytes":[7766,7780]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.parseSize":{"id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize","kind":"function","span":{"start":[273,1],"end":[301,2],"bytes":[6712,7433]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.parseSize","parameters":[{"name":"s","type":"string","span":{"start":[273,1],"end":[273,42],"bytes":[6712,6753]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"287:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@287:15","span":{"start":[287,15],"end":[287,29],"bytes":[7075,7089]},"callee":null},"287:35":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@287:35","span":{"start":[287,35],"end":[287,41],"bytes":[7095,7101]},"callee":null},"287:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@287:42","span":{"start":[287,42],"end":[287,56],"bytes":[7102,7116]},"callee":null},"287:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@287:6","span":{"start":[287,6],"end":[287,12],"bytes":[7066,7072]},"callee":null},"289:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@289:17","span":{"start":[289,17],"end":[289,68],"bytes":[7171,7222]},"callee":"can://litestream/litestream/@external/fmt/Sscanf"},"289:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@289:31","span":{"start":[289,31],"end":[289,37],"bytes":[7185,7191]},"callee":null},"289:38":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@289:38","span":{"start":[289,38],"end":[289,52],"bytes":[7192,7206]},"callee":null},"292:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@292:11","span":{"start":[292,11],"end":[292,48],"bytes":[7270,7307]},"callee":null},"292:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@292:25","span":{"start":[292,25],"end":[292,47],"bytes":[7284,7306]},"callee":null},"297:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize@297:15","span":{"start":[297,15],"end":[297,42],"bytes":[7352,7379]},"callee":"can://litestream/litestream/@external/fmt/Sscanf"}}}},"content_hash":"a67a7b7cc269d80370f2853a6dbd9a7b82d5fe893644ccea6a7b990ab833b797"},"cmd/litestream-test/shrink.go":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go","kind":"module","span":{"start":[1,1],"end":[331,1],"bytes":[0,7667]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"time\"\n\n\t_ \"github.com/mattn/go-sqlite3\"\n)\n\ntype ShrinkCommand struct {\n\tMain *Main\n\n\tDB string\n\tDeletePercentage float64\n\tVacuum bool\n\tCheckpoint bool\n\tCheckpointMode string\n}\n\nfunc (c *ShrinkCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test shrink\", flag.ExitOnError)\n\tfs.StringVar(\u0026c.DB, \"db\", \"\", \"Database path (required)\")\n\tfs.Float64Var(\u0026c.DeletePercentage, \"delete-percentage\", 50, \"Percentage of data to delete (0-100)\")\n\tfs.BoolVar(\u0026c.Vacuum, \"vacuum\", false, \"Run VACUUM after deletion\")\n\tfs.BoolVar(\u0026c.Checkpoint, \"checkpoint\", false, \"Run checkpoint after deletion\")\n\tfs.StringVar(\u0026c.CheckpointMode, \"checkpoint-mode\", \"PASSIVE\", \"Checkpoint mode (PASSIVE, FULL, RESTART, TRUNCATE)\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif c.DB == \"\" {\n\t\treturn fmt.Errorf(\"database path required\")\n\t}\n\n\tif c.DeletePercentage \u003c 0 || c.DeletePercentage \u003e 100 {\n\t\treturn fmt.Errorf(\"delete percentage must be between 0 and 100\")\n\t}\n\n\tif _, err := os.Stat(c.DB); err != nil {\n\t\treturn fmt.Errorf(\"database does not exist: %w\", err)\n\t}\n\n\tslog.Info(\"Starting database shrink operation\",\n\t\t\"db\", c.DB,\n\t\t\"delete_percentage\", c.DeletePercentage,\n\t\t\"vacuum\", c.Vacuum,\n\t\t\"checkpoint\", c.Checkpoint,\n\t)\n\n\treturn c.shrinkDatabase(ctx)\n}\n\nfunc (c *ShrinkCommand) shrinkDatabase(ctx context.Context) error {\n\tinitialSize, err := getDatabaseSize(c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get initial size: %w\", err)\n\t}\n\n\tslog.Info(\"Initial database size\",\n\t\t\"size_mb\", initialSize/1024/1024,\n\t)\n\n\tdb, err := sql.Open(\"sqlite3\", c.DB+\"?_journal_mode=WAL\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database: %w\", err)\n\t}\n\tdefer db.Close()\n\n\ttables, err := c.getTableList(db)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get table list: %w\", err)\n\t}\n\n\tslog.Info(\"Found tables\", \"count\", len(tables))\n\n\ttotalDeleted := int64(0)\n\tfor _, table := range tables {\n\t\tdeleted, err := c.deleteFromTable(db, table)\n\t\tif err != nil {\n\t\t\tslog.Error(\"Failed to delete from table\", \"table\", table, \"error\", err)\n\t\t\tcontinue\n\t\t}\n\t\ttotalDeleted += deleted\n\t\tslog.Info(\"Deleted rows from table\",\n\t\t\t\"table\", table,\n\t\t\t\"rows_deleted\", deleted,\n\t\t)\n\t}\n\n\tslog.Info(\"Deletion complete\", \"total_rows_deleted\", totalDeleted)\n\n\tsizeAfterDelete, err := getDatabaseSize(c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get size after delete: %w\", err)\n\t}\n\n\tslog.Info(\"Size after deletion\",\n\t\t\"size_mb\", sizeAfterDelete/1024/1024,\n\t\t\"change_mb\", (initialSize-sizeAfterDelete)/1024/1024,\n\t)\n\n\tif c.Checkpoint {\n\t\tif err := c.runCheckpoint(db); err != nil {\n\t\t\treturn fmt.Errorf(\"checkpoint: %w\", err)\n\t\t}\n\n\t\tsizeAfterCheckpoint, _ := getDatabaseSize(c.DB)\n\t\tslog.Info(\"Size after checkpoint\",\n\t\t\t\"size_mb\", sizeAfterCheckpoint/1024/1024,\n\t\t\t\"change_from_delete_mb\", (sizeAfterDelete-sizeAfterCheckpoint)/1024/1024,\n\t\t)\n\t}\n\n\tif c.Vacuum {\n\t\tif err := c.runVacuum(db); err != nil {\n\t\t\treturn fmt.Errorf(\"vacuum: %w\", err)\n\t\t}\n\n\t\tsizeAfterVacuum, _ := getDatabaseSize(c.DB)\n\t\tslog.Info(\"Size after VACUUM\",\n\t\t\t\"size_mb\", sizeAfterVacuum/1024/1024,\n\t\t\t\"total_reduction_mb\", (initialSize-sizeAfterVacuum)/1024/1024,\n\t\t)\n\t}\n\n\tfinalSize, err := getDatabaseSize(c.DB)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get final size: %w\", err)\n\t}\n\n\treductionPercent := float64(initialSize-finalSize) / float64(initialSize) * 100\n\tslog.Info(\"Shrink operation complete\",\n\t\t\"initial_size_mb\", initialSize/1024/1024,\n\t\t\"final_size_mb\", finalSize/1024/1024,\n\t\t\"reduction_percent\", fmt.Sprintf(\"%.1f\", reductionPercent),\n\t)\n\n\treturn nil\n}\n\nfunc (c *ShrinkCommand) getTableList(db *sql.DB) ([]string, error) {\n\trows, err := db.Query(`\n\t\tSELECT name FROM sqlite_master\n\t\tWHERE type='table'\n\t\tAND name NOT LIKE 'sqlite_%'\n\t\tAND name NOT LIKE 'load_test'\n\t`)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\n\tvar tables []string\n\tfor rows.Next() {\n\t\tvar table string\n\t\tif err := rows.Scan(\u0026table); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttables = append(tables, table)\n\t}\n\n\treturn tables, nil\n}\n\nfunc (c *ShrinkCommand) deleteFromTable(db *sql.DB, table string) (int64, error) {\n\tvar totalRows int\n\tcountQuery := fmt.Sprintf(\"SELECT COUNT(*) FROM %s\", table)\n\tif err := db.QueryRow(countQuery).Scan(\u0026totalRows); err != nil {\n\t\treturn 0, fmt.Errorf(\"count rows: %w\", err)\n\t}\n\n\tif totalRows == 0 {\n\t\treturn 0, nil\n\t}\n\n\trowsToDelete := int(float64(totalRows) * (c.DeletePercentage / 100))\n\tif rowsToDelete == 0 {\n\t\treturn 0, nil\n\t}\n\n\tvar hasID bool\n\tcolumnQuery := fmt.Sprintf(\"PRAGMA table_info(%s)\", table)\n\trows, err := db.Query(columnQuery)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"get table info: %w\", err)\n\t}\n\tdefer rows.Close()\n\n\tfor rows.Next() {\n\t\tvar cid int\n\t\tvar name, dtype string\n\t\tvar notnull, pk int\n\t\tvar dflt sql.NullString\n\t\tif err := rows.Scan(\u0026cid, \u0026name, \u0026dtype, \u0026notnull, \u0026dflt, \u0026pk); err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif name == \"id\" || pk == 1 {\n\t\t\thasID = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tvar deleteQuery string\n\tif hasID {\n\t\tdeleteQuery = fmt.Sprintf(`\n\t\t\tDELETE FROM %s\n\t\t\tWHERE id IN (\n\t\t\t\tSELECT id FROM %s\n\t\t\t\tORDER BY RANDOM()\n\t\t\t\tLIMIT %d\n\t\t\t)\n\t\t`, table, table, rowsToDelete)\n\t} else {\n\t\tdeleteQuery = fmt.Sprintf(`\n\t\t\tDELETE FROM %s\n\t\t\tWHERE rowid IN (\n\t\t\t\tSELECT rowid FROM %s\n\t\t\t\tORDER BY RANDOM()\n\t\t\t\tLIMIT %d\n\t\t\t)\n\t\t`, table, table, rowsToDelete)\n\t}\n\n\tstartTime := time.Now()\n\tresult, err := db.Exec(deleteQuery)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"delete rows: %w\", err)\n\t}\n\n\trowsDeleted, _ := result.RowsAffected()\n\tduration := time.Since(startTime)\n\n\tslog.Debug(\"Deleted rows from table\",\n\t\t\"table\", table,\n\t\t\"rows_deleted\", rowsDeleted,\n\t\t\"duration\", duration,\n\t)\n\n\treturn rowsDeleted, nil\n}\n\nfunc (c *ShrinkCommand) runCheckpoint(db *sql.DB) error {\n\tslog.Info(\"Running checkpoint\", \"mode\", c.CheckpointMode)\n\n\tstartTime := time.Now()\n\tquery := fmt.Sprintf(\"PRAGMA wal_checkpoint(%s)\", c.CheckpointMode)\n\n\tvar busy, written, total int\n\terr := db.QueryRow(query).Scan(\u0026busy, \u0026written, \u0026total)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"checkpoint failed: %w\", err)\n\t}\n\n\tduration := time.Since(startTime)\n\tslog.Info(\"Checkpoint complete\",\n\t\t\"mode\", c.CheckpointMode,\n\t\t\"busy\", busy,\n\t\t\"pages_written\", written,\n\t\t\"total_pages\", total,\n\t\t\"duration\", duration,\n\t)\n\n\treturn nil\n}\n\nfunc (c *ShrinkCommand) runVacuum(db *sql.DB) error {\n\tslog.Info(\"Running VACUUM (this may take a while)\")\n\n\tstartTime := time.Now()\n\t_, err := db.Exec(\"VACUUM\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"vacuum failed: %w\", err)\n\t}\n\n\tduration := time.Since(startTime)\n\tslog.Info(\"VACUUM complete\", \"duration\", duration)\n\n\treturn nil\n}\n\nfunc (c *ShrinkCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nShrink a database by deleting data and optionally running VACUUM.\n\nUsage:\n\n\tlitestream-test shrink [options]\n\nOptions:\n\n\t-db PATH\n\t Database path (required)\n\n\t-delete-percentage PCT\n\t Percentage of data to delete (0-100)\n\t Default: 50\n\n\t-vacuum\n\t Run VACUUM after deletion\n\t Default: false\n\n\t-checkpoint\n\t Run checkpoint after deletion\n\t Default: false\n\n\t-checkpoint-mode MODE\n\t Checkpoint mode (PASSIVE, FULL, RESTART, TRUNCATE)\n\t Default: PASSIVE\n\nExamples:\n\n\t# Delete 50% of data\n\tlitestream-test shrink -db /tmp/test.db -delete-percentage 50\n\n\t# Delete 75% and run VACUUM\n\tlitestream-test shrink -db /tmp/test.db -delete-percentage 75 -vacuum\n\n\t# Delete 30%, checkpoint, then VACUUM\n\tlitestream-test shrink -db /tmp/test.db -delete-percentage 30 -checkpoint -vacuum\n\n\t# Test with FULL checkpoint mode\n\tlitestream-test shrink -db /tmp/test.db -delete-percentage 50 -checkpoint -checkpoint-mode FULL\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"sql","path":"database/sql","span":{"start":[5,1],"end":[5,16],"bytes":[34,49]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[50,57]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[58,64]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[65,76]}},{"name":"os","path":"os","span":{"start":[9,1],"end":[9,6],"bytes":[77,82]}},{"name":"time","path":"time","span":{"start":[10,1],"end":[10,8],"bytes":[83,90]}},{"name":"go-sqlite3","path":"github.com/mattn/go-sqlite3","alias":"_","span":{"start":[12,1],"end":[12,33],"bytes":[92,124]}}],"types":{"ShrinkCommand":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand","kind":"struct","span":{"start":[15,1],"end":[23,2],"bytes":[128,292]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","kind":"method","span":{"start":[25,1],"end":[57,2],"bytes":[294,1427]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[25,1],"end":[25,72],"bytes":[294,365]}},{"name":"args","type":"[]string","span":{"start":[25,1],"end":[25,72],"bytes":[294,365]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"26:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@26:8","span":{"start":[26,8],"end":[26,67],"bytes":[373,432]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"27:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@27:2","span":{"start":[27,2],"end":[27,59],"bytes":[434,491]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"28:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@28:2","span":{"start":[28,2],"end":[28,101],"bytes":[493,592]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Float64Var"},"29:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@29:2","span":{"start":[29,2],"end":[29,69],"bytes":[594,661]},"callee":"can://litestream/litestream/@external/flag/FlagSet.BoolVar"},"30:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@30:2","span":{"start":[30,2],"end":[30,81],"bytes":[663,742]},"callee":"can://litestream/litestream/@external/flag/FlagSet.BoolVar"},"31:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@31:2","span":{"start":[31,2],"end":[31,117],"bytes":[744,859]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"33:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@33:12","span":{"start":[33,12],"end":[33,26],"bytes":[891,905]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"38:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@38:10","span":{"start":[38,10],"end":[38,46],"bytes":[963,999]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"42:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@42:10","span":{"start":[42,10],"end":[42,67],"bytes":[1070,1127]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"45:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@45:15","span":{"start":[45,15],"end":[45,28],"bytes":[1146,1159]},"callee":"can://litestream/litestream/@external/os/Stat"},"46:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@46:10","span":{"start":[46,10],"end":[46,56],"bytes":[1183,1229]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"49:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@49:2","span":{"start":[49,2],"end":[54,3],"bytes":[1235,1394]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"56:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run@56:9","span":{"start":[56,9],"end":[56,30],"bytes":[1404,1425]},"callee":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Usage","kind":"method","span":{"start":[287,1],"end":[330,2],"bytes":[6664,7666]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"288:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Usage@288:2","span":{"start":[288,2],"end":[329,7],"bytes":[6699,7664]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","kind":"method","span":{"start":[171,1],"end":[246,2],"bytes":[4124,5751]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[171,1],"end":[171,83],"bytes":[4124,4206]}},{"name":"table","type":"string","span":{"start":[171,1],"end":[171,83],"bytes":[4124,4206]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"173:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@173:16","span":{"start":[173,16],"end":[173,61],"bytes":[4241,4286]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"174:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@174:12","span":{"start":[174,12],"end":[174,52],"bytes":[4298,4338]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"174:12/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@174:12/2","span":{"start":[174,12],"end":[174,35],"bytes":[4298,4321]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRow"},"175:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@175:13","span":{"start":[175,13],"end":[175,46],"bytes":[4365,4398]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"182:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@182:18","span":{"start":[182,18],"end":[182,70],"bytes":[4461,4513]},"callee":null},"182:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@182:22","span":{"start":[182,22],"end":[182,40],"bytes":[4465,4483]},"callee":null},"188:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@188:17","span":{"start":[188,17],"end":[188,60],"bytes":[4590,4633]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"189:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@189:15","span":{"start":[189,15],"end":[189,36],"bytes":[4648,4669]},"callee":"can://litestream/litestream/@external/database/sql/DB.Query"},"191:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@191:13","span":{"start":[191,13],"end":[191,50],"bytes":[4699,4736]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"193:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@193:8","span":{"start":[193,8],"end":[193,20],"bytes":[4747,4759]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Close","is_deferred":true},"195:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@195:6","span":{"start":[195,6],"end":[195,17],"bytes":[4766,4777]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Next"},"200:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@200:13","span":{"start":[200,13],"end":[200,65],"bytes":[4879,4931]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Scan"},"211:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@211:17","span":{"start":[211,17],"end":[218,33],"bytes":[5078,5221]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"220:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@220:17","span":{"start":[220,17],"end":[227,33],"bytes":[5248,5397]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"230:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@230:15","span":{"start":[230,15],"end":[230,25],"bytes":[5416,5426]},"callee":"can://litestream/litestream/@external/time/Now"},"231:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@231:17","span":{"start":[231,17],"end":[231,37],"bytes":[5443,5463]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"233:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@233:13","span":{"start":[233,13],"end":[233,47],"bytes":[5493,5527]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"236:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@236:20","span":{"start":[236,20],"end":[236,41],"bytes":[5551,5572]},"callee":"can://litestream/litestream/@external/database/sql/Result.RowsAffected"},"237:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@237:14","span":{"start":[237,14],"end":[237,35],"bytes":[5586,5607]},"callee":"can://litestream/litestream/@external/time/Since"},"239:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable@239:2","span":{"start":[239,2],"end":[243,3],"bytes":[5610,5723]},"callee":"can://litestream/litestream/@external/log/slog/Debug"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","kind":"method","span":{"start":[147,1],"end":[169,2],"bytes":[3664,4122]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[147,1],"end":[147,69],"bytes":[3664,3732]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"148:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList@148:15","span":{"start":[148,15],"end":[153,4],"bytes":[3747,3878]},"callee":"can://litestream/litestream/@external/database/sql/DB.Query"},"157:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList@157:8","span":{"start":[157,8],"end":[157,20],"bytes":[3924,3936]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Close","is_deferred":true},"160:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList@160:6","span":{"start":[160,6],"end":[160,17],"bytes":[3964,3975]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Next"},"162:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList@162:13","span":{"start":[162,13],"end":[162,30],"bytes":[4009,4026]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Scan"},"165:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList@165:12","span":{"start":[165,12],"end":[165,33],"bytes":[4075,4096]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","kind":"method","span":{"start":[248,1],"end":[270,2],"bytes":[5753,6330]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[248,1],"end":[248,58],"bytes":[5753,5810]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"249:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint@249:2","span":{"start":[249,2],"end":[249,59],"bytes":[5812,5869]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"251:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint@251:15","span":{"start":[251,15],"end":[251,25],"bytes":[5885,5895]},"callee":"can://litestream/litestream/@external/time/Now"},"252:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint@252:11","span":{"start":[252,11],"end":[252,69],"bytes":[5906,5964]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"255:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint@255:9","span":{"start":[255,9],"end":[255,57],"bytes":[6004,6052]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"255:9/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint@255:9/2","span":{"start":[255,9],"end":[255,27],"bytes":[6004,6022]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRow"},"257:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint@257:10","span":{"start":[257,10],"end":[257,50],"bytes":[6079,6119]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"260:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint@260:14","span":{"start":[260,14],"end":[260,35],"bytes":[6137,6158]},"callee":"can://litestream/litestream/@external/time/Since"},"261:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint@261:2","span":{"start":[261,2],"end":[267,3],"bytes":[6160,6315]},"callee":"can://litestream/litestream/@external/log/slog/Info"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","kind":"method","span":{"start":[272,1],"end":[285,2],"bytes":[6332,6662]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[272,1],"end":[272,54],"bytes":[6332,6385]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"273:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum@273:2","span":{"start":[273,2],"end":[273,53],"bytes":[6387,6438]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"275:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum@275:15","span":{"start":[275,15],"end":[275,25],"bytes":[6454,6464]},"callee":"can://litestream/litestream/@external/time/Now"},"276:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum@276:12","span":{"start":[276,12],"end":[276,29],"bytes":[6476,6493]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"},"278:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum@278:10","span":{"start":[278,10],"end":[278,46],"bytes":[6520,6556]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"281:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum@281:14","span":{"start":[281,14],"end":[281,35],"bytes":[6574,6595]},"callee":"can://litestream/litestream/@external/time/Since"},"282:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum@282:2","span":{"start":[282,2],"end":[282,52],"bytes":[6597,6647]},"callee":"can://litestream/litestream/@external/log/slog/Info"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","kind":"method","span":{"start":[59,1],"end":[145,2],"bytes":[1429,3662]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[59,1],"end":[59,68],"bytes":[1429,1496]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"100:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@100:10","span":{"start":[100,10],"end":[100,54],"bytes":[2459,2503]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"103:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@103:2","span":{"start":[103,2],"end":[106,3],"bytes":[2509,2640]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"109:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@109:13","span":{"start":[109,13],"end":[109,32],"bytes":[2673,2692]},"callee":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint"},"110:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@110:11","span":{"start":[110,11],"end":[110,44],"bytes":[2717,2750]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"113:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@113:29","span":{"start":[113,29],"end":[113,50],"bytes":[2784,2805]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"114:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@114:3","span":{"start":[114,3],"end":[117,4],"bytes":[2808,2968]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"121:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@121:13","span":{"start":[121,13],"end":[121,28],"bytes":[3000,3015]},"callee":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum"},"122:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@122:11","span":{"start":[122,11],"end":[122,40],"bytes":[3040,3069]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"125:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@125:25","span":{"start":[125,25],"end":[125,46],"bytes":[3099,3120]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"126:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@126:3","span":{"start":[126,3],"end":[129,4],"bytes":[3123,3264]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"132:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@132:20","span":{"start":[132,20],"end":[132,41],"bytes":[3288,3309]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"134:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@134:10","span":{"start":[134,10],"end":[134,47],"bytes":[3336,3373]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"137:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@137:22","span":{"start":[137,22],"end":[137,52],"bytes":[3399,3429]},"callee":null},"137:55":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@137:55","span":{"start":[137,55],"end":[137,75],"bytes":[3432,3452]},"callee":null},"138:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@138:2","span":{"start":[138,2],"end":[142,3],"bytes":[3460,3647]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"141:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@141:24","span":{"start":[141,24],"end":[141,61],"bytes":[3606,3643]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"60:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@60:22","span":{"start":[60,22],"end":[60,43],"bytes":[1518,1539]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"},"62:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@62:10","span":{"start":[62,10],"end":[62,49],"bytes":[1566,1605]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"65:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@65:2","span":{"start":[65,2],"end":[67,3],"bytes":[1611,1684]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"69:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@69:13","span":{"start":[69,13],"end":[69,59],"bytes":[1698,1744]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"71:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@71:10","span":{"start":[71,10],"end":[71,46],"bytes":[1771,1807]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"73:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@73:8","span":{"start":[73,8],"end":[73,18],"bytes":[1818,1828]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close","is_deferred":true},"75:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@75:17","span":{"start":[75,17],"end":[75,35],"bytes":[1846,1864]},"callee":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList"},"77:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@77:10","span":{"start":[77,10],"end":[77,47],"bytes":[1891,1928]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"80:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@80:2","span":{"start":[80,2],"end":[80,49],"bytes":[1934,1981]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"80:37":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@80:37","span":{"start":[80,37],"end":[80,48],"bytes":[1969,1980]},"callee":null},"82:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@82:18","span":{"start":[82,18],"end":[82,26],"bytes":[2000,2008]},"callee":null},"84:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@84:19","span":{"start":[84,19],"end":[84,47],"bytes":[2059,2087]},"callee":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable"},"86:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@86:4","span":{"start":[86,4],"end":[86,75],"bytes":[2109,2180]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"90:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@90:3","span":{"start":[90,3],"end":[93,4],"bytes":[2225,2312]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"96:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@96:2","span":{"start":[96,2],"end":[96,68],"bytes":[2318,2384]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"98:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase@98:26","span":{"start":[98,26],"end":[98,47],"bytes":[2411,2432]},"callee":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize"}}}},"fields":{"Checkpoint":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/Checkpoint","kind":"field","type":"bool","span":{"start":[21,1],"end":[21,23],"bytes":[243,265]}},"CheckpointMode":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/CheckpointMode","kind":"field","type":"string","span":{"start":[22,1],"end":[22,25],"bytes":[266,290]}},"DB":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/DB","kind":"field","type":"string","span":{"start":[18,1],"end":[18,25],"bytes":[169,193]}},"DeletePercentage":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/DeletePercentage","kind":"field","type":"float64","span":{"start":[19,1],"end":[19,26],"bytes":[194,219]}},"Main":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[16,1],"end":[16,12],"bytes":[156,167]}},"Vacuum":{"id":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/Vacuum","kind":"field","type":"bool","span":{"start":[20,1],"end":[20,23],"bytes":[220,242]}}}}},"functions":{},"content_hash":"37c5b10667dd19c81741e8154bf9a8dac5dd898270b7f5c126d1375a33fb1b10"},"cmd/litestream-test/validate.go":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go","kind":"module","span":{"start":[1,1],"end":[505,1],"bytes":[0,12576]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"crypto/md5\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"time\"\n\n\t_ \"github.com/mattn/go-sqlite3\"\n)\n\ntype ValidateCommand struct {\n\tMain *Main\n\n\tSourceDB string\n\tReplicaURL string\n\tRestoredDB string\n\tCheckType string\n\tLTXContinuity bool\n\tConfigPath string\n}\n\ntype ValidationResult struct {\n\tCheckType string\n\tPassed bool\n\tDuration time.Duration\n\tErrorMessage string\n\tDetails map[string]interface{}\n}\n\nfunc (c *ValidateCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-test validate\", flag.ExitOnError)\n\tfs.StringVar(\u0026c.SourceDB, \"source-db\", \"\", \"Original database path\")\n\tfs.StringVar(\u0026c.ReplicaURL, \"replica-url\", \"\", \"Replica URL to validate\")\n\tfs.StringVar(\u0026c.RestoredDB, \"restored-db\", \"\", \"Path for restored database\")\n\tfs.StringVar(\u0026c.CheckType, \"check-type\", \"quick\", \"Type of check (quick, integrity, checksum, full)\")\n\tfs.BoolVar(\u0026c.LTXContinuity, \"ltx-continuity\", false, \"Check LTX file continuity\")\n\tfs.StringVar(\u0026c.ConfigPath, \"config\", \"\", \"Litestream config file path\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif c.SourceDB == \"\" {\n\t\treturn fmt.Errorf(\"source database path required\")\n\t}\n\n\tif c.ReplicaURL == \"\" \u0026\u0026 c.ConfigPath == \"\" {\n\t\treturn fmt.Errorf(\"replica URL or config file required\")\n\t}\n\n\tif c.RestoredDB == \"\" {\n\t\tc.RestoredDB = c.SourceDB + \".restored\"\n\t}\n\n\tslog.Info(\"Starting validation\",\n\t\t\"source_db\", c.SourceDB,\n\t\t\"replica_url\", c.ReplicaURL,\n\t\t\"check_type\", c.CheckType,\n\t\t\"ltx_continuity\", c.LTXContinuity,\n\t)\n\n\tresults := []ValidationResult{}\n\n\tif c.LTXContinuity \u0026\u0026 c.ReplicaURL != \"\" {\n\t\tresult := c.validateLTXContinuity(ctx)\n\t\tresults = append(results, result)\n\t}\n\n\trestoreResult := c.performRestore(ctx)\n\tresults = append(results, restoreResult)\n\n\tif restoreResult.Passed {\n\t\tswitch c.CheckType {\n\t\tcase \"quick\":\n\t\t\tresults = append(results, c.performQuickCheck(ctx))\n\t\tcase \"integrity\":\n\t\t\tresults = append(results, c.performIntegrityCheck(ctx))\n\t\tcase \"checksum\":\n\t\t\tresults = append(results, c.performChecksumCheck(ctx))\n\t\tcase \"full\":\n\t\t\tresults = append(results, c.performQuickCheck(ctx))\n\t\t\tresults = append(results, c.performIntegrityCheck(ctx))\n\t\t\tresults = append(results, c.performChecksumCheck(ctx))\n\t\t\tresults = append(results, c.performDataValidation(ctx))\n\t\t}\n\t}\n\n\treturn c.reportResults(results)\n}\n\nfunc (c *ValidateCommand) performRestore(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"restore\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tif err := os.Remove(c.RestoredDB); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\tslog.Warn(\"Could not remove existing restored database\", \"error\", err)\n\t}\n\n\tvar cmd *exec.Cmd\n\tif c.ConfigPath != \"\" {\n\t\tcmd = exec.CommandContext(ctx, \"litestream\", \"restore\",\n\t\t\t\"-config\", c.ConfigPath,\n\t\t\t\"-o\", c.RestoredDB,\n\t\t\tc.SourceDB,\n\t\t)\n\t} else {\n\t\tcmd = exec.CommandContext(ctx, \"litestream\", \"restore\",\n\t\t\t\"-o\", c.RestoredDB,\n\t\t\tc.ReplicaURL,\n\t\t)\n\t}\n\n\toutput, err := cmd.CombinedOutput()\n\tresult.Duration = time.Since(startTime)\n\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"restore failed: %v\\nOutput: %s\", err, string(output))\n\t\treturn result\n\t}\n\n\tif _, err := os.Stat(c.RestoredDB); err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"restored database not found: %v\", err)\n\t\treturn result\n\t}\n\n\tresult.Passed = true\n\tresult.Details[\"restored_path\"] = c.RestoredDB\n\n\tif info, err := os.Stat(c.RestoredDB); err == nil {\n\t\tresult.Details[\"restored_size\"] = info.Size()\n\t}\n\n\tslog.Info(\"Restore completed\",\n\t\t\"duration\", result.Duration,\n\t\t\"restored_db\", c.RestoredDB,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) performQuickCheck(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"quick_check\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tdb, err := sql.Open(\"sqlite3\", c.RestoredDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to open database: %v\", err)\n\t\treturn result\n\t}\n\tdefer db.Close()\n\n\tvar checkResult string\n\terr = db.QueryRow(\"PRAGMA quick_check\").Scan(\u0026checkResult)\n\tresult.Duration = time.Since(startTime)\n\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"quick check failed: %v\", err)\n\t\treturn result\n\t}\n\n\tresult.Passed = checkResult == \"ok\"\n\tresult.Details[\"check_result\"] = checkResult\n\n\tif !result.Passed {\n\t\tresult.ErrorMessage = fmt.Sprintf(\"quick check returned: %s\", checkResult)\n\t}\n\n\tslog.Info(\"Quick check completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) performIntegrityCheck(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"integrity_check\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tdb, err := sql.Open(\"sqlite3\", c.RestoredDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to open database: %v\", err)\n\t\treturn result\n\t}\n\tdefer db.Close()\n\n\trows, err := db.Query(\"PRAGMA integrity_check\")\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"integrity check failed: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\tdefer rows.Close()\n\n\tvar results []string\n\tfor rows.Next() {\n\t\tvar line string\n\t\tif err := rows.Scan(\u0026line); err != nil {\n\t\t\tresult.Passed = false\n\t\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to scan result: %v\", err)\n\t\t\tresult.Duration = time.Since(startTime)\n\t\t\treturn result\n\t\t}\n\t\tresults = append(results, line)\n\t}\n\n\tresult.Duration = time.Since(startTime)\n\tresult.Details[\"check_results\"] = results\n\n\tif len(results) == 1 \u0026\u0026 results[0] == \"ok\" {\n\t\tresult.Passed = true\n\t} else {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"integrity check found issues: %v\", results)\n\t}\n\n\tslog.Info(\"Integrity check completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t\t\"issues\", len(results)-1,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) performChecksumCheck(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"checksum\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tsourceChecksum, err := c.calculateDBChecksum(c.SourceDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to calculate source checksum: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\trestoredChecksum, err := c.calculateDBChecksum(c.RestoredDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to calculate restored checksum: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\tresult.Duration = time.Since(startTime)\n\tresult.Details[\"source_checksum\"] = fmt.Sprintf(\"%x\", sourceChecksum)\n\tresult.Details[\"restored_checksum\"] = fmt.Sprintf(\"%x\", restoredChecksum)\n\n\tif string(sourceChecksum) == string(restoredChecksum) {\n\t\tresult.Passed = true\n\t} else {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = \"checksums do not match\"\n\t}\n\n\tslog.Info(\"Checksum check completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t\t\"match\", result.Passed,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) performDataValidation(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"data_validation\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tsourceDB, err := sql.Open(\"sqlite3\", c.SourceDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to open source database: %v\", err)\n\t\treturn result\n\t}\n\tdefer sourceDB.Close()\n\n\trestoredDB, err := sql.Open(\"sqlite3\", c.RestoredDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to open restored database: %v\", err)\n\t\treturn result\n\t}\n\tdefer restoredDB.Close()\n\n\ttables, err := c.getTableList(sourceDB)\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to get table list: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\tresult.Details[\"tables_checked\"] = len(tables)\n\tallMatch := true\n\n\tfor _, table := range tables {\n\t\tsourceCount, err := c.getRowCount(sourceDB, table)\n\t\tif err != nil {\n\t\t\tresult.Passed = false\n\t\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to count rows in source table %s: %v\", table, err)\n\t\t\tresult.Duration = time.Since(startTime)\n\t\t\treturn result\n\t\t}\n\n\t\trestoredCount, err := c.getRowCount(restoredDB, table)\n\t\tif err != nil {\n\t\t\tresult.Passed = false\n\t\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to count rows in restored table %s: %v\", table, err)\n\t\t\tresult.Duration = time.Since(startTime)\n\t\t\treturn result\n\t\t}\n\n\t\tif sourceCount != restoredCount {\n\t\t\tallMatch = false\n\t\t\tresult.Details[fmt.Sprintf(\"table_%s_mismatch\", table)] = fmt.Sprintf(\"source=%d, restored=%d\", sourceCount, restoredCount)\n\t\t}\n\t}\n\n\tresult.Duration = time.Since(startTime)\n\tresult.Passed = allMatch\n\n\tif !allMatch {\n\t\tresult.ErrorMessage = \"row count mismatch between source and restored databases\"\n\t}\n\n\tslog.Info(\"Data validation completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t\t\"tables_checked\", len(tables),\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) validateLTXContinuity(ctx context.Context) ValidationResult {\n\tstartTime := time.Now()\n\tresult := ValidationResult{\n\t\tCheckType: \"ltx_continuity\",\n\t\tDetails: make(map[string]interface{}),\n\t}\n\n\tcmd := exec.CommandContext(ctx, \"litestream\", \"ltx\", c.ReplicaURL)\n\toutput, err := cmd.Output()\n\tif err != nil {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = fmt.Sprintf(\"failed to list LTX files: %v\", err)\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\tlines := strings.Split(string(output), \"\\n\")\n\tif len(lines) \u003c 2 {\n\t\tresult.Passed = false\n\t\tresult.ErrorMessage = \"no LTX files found\"\n\t\tresult.Duration = time.Since(startTime)\n\t\treturn result\n\t}\n\n\tresult.Passed = true\n\tresult.Duration = time.Since(startTime)\n\tresult.Details[\"ltx_files_checked\"] = len(lines) - 2\n\n\tslog.Info(\"LTX continuity check completed\",\n\t\t\"passed\", result.Passed,\n\t\t\"duration\", result.Duration,\n\t)\n\n\treturn result\n}\n\nfunc (c *ValidateCommand) calculateDBChecksum(path string) ([]byte, error) {\n\tfile, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer file.Close()\n\n\thash := md5.New()\n\tif _, err := io.Copy(hash, file); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn hash.Sum(nil), nil\n}\n\nfunc (c *ValidateCommand) getTableList(db *sql.DB) ([]string, error) {\n\trows, err := db.Query(\"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\n\tvar tables []string\n\tfor rows.Next() {\n\t\tvar table string\n\t\tif err := rows.Scan(\u0026table); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttables = append(tables, table)\n\t}\n\n\treturn tables, nil\n}\n\nfunc (c *ValidateCommand) getRowCount(db *sql.DB, table string) (int, error) {\n\tvar count int\n\tquery := fmt.Sprintf(\"SELECT COUNT(*) FROM %s\", table)\n\terr := db.QueryRow(query).Scan(\u0026count)\n\treturn count, err\n}\n\nfunc (c *ValidateCommand) reportResults(results []ValidationResult) error {\n\tallPassed := true\n\tfor _, result := range results {\n\t\tif !result.Passed {\n\t\t\tallPassed = false\n\t\t\tslog.Error(\"Validation failed\",\n\t\t\t\t\"check_type\", result.CheckType,\n\t\t\t\t\"error\", result.ErrorMessage,\n\t\t\t)\n\t\t}\n\t}\n\n\tif allPassed {\n\t\tslog.Info(\"All validation checks passed\")\n\t\treturn nil\n\t}\n\n\treturn fmt.Errorf(\"validation failed\")\n}\n\nfunc (c *ValidateCommand) Usage() {\n\tfmt.Fprintln(c.Main.Stdout, `\nValidate replication integrity by restoring and checking databases.\n\nUsage:\n\n\tlitestream-test validate [options]\n\nOptions:\n\n\t-source-db PATH\n\t Original database path (required)\n\n\t-replica-url URL\n\t Replica URL to validate\n\n\t-restored-db PATH\n\t Path for restored database\n\t Default: source-db.restored\n\n\t-check-type TYPE\n\t Type of check: quick, integrity, checksum, full\n\t Default: quick\n\n\t-ltx-continuity\n\t Check LTX file continuity\n\t Default: false\n\n\t-config PATH\n\t Litestream config file path\n\nExamples:\n\n\t# Quick validation\n\tlitestream-test validate -source-db /tmp/test.db -replica-url s3://bucket/test\n\n\t# Full validation with all checks\n\tlitestream-test validate -source-db /tmp/test.db -replica-url s3://bucket/test -check-type full\n\n\t# Validate with config file\n\tlitestream-test validate -source-db /tmp/test.db -config /etc/litestream.yml -check-type integrity\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"md5","path":"crypto/md5","span":{"start":[5,1],"end":[5,14],"bytes":[34,47]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[48,63]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[64,71]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[72,78]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[79,84]}},{"name":"slog","path":"log/slog","span":{"start":[10,1],"end":[10,12],"bytes":[85,96]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[97,102]}},{"name":"exec","path":"os/exec","span":{"start":[12,1],"end":[12,11],"bytes":[103,113]}},{"name":"strings","path":"strings","span":{"start":[13,1],"end":[13,11],"bytes":[114,124]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[125,132]}},{"name":"go-sqlite3","path":"github.com/mattn/go-sqlite3","alias":"_","span":{"start":[16,1],"end":[16,33],"bytes":[134,166]}}],"types":{"ValidateCommand":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand","kind":"struct","span":{"start":[19,1],"end":[28,2],"bytes":[170,344]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","kind":"method","span":{"start":[38,1],"end":[97,2],"bytes":[506,2440]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[38,1],"end":[38,74],"bytes":[506,579]}},{"name":"args","type":"[]string","span":{"start":[38,1],"end":[38,74],"bytes":[506,579]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"39:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@39:8","span":{"start":[39,8],"end":[39,69],"bytes":[587,648]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"40:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@40:2","span":{"start":[40,2],"end":[40,70],"bytes":[650,718]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"41:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@41:2","span":{"start":[41,2],"end":[41,75],"bytes":[720,793]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"42:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@42:2","span":{"start":[42,2],"end":[42,78],"bytes":[795,871]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"43:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@43:2","span":{"start":[43,2],"end":[43,103],"bytes":[873,974]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"44:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@44:2","span":{"start":[44,2],"end":[44,84],"bytes":[976,1058]},"callee":"can://litestream/litestream/@external/flag/FlagSet.BoolVar"},"45:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@45:2","span":{"start":[45,2],"end":[45,74],"bytes":[1060,1132]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"47:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@47:12","span":{"start":[47,12],"end":[47,26],"bytes":[1164,1178]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"52:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@52:10","span":{"start":[52,10],"end":[52,53],"bytes":[1242,1285]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"56:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@56:10","span":{"start":[56,10],"end":[56,59],"bytes":[1346,1395]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"63:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@63:2","span":{"start":[63,2],"end":[68,3],"bytes":[1472,1631]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"73:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@73:13","span":{"start":[73,13],"end":[73,41],"bytes":[1723,1751]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity"},"74:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@74:13","span":{"start":[74,13],"end":[74,36],"bytes":[1764,1787]},"callee":null},"77:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@77:19","span":{"start":[77,19],"end":[77,40],"bytes":[1810,1831]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore"},"78:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@78:12","span":{"start":[78,12],"end":[78,42],"bytes":[1843,1873]},"callee":null},"83:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@83:14","span":{"start":[83,14],"end":[83,55],"bytes":[1954,1995]},"callee":null},"83:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@83:30","span":{"start":[83,30],"end":[83,54],"bytes":[1970,1994]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck"},"85:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@85:14","span":{"start":[85,14],"end":[85,59],"bytes":[2029,2074]},"callee":null},"85:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@85:30","span":{"start":[85,30],"end":[85,58],"bytes":[2045,2073]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck"},"87:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@87:14","span":{"start":[87,14],"end":[87,58],"bytes":[2107,2151]},"callee":null},"87:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@87:30","span":{"start":[87,30],"end":[87,57],"bytes":[2123,2150]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck"},"89:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@89:14","span":{"start":[89,14],"end":[89,55],"bytes":[2180,2221]},"callee":null},"89:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@89:30","span":{"start":[89,30],"end":[89,54],"bytes":[2196,2220]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck"},"90:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@90:14","span":{"start":[90,14],"end":[90,59],"bytes":[2235,2280]},"callee":null},"90:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@90:30","span":{"start":[90,30],"end":[90,58],"bytes":[2251,2279]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck"},"91:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@91:14","span":{"start":[91,14],"end":[91,58],"bytes":[2294,2338]},"callee":null},"91:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@91:30","span":{"start":[91,30],"end":[91,57],"bytes":[2310,2337]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck"},"92:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@92:14","span":{"start":[92,14],"end":[92,59],"bytes":[2352,2397]},"callee":null},"92:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@92:30","span":{"start":[92,30],"end":[92,58],"bytes":[2368,2396]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation"},"96:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run@96:9","span":{"start":[96,9],"end":[96,33],"bytes":[2414,2438]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Usage","kind":"method","span":{"start":[462,1],"end":[504,2],"bytes":[11603,12575]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"463:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Usage@463:2","span":{"start":[463,2],"end":[503,7],"bytes":[11640,12573]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","kind":"method","span":{"start":[401,1],"end":[414,2],"bytes":[10277,10558]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","parameters":[{"name":"path","type":"string","span":{"start":[401,1],"end":[401,77],"bytes":[10277,10353]}}],"return_type":"([]byte, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"402:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum@402:15","span":{"start":[402,15],"end":[402,28],"bytes":[10368,10381]},"callee":"can://litestream/litestream/@external/os/Open"},"406:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum@406:8","span":{"start":[406,8],"end":[406,20],"bytes":[10427,10439]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"408:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum@408:10","span":{"start":[408,10],"end":[408,19],"bytes":[10450,10459]},"callee":"can://litestream/litestream/@external/crypto/md5/New"},"409:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum@409:15","span":{"start":[409,15],"end":[409,34],"bytes":[10474,10493]},"callee":"can://litestream/litestream/@external/io/Copy"},"413:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum@413:9","span":{"start":[413,9],"end":[413,22],"bytes":[10538,10551]},"callee":"can://litestream/litestream/@external/hash/Hash.Sum"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","kind":"method","span":{"start":[435,1],"end":[440,2],"bytes":[10981,11191]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[435,1],"end":[435,79],"bytes":[10981,11059]}},{"name":"table","type":"string","span":{"start":[435,1],"end":[435,79],"bytes":[10981,11059]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"437:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount@437:11","span":{"start":[437,11],"end":[437,56],"bytes":[11085,11130]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"438:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount@438:9","span":{"start":[438,9],"end":[438,40],"bytes":[11139,11170]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"438:9/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount@438:9/2","span":{"start":[438,9],"end":[438,27],"bytes":[11139,11157]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRow"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","kind":"method","span":{"start":[416,1],"end":[433,2],"bytes":[10560,10979]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","parameters":[{"name":"db","type":"*database/sql.DB","span":{"start":[416,1],"end":[416,71],"bytes":[10560,10630]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"417:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList@417:15","span":{"start":[417,15],"end":[417,105],"bytes":[10645,10735]},"callee":"can://litestream/litestream/@external/database/sql/DB.Query"},"421:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList@421:8","span":{"start":[421,8],"end":[421,20],"bytes":[10781,10793]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Close","is_deferred":true},"424:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList@424:6","span":{"start":[424,6],"end":[424,17],"bytes":[10821,10832]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Next"},"426:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList@426:13","span":{"start":[426,13],"end":[426,30],"bytes":[10866,10883]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Scan"},"429:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList@429:12","span":{"start":[429,12],"end":[429,33],"bytes":[10932,10953]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","kind":"method","span":{"start":[249,1],"end":[290,2],"bytes":[6126,7333]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[249,1],"end":[249,87],"bytes":[6126,6212]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":4},"body":{"250:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@250:15","span":{"start":[250,15],"end":[250,25],"bytes":[6227,6237]},"callee":"can://litestream/litestream/@external/time/Now"},"253:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@253:14","span":{"start":[253,14],"end":[253,42],"bytes":[6305,6333]},"callee":null},"256:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@256:25","span":{"start":[256,25],"end":[256,58],"bytes":[6363,6396]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum"},"259:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@259:25","span":{"start":[259,25],"end":[259,84],"bytes":[6462,6521]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"260:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@260:21","span":{"start":[260,21],"end":[260,42],"bytes":[6542,6563]},"callee":"can://litestream/litestream/@external/time/Since"},"264:27":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@264:27","span":{"start":[264,27],"end":[264,62],"bytes":[6610,6645]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum"},"267:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@267:25","span":{"start":[267,25],"end":[267,86],"bytes":[6711,6772]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"268:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@268:21","span":{"start":[268,21],"end":[268,42],"bytes":[6793,6814]},"callee":"can://litestream/litestream/@external/time/Since"},"272:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@272:20","span":{"start":[272,20],"end":[272,41],"bytes":[6854,6875]},"callee":"can://litestream/litestream/@external/time/Since"},"273:38":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@273:38","span":{"start":[273,38],"end":[273,71],"bytes":[6913,6946]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"274:40":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@274:40","span":{"start":[274,40],"end":[274,75],"bytes":[6986,7021]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"276:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@276:31","span":{"start":[276,31],"end":[276,55],"bytes":[7053,7077]},"callee":null},"276:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@276:5","span":{"start":[276,5],"end":[276,27],"bytes":[7027,7049]},"callee":null},"283:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck@283:2","span":{"start":[283,2],"end":[287,3],"bytes":[7191,7315]},"callee":"can://litestream/litestream/@external/log/slog/Info"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","kind":"method","span":{"start":[292,1],"end":[363,2],"bytes":[7335,9341]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[292,1],"end":[292,88],"bytes":[7335,7422]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":9},"body":{"293:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@293:15","span":{"start":[293,15],"end":[293,25],"bytes":[7437,7447]},"callee":"can://litestream/litestream/@external/time/Now"},"296:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@296:14","span":{"start":[296,14],"end":[296,42],"bytes":[7522,7550]},"callee":null},"299:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@299:19","span":{"start":[299,19],"end":[299,50],"bytes":[7574,7605]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"302:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@302:25","span":{"start":[302,25],"end":[302,79],"bytes":[7671,7725]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"305:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@305:8","span":{"start":[305,8],"end":[305,24],"bytes":[7752,7768]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close","is_deferred":true},"307:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@307:21","span":{"start":[307,21],"end":[307,54],"bytes":[7790,7823]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"310:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@310:25","span":{"start":[310,25],"end":[310,81],"bytes":[7889,7945]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"313:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@313:8","span":{"start":[313,8],"end":[313,26],"bytes":[7972,7990]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close","is_deferred":true},"315:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@315:17","span":{"start":[315,17],"end":[315,41],"bytes":[8008,8032]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList"},"318:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@318:25","span":{"start":[318,25],"end":[318,73],"bytes":[8098,8146]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"319:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@319:21","span":{"start":[319,21],"end":[319,42],"bytes":[8167,8188]},"callee":"can://litestream/litestream/@external/time/Since"},"323:37":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@323:37","span":{"start":[323,37],"end":[323,48],"bytes":[8245,8256]},"callee":null},"327:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@327:23","span":{"start":[327,23],"end":[327,53],"bytes":[8330,8360]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount"},"330:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@330:26","span":{"start":[330,26],"end":[330,96],"bytes":[8429,8499]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"331:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@331:22","span":{"start":[331,22],"end":[331,43],"bytes":[8521,8542]},"callee":"can://litestream/litestream/@external/time/Since"},"335:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@335:25","span":{"start":[335,25],"end":[335,57],"bytes":[8589,8621]},"callee":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount"},"338:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@338:26","span":{"start":[338,26],"end":[338,98],"bytes":[8690,8762]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"339:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@339:22","span":{"start":[339,22],"end":[339,43],"bytes":[8784,8805]},"callee":"can://litestream/litestream/@external/time/Since"},"345:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@345:19","span":{"start":[345,19],"end":[345,58],"bytes":[8902,8941]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"345:62":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@345:62","span":{"start":[345,62],"end":[345,127],"bytes":[8945,9010]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"349:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@349:20","span":{"start":[349,20],"end":[349,41],"bytes":[9038,9059]},"callee":"can://litestream/litestream/@external/time/Since"},"356:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@356:2","span":{"start":[356,2],"end":[360,3],"bytes":[9191,9323]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"359:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation@359:21","span":{"start":[359,21],"end":[359,32],"bytes":[9308,9319]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","kind":"method","span":{"start":[194,1],"end":[247,2],"bytes":[4744,6124]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[194,1],"end":[194,88],"bytes":[4744,4831]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":6},"body":{"195:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@195:15","span":{"start":[195,15],"end":[195,25],"bytes":[4846,4856]},"callee":"can://litestream/litestream/@external/time/Now"},"198:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@198:14","span":{"start":[198,14],"end":[198,42],"bytes":[4931,4959]},"callee":null},"201:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@201:13","span":{"start":[201,13],"end":[201,46],"bytes":[4977,5010]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"204:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@204:25","span":{"start":[204,25],"end":[204,72],"bytes":[5076,5123]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"207:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@207:8","span":{"start":[207,8],"end":[207,18],"bytes":[5150,5160]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close","is_deferred":true},"209:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@209:15","span":{"start":[209,15],"end":[209,49],"bytes":[5176,5210]},"callee":"can://litestream/litestream/@external/database/sql/DB.Query"},"212:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@212:25","span":{"start":[212,25],"end":[212,71],"bytes":[5276,5322]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"213:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@213:21","span":{"start":[213,21],"end":[213,42],"bytes":[5343,5364]},"callee":"can://litestream/litestream/@external/time/Since"},"216:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@216:8","span":{"start":[216,8],"end":[216,20],"bytes":[5391,5403]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Close","is_deferred":true},"219:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@219:6","span":{"start":[219,6],"end":[219,17],"bytes":[5432,5443]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Next"},"221:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@221:13","span":{"start":[221,13],"end":[221,29],"bytes":[5476,5492]},"callee":"can://litestream/litestream/@external/database/sql/Rows.Scan"},"223:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@223:26","span":{"start":[223,26],"end":[223,71],"bytes":[5557,5602]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"224:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@224:22","span":{"start":[224,22],"end":[224,43],"bytes":[5624,5645]},"callee":"can://litestream/litestream/@external/time/Since"},"227:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@227:13","span":{"start":[227,13],"end":[227,34],"bytes":[5679,5700]},"callee":null},"230:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@230:20","span":{"start":[230,20],"end":[230,41],"bytes":[5724,5745]},"callee":"can://litestream/litestream/@external/time/Since"},"233:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@233:5","span":{"start":[233,5],"end":[233,17],"bytes":[5794,5806]},"callee":null},"237:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@237:25","span":{"start":[237,25],"end":[237,81],"bytes":[5917,5973]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"240:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@240:2","span":{"start":[240,2],"end":[244,3],"bytes":[5979,6106]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"243:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck@243:13","span":{"start":[243,13],"end":[243,25],"bytes":[6088,6100]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","kind":"method","span":{"start":[154,1],"end":[192,2],"bytes":[3778,4742]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[154,1],"end":[154,84],"bytes":[3778,3861]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":4},"body":{"155:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@155:15","span":{"start":[155,15],"end":[155,25],"bytes":[3876,3886]},"callee":"can://litestream/litestream/@external/time/Now"},"158:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@158:14","span":{"start":[158,14],"end":[158,42],"bytes":[3957,3985]},"callee":null},"161:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@161:13","span":{"start":[161,13],"end":[161,46],"bytes":[4003,4036]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"164:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@164:25","span":{"start":[164,25],"end":[164,72],"bytes":[4102,4149]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"167:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@167:8","span":{"start":[167,8],"end":[167,18],"bytes":[4176,4186]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close","is_deferred":true},"170:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@170:8","span":{"start":[170,8],"end":[170,60],"bytes":[4219,4271]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"170:8/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@170:8/2","span":{"start":[170,8],"end":[170,41],"bytes":[4219,4252]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRow"},"171:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@171:20","span":{"start":[171,20],"end":[171,41],"bytes":[4291,4312]},"callee":"can://litestream/litestream/@external/time/Since"},"175:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@175:25","span":{"start":[175,25],"end":[175,67],"bytes":[4379,4421]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"183:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@183:25","span":{"start":[183,25],"end":[183,77],"bytes":[4571,4623]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"186:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck@186:2","span":{"start":[186,2],"end":[189,3],"bytes":[4629,4724]},"callee":"can://litestream/litestream/@external/log/slog/Info"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","kind":"method","span":{"start":[99,1],"end":[152,2],"bytes":[2442,3776]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[99,1],"end":[99,81],"bytes":[2442,2522]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":6},"body":{"100:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@100:15","span":{"start":[100,15],"end":[100,25],"bytes":[2537,2547]},"callee":"can://litestream/litestream/@external/time/Now"},"103:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@103:14","span":{"start":[103,14],"end":[103,42],"bytes":[2614,2642]},"callee":null},"106:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@106:12","span":{"start":[106,12],"end":[106,35],"bytes":[2659,2682]},"callee":"can://litestream/litestream/@external/os/Remove"},"106:52":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@106:52","span":{"start":[106,52],"end":[106,70],"bytes":[2699,2717]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"107:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@107:3","span":{"start":[107,3],"end":[107,73],"bytes":[2722,2792]},"callee":"can://litestream/litestream/@external/log/slog/Warn"},"112:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@112:9","span":{"start":[112,9],"end":[116,4],"bytes":[2849,2968]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"118:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@118:9","span":{"start":[118,9],"end":[121,4],"bytes":[2987,3080]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"124:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@124:17","span":{"start":[124,17],"end":[124,37],"bytes":[3101,3121]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"125:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@125:20","span":{"start":[125,20],"end":[125,41],"bytes":[3141,3162]},"callee":"can://litestream/litestream/@external/time/Since"},"129:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@129:25","span":{"start":[129,25],"end":[129,91],"bytes":[3229,3295]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"129:76":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@129:76","span":{"start":[129,76],"end":[129,90],"bytes":[3280,3294]},"callee":null},"133:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@133:15","span":{"start":[133,15],"end":[133,36],"bytes":[3330,3351]},"callee":"can://litestream/litestream/@external/os/Stat"},"135:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@135:25","span":{"start":[135,25],"end":[135,76],"bytes":[3414,3465]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"142:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@142:18","span":{"start":[142,18],"end":[142,39],"bytes":[3574,3595]},"callee":"can://litestream/litestream/@external/os/Stat"},"143:37":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@143:37","span":{"start":[143,37],"end":[143,48],"bytes":[3646,3657]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"146:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore@146:2","span":{"start":[146,2],"end":[149,3],"bytes":[3663,3758]},"callee":"can://litestream/litestream/@external/log/slog/Info"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","kind":"method","span":{"start":[442,1],"end":[460,2],"bytes":[11193,11601]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","parameters":[{"name":"results","type":"[]github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","span":{"start":[442,1],"end":[442,76],"bytes":[11193,11268]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"447:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults@447:4","span":{"start":[447,4],"end":[450,5],"bytes":[11368,11474]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"455:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults@455:3","span":{"start":[455,3],"end":[455,44],"bytes":[11501,11542]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"459:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults@459:9","span":{"start":[459,9],"end":[459,40],"bytes":[11568,11599]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","kind":"method","span":{"start":[365,1],"end":[399,2],"bytes":[9343,10275]},"signature":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[365,1],"end":[365,88],"bytes":[9343,9430]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","metrics":{"cyclomatic":3},"body":{"366:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@366:15","span":{"start":[366,15],"end":[366,25],"bytes":[9445,9455]},"callee":"can://litestream/litestream/@external/time/Now"},"369:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@369:14","span":{"start":[369,14],"end":[369,42],"bytes":[9529,9557]},"callee":null},"372:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@372:9","span":{"start":[372,9],"end":[372,68],"bytes":[9571,9630]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"373:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@373:17","span":{"start":[373,17],"end":[373,29],"bytes":[9647,9659]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.Output"},"376:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@376:25","span":{"start":[376,25],"end":[376,73],"bytes":[9725,9773]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"377:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@377:21","span":{"start":[377,21],"end":[377,42],"bytes":[9794,9815]},"callee":"can://litestream/litestream/@external/time/Since"},"381:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@381:11","span":{"start":[381,11],"end":[381,46],"bytes":[9846,9881]},"callee":"can://litestream/litestream/@external/strings/Split"},"381:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@381:25","span":{"start":[381,25],"end":[381,39],"bytes":[9860,9874]},"callee":null},"382:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@382:5","span":{"start":[382,5],"end":[382,15],"bytes":[9886,9896]},"callee":null},"385:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@385:21","span":{"start":[385,21],"end":[385,42],"bytes":[9992,10013]},"callee":"can://litestream/litestream/@external/time/Since"},"390:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@390:20","span":{"start":[390,20],"end":[390,41],"bytes":[10075,10096]},"callee":"can://litestream/litestream/@external/time/Since"},"391:40":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@391:40","span":{"start":[391,40],"end":[391,50],"bytes":[10136,10146]},"callee":null},"393:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity@393:2","span":{"start":[393,2],"end":[396,3],"bytes":[10153,10257]},"callee":"can://litestream/litestream/@external/log/slog/Info"}}}},"fields":{"CheckType":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/CheckType","kind":"field","type":"string","span":{"start":[25,1],"end":[25,22],"bytes":[279,300]}},"ConfigPath":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/ConfigPath","kind":"field","type":"string","span":{"start":[27,1],"end":[27,22],"bytes":[321,342]}},"LTXContinuity":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/LTXContinuity","kind":"field","type":"bool","span":{"start":[26,1],"end":[26,20],"bytes":[301,320]}},"Main":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/Main","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream-test.Main","span":{"start":[20,1],"end":[20,12],"bytes":[200,211]}},"ReplicaURL":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/ReplicaURL","kind":"field","type":"string","span":{"start":[23,1],"end":[23,22],"bytes":[235,256]}},"RestoredDB":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/RestoredDB","kind":"field","type":"string","span":{"start":[24,1],"end":[24,22],"bytes":[257,278]}},"SourceDB":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/SourceDB","kind":"field","type":"string","span":{"start":[22,1],"end":[22,22],"bytes":[213,234]}}}},"ValidationResult":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult","kind":"struct","span":{"start":[30,1],"end":[36,2],"bytes":[346,504]},"callables":{},"fields":{"CheckType":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/CheckType","kind":"field","type":"string","span":{"start":[31,1],"end":[31,21],"bytes":[377,397]}},"Details":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/Details","kind":"field","type":"map[string]interface{}","span":{"start":[35,1],"end":[35,37],"bytes":[466,502]}},"Duration":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/Duration","kind":"field","type":"time.Duration","span":{"start":[33,1],"end":[33,28],"bytes":[417,444]}},"ErrorMessage":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/ErrorMessage","kind":"field","type":"string","span":{"start":[34,1],"end":[34,21],"bytes":[445,465]}},"Passed":{"id":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidationResult/Passed","kind":"field","type":"bool","span":{"start":[32,1],"end":[32,19],"bytes":[398,416]}}}}},"functions":{},"content_hash":"e60ce14e89afa8decef6dfab01ca6c537d4c7beeda6658ebb90ad8c9cf4766cc"},"cmd/litestream/databases.go":{"id":"can://litestream/litestream/go/cmd/litestream/databases.go","kind":"module","span":{"start":[1,1],"end":[105,1],"bytes":[0,2227]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"text/tabwriter\"\n)\n\n// DatabasesCommand is a command for listing managed databases.\ntype DatabasesCommand struct{}\n\n// Run executes the command.\nfunc (c *DatabasesCommand) Run(_ context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-databases\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t} else if fs.NArg() != 0 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\t// Load configuration.\n\tif *configPath == \"\" {\n\t\t*configPath = DefaultConfigPath()\n\t}\n\tconfig, err := ReadConfigFile(*configPath, !*noExpandEnv)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdatabases := make([]DatabaseInfo, 0, len(config.DBs))\n\tfor _, dbConfig := range config.DBs {\n\t\tdb, err := NewDBFromConfig(dbConfig)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tdatabases = append(databases, DatabaseInfo{\n\t\t\tPath: db.Path(),\n\t\t\tReplica: db.Replica.Client.Type(),\n\t\t})\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(databases, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tw := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)\n\tdefer w.Flush()\n\n\tfmt.Fprintln(w, \"path\\treplica\")\n\tfor _, db := range databases {\n\t\tfmt.Fprintf(w, \"%s\\t%s\\n\", db.Path, db.Replica)\n\t}\n\n\treturn nil\n}\n\ntype DatabaseInfo struct {\n\tPath string `json:\"path\"`\n\tReplica string `json:\"replica\"`\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *DatabasesCommand) Usage() {\n\tfmt.Printf(`\nThe databases command lists all databases in the configuration file.\n\nUsage:\n\n\tlitestream databases [arguments]\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-json\n\t Output raw JSON instead of human-readable text.\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\nExamples:\n\n\t$ litestream databases\n\t$ litestream databases -config /path/to/litestream.yml\n\t$ litestream databases -no-expand-env -config /path/to/litestream.yml\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"tabwriter","path":"text/tabwriter","span":{"start":[9,1],"end":[9,18],"bytes":[72,89]}}],"types":{"DatabaseInfo":{"id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabaseInfo","kind":"struct","span":{"start":[69,1],"end":[72,2],"bytes":[1497,1588]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabaseInfo/Path","kind":"field","type":"string","span":{"start":[70,1],"end":[70,30],"bytes":[1524,1553]}},"Replica":{"id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabaseInfo/Replica","kind":"field","type":"string","span":{"start":[71,1],"end":[71,33],"bytes":[1554,1586]}}}},"DatabasesCommand":{"id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand","kind":"struct","span":{"start":[13,1],"end":[13,31],"bytes":[157,187]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","kind":"method","span":{"start":[16,1],"end":[67,2],"bytes":[218,1495]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","parameters":[{"name":"_","type":"context.Context","span":{"start":[16,1],"end":[16,79],"bytes":[218,296]}},{"name":"args","type":"[]string","span":{"start":[16,1],"end":[16,79],"bytes":[218,296]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"17:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@17:8","span":{"start":[17,8],"end":[17,69],"bytes":[304,365]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"18:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@18:29","span":{"start":[18,29],"end":[18,51],"bytes":[394,416]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"19:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@19:16","span":{"start":[19,16],"end":[19,57],"bytes":[432,473]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"21:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@21:12","span":{"start":[21,12],"end":[21,26],"bytes":[505,519]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"23:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@23:12","span":{"start":[23,12],"end":[23,21],"bytes":[558,567]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"24:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@24:10","span":{"start":[24,10],"end":[24,42],"bytes":[584,616]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"29:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@29:17","span":{"start":[29,17],"end":[29,36],"bytes":[685,704]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"31:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@31:17","span":{"start":[31,17],"end":[31,59],"bytes":[724,766]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"36:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@36:15","span":{"start":[36,15],"end":[36,55],"bytes":[815,855]},"callee":null},"36:39":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@36:39","span":{"start":[36,39],"end":[36,54],"bytes":[839,854]},"callee":null},"38:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@38:14","span":{"start":[38,14],"end":[38,39],"bytes":[908,933]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"43:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@43:15","span":{"start":[43,15],"end":[46,5],"bytes":[985,1082]},"callee":null},"44:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@44:13","span":{"start":[44,13],"end":[44,22],"bytes":[1029,1038]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"45:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@45:13","span":{"start":[45,13],"end":[45,37],"bytes":[1052,1076]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"50:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@50:18","span":{"start":[50,18],"end":[50,57],"bytes":[1122,1161]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"52:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@52:11","span":{"start":[52,11],"end":[52,59],"bytes":[1190,1238]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"54:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@54:15","span":{"start":[54,15],"end":[54,29],"bytes":[1257,1271]},"callee":null},"54:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@54:3","span":{"start":[54,3],"end":[54,30],"bytes":[1245,1272]},"callee":"can://litestream/litestream/@external/fmt/Println"},"58:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@58:7","span":{"start":[58,7],"end":[58,54],"bytes":[1296,1343]},"callee":"can://litestream/litestream/@external/text/tabwriter/NewWriter"},"59:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@59:8","span":{"start":[59,8],"end":[59,17],"bytes":[1351,1360]},"callee":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","is_deferred":true},"61:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@61:2","span":{"start":[61,2],"end":[61,34],"bytes":[1363,1395]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"},"63:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run@63:3","span":{"start":[63,3],"end":[63,50],"bytes":[1430,1477]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"}}},"github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage","kind":"method","span":{"start":[75,1],"end":[104,2],"bytes":[1633,2226]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"102:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage@102:3","span":{"start":[102,3],"end":[102,22],"bytes":[2201,2220]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"76:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage@76:2","span":{"start":[76,2],"end":[103,3],"bytes":[1671,2224]},"callee":"can://litestream/litestream/@external/fmt/Printf"}}}}}},"functions":{},"content_hash":"d9ceaff1b578d1b0bbebb2951a94207cbb6581ef0c59e2fcb7bd1ec27426851b"},"cmd/litestream/directory_watcher.go":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go","kind":"module","span":{"start":[1,1],"end":[439,1],"bytes":[0,9884]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/fsnotify/fsnotify\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\nconst debounceInterval = 250 * time.Millisecond\n\n// DirectoryMonitor watches a directory tree for SQLite databases and dynamically\n// manages database instances within the store as files are created or removed.\ntype DirectoryMonitor struct {\n\tstore *litestream.Store\n\tconfig *DBConfig\n\tdirPath string\n\tpattern string\n\trecursive bool\n\n\twatcher *fsnotify.Watcher\n\tctx context.Context\n\tcancel context.CancelFunc\n\n\tlogger *slog.Logger\n\n\tmu sync.Mutex\n\tdbs map[string]*litestream.DB\n\twatchedDirs map[string]struct{}\n\n\t// Only accessed from the run() goroutine, so no mutex is needed.\n\tpendingEvents map[string]fsnotify.Op\n\tdebounceActive bool\n\n\twg sync.WaitGroup\n}\n\n// NewDirectoryMonitor returns a new monitor for directory-based replication.\nfunc NewDirectoryMonitor(ctx context.Context, store *litestream.Store, dbc *DBConfig, existing []*litestream.DB) (*DirectoryMonitor, error) {\n\tif dbc == nil {\n\t\treturn nil, errors.New(\"database config required\")\n\t}\n\tif store == nil {\n\t\treturn nil, errors.New(\"store required\")\n\t}\n\n\tdirPath, err := expand(dbc.Dir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif _, err := os.Stat(dirPath); err != nil {\n\t\treturn nil, err\n\t}\n\n\twatcher, err := fsnotify.NewWatcher()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tmonitorCtx, cancel := context.WithCancel(ctx)\n\tdm := \u0026DirectoryMonitor{\n\t\tstore: store,\n\t\tconfig: dbc,\n\t\tdirPath: dirPath,\n\t\tpattern: dbc.Pattern,\n\t\trecursive: dbc.Recursive,\n\t\twatcher: watcher,\n\t\tctx: monitorCtx,\n\t\tcancel: cancel,\n\t\tlogger: slog.With(\"dir\", dirPath),\n\t\tdbs: make(map[string]*litestream.DB),\n\t\twatchedDirs: make(map[string]struct{}),\n\t\tpendingEvents: make(map[string]fsnotify.Op),\n\t}\n\n\tfor _, db := range existing {\n\t\tdm.dbs[db.Path()] = db\n\t}\n\n\tif err := dm.addInitialWatches(); err != nil {\n\t\twatcher.Close()\n\t\tcancel()\n\t\treturn nil, err\n\t}\n\n\tdm.scanDirectory(dm.dirPath)\n\n\tdm.wg.Add(1)\n\tgo dm.run()\n\n\treturn dm, nil\n}\n\n// Close stops the directory monitor and releases resources.\nfunc (dm *DirectoryMonitor) Close() {\n\tdm.cancel()\n\t_ = dm.watcher.Close()\n\tdm.wg.Wait()\n}\n\nfunc (dm *DirectoryMonitor) run() {\n\tdefer dm.wg.Done()\n\n\t// Debounce timer lives in this goroutine so shutdown via dm.wg.Wait() is clean.\n\tdebounceTimer := time.NewTimer(debounceInterval)\n\tdebounceTimer.Stop()\n\tdefer debounceTimer.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-dm.ctx.Done():\n\t\t\treturn\n\t\tcase event, ok := \u003c-dm.watcher.Events:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif dm.handleEvent(event) \u0026\u0026 !dm.debounceActive {\n\t\t\t\tdebounceTimer.Reset(debounceInterval)\n\t\t\t\tdm.debounceActive = true\n\t\t\t}\n\t\tcase \u003c-debounceTimer.C:\n\t\t\tdm.flushPendingEvents()\n\t\tcase err, ok := \u003c-dm.watcher.Errors:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tdm.logger.Error(\"directory watcher error\", \"error\", err)\n\t\t}\n\t}\n}\n\nfunc (dm *DirectoryMonitor) addInitialWatches() error {\n\tif dm.recursive {\n\t\treturn filepath.WalkDir(dm.dirPath, func(path string, d os.DirEntry, err error) error {\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif !d.IsDir() {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn dm.addDirectoryWatch(path)\n\t\t})\n\t}\n\n\treturn dm.addDirectoryWatch(dm.dirPath)\n}\n\nfunc (dm *DirectoryMonitor) addDirectoryWatch(path string) error {\n\tabspath := filepath.Clean(path)\n\n\tdm.mu.Lock()\n\tdefer dm.mu.Unlock()\n\n\tif _, ok := dm.watchedDirs[abspath]; ok {\n\t\treturn nil\n\t}\n\tdm.watchedDirs[abspath] = struct{}{}\n\n\tif err := dm.watcher.Add(abspath); err != nil {\n\t\tdelete(dm.watchedDirs, abspath)\n\t\treturn err\n\t}\n\n\tdm.logger.Debug(\"watching directory\", \"path\", abspath)\n\treturn nil\n}\n\nfunc (dm *DirectoryMonitor) removeDirectoryWatch(path string) {\n\tabspath := filepath.Clean(path)\n\n\tdm.mu.Lock()\n\tdefer dm.mu.Unlock()\n\n\tif _, ok := dm.watchedDirs[abspath]; !ok {\n\t\treturn\n\t}\n\tdelete(dm.watchedDirs, abspath)\n\n\tif err := dm.watcher.Remove(abspath); err != nil {\n\t\tdm.logger.Debug(\"remove directory watch\", \"path\", abspath, \"error\", err)\n\t}\n}\n\n// handleEvent processes a single fsnotify event. Returns true if pending events\n// were queued and the debounce timer should be reset.\nfunc (dm *DirectoryMonitor) handleEvent(event fsnotify.Event) bool {\n\tpath := filepath.Clean(event.Name)\n\tif path == \"\" {\n\t\treturn false\n\t}\n\n\tif dm.shouldSkipPath(path) {\n\t\treturn false\n\t}\n\n\tinfo, statErr := os.Stat(path)\n\tisDir := statErr == nil \u0026\u0026 info.IsDir()\n\n\t// Early pattern check for create/write only. Rename must pass through\n\t// to removal handling below, since the old path may be a tracked DB.\n\tif !isDir \u0026\u0026 event.Op\u0026(fsnotify.Create|fsnotify.Write) != 0 {\n\t\tif !dm.matchesPattern(path) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tdm.mu.Lock()\n\t_, wasWatchedDir := dm.watchedDirs[path]\n\tdm.mu.Unlock()\n\n\tif isDir \u0026\u0026 event.Op\u0026(fsnotify.Create|fsnotify.Rename) != 0 {\n\t\tif dm.recursive {\n\t\t\tif err := dm.addDirectoryWatch(path); err != nil {\n\t\t\t\tdm.logger.Error(\"add directory watch\", \"path\", path, \"error\", err)\n\t\t\t}\n\t\t\tdm.scanDirectory(path)\n\t\t}\n\t}\n\n\tif (isDir || wasWatchedDir) \u0026\u0026 event.Op\u0026(fsnotify.Remove|fsnotify.Rename) != 0 {\n\t\tdm.removeDirectoryWatch(path)\n\t\tdm.removeDatabasesUnder(path)\n\t\treturn false\n\t}\n\n\tif isDir {\n\t\treturn false\n\t}\n\n\tif statErr != nil \u0026\u0026 !os.IsNotExist(statErr) {\n\t\tdm.logger.Debug(\"stat event path\", \"path\", path, \"error\", statErr)\n\t\treturn false\n\t}\n\n\tif event.Op\u0026(fsnotify.Remove|fsnotify.Rename) != 0 {\n\t\tdm.removeDatabase(path)\n\t\treturn false\n\t}\n\n\tif event.Op\u0026(fsnotify.Create|fsnotify.Write|fsnotify.Rename) != 0 {\n\t\tdm.pendingEvents[path] |= event.Op\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// flushPendingEvents processes all queued potential database events.\nfunc (dm *DirectoryMonitor) flushPendingEvents() {\n\tfor path := range dm.pendingEvents {\n\t\tselect {\n\t\tcase \u003c-dm.ctx.Done():\n\t\t\treturn\n\t\tdefault:\n\t\t}\n\t\tdm.handlePotentialDatabase(path)\n\t}\n\tdm.pendingEvents = make(map[string]fsnotify.Op)\n\tdm.debounceActive = false\n}\n\nfunc (dm *DirectoryMonitor) handlePotentialDatabase(path string) {\n\tif !dm.matchesPattern(path) {\n\t\treturn\n\t}\n\n\tdm.mu.Lock()\n\tif _, exists := dm.dbs[path]; exists {\n\t\tdm.mu.Unlock()\n\t\treturn\n\t}\n\tdm.dbs[path] = nil\n\tdm.mu.Unlock()\n\n\tvar db *litestream.DB\n\tsuccess := false\n\tdefer func() {\n\t\tif !success {\n\t\t\tif db != nil {\n\t\t\t\t_ = dm.store.UnregisterDB(dm.ctx, db.Path())\n\t\t\t}\n\t\t\tdm.mu.Lock()\n\t\t\tdelete(dm.dbs, path)\n\t\t\tdm.mu.Unlock()\n\t\t}\n\t}()\n\n\tif !IsSQLiteDatabase(path) {\n\t\treturn\n\t}\n\n\tvar err error\n\tdb, err = newDBFromDirectoryEntry(dm.config, dm.dirPath, path)\n\tif err != nil {\n\t\tdm.logger.Error(\"configure database\", \"path\", path, \"error\", err)\n\t\treturn\n\t}\n\n\tif err := dm.store.RegisterDB(db); err != nil {\n\t\tdm.logger.Error(\"register database with store\", \"path\", path, \"error\", err)\n\t\treturn\n\t}\n\n\tdm.mu.Lock()\n\tdm.dbs[path] = db\n\tdm.mu.Unlock()\n\n\tsuccess = true\n\tdm.logger.Info(\"added database to replication\", \"path\", path)\n}\n\nfunc (dm *DirectoryMonitor) removeDatabase(path string) {\n\tdm.mu.Lock()\n\tdb := dm.dbs[path]\n\tdm.mu.Unlock()\n\n\tif db == nil {\n\t\treturn\n\t}\n\n\tif err := dm.store.UnregisterDB(dm.ctx, db.Path()); err != nil {\n\t\tdm.logger.Error(\"unregister database from store\", \"path\", path, \"error\", err)\n\t\treturn\n\t}\n\n\tdm.mu.Lock()\n\tdelete(dm.dbs, path)\n\tdm.mu.Unlock()\n\n\tdm.logger.Info(\"removed database from replication\", \"path\", path)\n}\n\nfunc (dm *DirectoryMonitor) removeDatabasesUnder(dir string) {\n\tprefix := dir + string(os.PathSeparator)\n\n\tdm.mu.Lock()\n\tvar toClose []*litestream.DB\n\tvar toClosePaths []string\n\tfor path, db := range dm.dbs {\n\t\tif path == dir || strings.HasPrefix(path, prefix) {\n\t\t\ttoClose = append(toClose, db)\n\t\t\ttoClosePaths = append(toClosePaths, path)\n\t\t}\n\t}\n\tdm.mu.Unlock()\n\n\tfor i, db := range toClose {\n\t\tif db == nil {\n\t\t\tdm.mu.Lock()\n\t\t\tdelete(dm.dbs, toClosePaths[i])\n\t\t\tdm.mu.Unlock()\n\t\t\tcontinue\n\t\t}\n\t\tif err := dm.store.UnregisterDB(dm.ctx, db.Path()); err != nil {\n\t\t\tdm.logger.Error(\"unregister database from store\", \"path\", db.Path(), \"error\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\tdm.mu.Lock()\n\t\tdelete(dm.dbs, toClosePaths[i])\n\t\tdm.mu.Unlock()\n\t}\n}\n\nfunc (dm *DirectoryMonitor) matchesPattern(path string) bool {\n\tmatched, err := filepath.Match(dm.pattern, filepath.Base(path))\n\tif err != nil {\n\t\tdm.logger.Error(\"pattern match failed\", \"pattern\", dm.pattern, \"path\", path, \"error\", err)\n\t\treturn false\n\t}\n\treturn matched\n}\n\n// shouldSkipPath returns true for SQLite auxiliary files (WAL, SHM, journal)\n// that generate many events but are never databases themselves.\nfunc (dm *DirectoryMonitor) shouldSkipPath(path string) bool {\n\tbase := filepath.Base(path)\n\treturn strings.HasSuffix(base, \"-wal\") ||\n\t\tstrings.HasSuffix(base, \"-shm\") ||\n\t\tstrings.HasSuffix(base, \"-journal\")\n}\n\n// scanDirectory discovers pre-existing databases and is also called when new\n// directories appear to close the race window between watch registration and file creation.\nfunc (dm *DirectoryMonitor) scanDirectory(dir string) {\n\tif !dm.recursive {\n\t\tentries, err := os.ReadDir(dir)\n\t\tif err != nil {\n\t\t\tif !os.IsNotExist(err) {\n\t\t\t\tdm.logger.Debug(\"read directory\", \"path\", dir, \"error\", err)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tfor _, entry := range entries {\n\t\t\tif entry.IsDir() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tpath := filepath.Join(dir, entry.Name())\n\t\t\tdm.handlePotentialDatabase(path)\n\t\t}\n\t\treturn\n\t}\n\n\terr := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tdm.logger.Debug(\"scan directory entry\", \"path\", path, \"error\", err)\n\t\t\treturn nil\n\t\t}\n\n\t\tif d.IsDir() {\n\t\t\tif path != dir {\n\t\t\t\tif err := dm.addDirectoryWatch(path); err != nil {\n\t\t\t\t\tdm.logger.Error(\"add directory watch\", \"path\", path, \"error\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\n\t\tdm.handlePotentialDatabase(path)\n\t\treturn nil\n\t})\n\tif err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\tdm.logger.Debug(\"scan directory\", \"path\", dir, \"error\", err)\n\t}\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[34,43]}},{"name":"slog","path":"log/slog","span":{"start":[6,1],"end":[6,12],"bytes":[44,55]}},{"name":"os","path":"os","span":{"start":[7,1],"end":[7,6],"bytes":[56,61]}},{"name":"filepath","path":"path/filepath","span":{"start":[8,1],"end":[8,17],"bytes":[62,78]}},{"name":"strings","path":"strings","span":{"start":[9,1],"end":[9,11],"bytes":[79,89]}},{"name":"sync","path":"sync","span":{"start":[10,1],"end":[10,8],"bytes":[90,97]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[98,105]}},{"name":"fsnotify","path":"github.com/fsnotify/fsnotify","span":{"start":[13,1],"end":[13,32],"bytes":[107,138]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[15,1],"end":[15,37],"bytes":[140,176]}}],"types":{"DirectoryMonitor":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor","kind":"struct","span":{"start":[22,1],"end":[44,2],"bytes":[391,873]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","kind":"method","span":{"start":[104,1],"end":[108,2],"bytes":[2225,2315]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","parameters":[],"metrics":{"cyclomatic":1},"body":{"105:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close@105:2","span":{"start":[105,2],"end":[105,13],"bytes":[2264,2275]},"callee":null},"106:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close@106:6","span":{"start":[106,6],"end":[106,24],"bytes":[2281,2299]},"callee":null},"107:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close@107:2","span":{"start":[107,2],"end":[107,14],"bytes":[2301,2313]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Wait"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","kind":"method","span":{"start":[157,1],"end":[175,2],"bytes":[3329,3734]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","parameters":[{"name":"path","type":"string","span":{"start":[157,1],"end":[157,67],"bytes":[3329,3395]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"158:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch@158:13","span":{"start":[158,13],"end":[158,33],"bytes":[3408,3428]},"callee":"can://litestream/litestream/@external/path/filepath/Clean"},"160:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch@160:2","span":{"start":[160,2],"end":[160,14],"bytes":[3431,3443]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"161:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch@161:8","span":{"start":[161,8],"end":[161,22],"bytes":[3451,3465]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"168:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch@168:12","span":{"start":[168,12],"end":[168,35],"bytes":[3576,3599]},"callee":null},"169:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch@169:3","span":{"start":[169,3],"end":[169,34],"bytes":[3616,3647]},"callee":null},"173:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch@173:2","span":{"start":[173,2],"end":[173,56],"bytes":[3666,3720]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","kind":"method","span":{"start":[141,1],"end":[155,2],"bytes":[2996,3327]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"143:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches@143:10","span":{"start":[143,10],"end":[151,5],"bytes":[3080,3280]},"callee":"can://litestream/litestream/@external/path/filepath/WalkDir"},"154:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches@154:9","span":{"start":[154,9],"end":[154,41],"bytes":[3293,3325]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches.closure_1","kind":"function","span":{"start":[143,1],"end":[151,5],"bytes":[3071,3280]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[143,1],"end":[143,90],"bytes":[3071,3160]}},{"name":"d","type":"os.DirEntry","span":{"start":[143,1],"end":[143,90],"bytes":[3071,3160]}},{"name":"err","type":"error","span":{"start":[143,1],"end":[143,90],"bytes":[3071,3160]}}],"return_type":"error","error_channel":["error"],"body":{"147:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches.closure_1@147:8","span":{"start":[147,8],"end":[147,17],"bytes":[3207,3216]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir"},"150:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches.closure_1@150:11","span":{"start":[150,11],"end":[150,37],"bytes":[3249,3275]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","kind":"method","span":{"start":[258,1],"end":[269,2],"bytes":[5718,5982]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","parameters":[],"metrics":{"cyclomatic":5},"body":{"261:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents@261:10","span":{"start":[261,10],"end":[261,23],"bytes":[5827,5840]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"265:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents@265:3","span":{"start":[265,3],"end":[265,35],"bytes":[5869,5901]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase"},"267:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents@267:21","span":{"start":[267,21],"end":[267,49],"bytes":[5925,5953]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","kind":"method","span":{"start":[195,1],"end":[255,2],"bytes":[4230,5646]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","parameters":[{"name":"event","type":"invalid type","span":{"start":[195,1],"end":[195,69],"bytes":[4230,4298]}}],"return_type":"bool","metrics":{"cyclomatic":13},"body":{"196:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@196:10","span":{"start":[196,10],"end":[196,36],"bytes":[4308,4334]},"callee":"can://litestream/litestream/@external/path/filepath/Clean"},"201:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@201:5","span":{"start":[201,5],"end":[201,28],"bytes":[4375,4398]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath"},"205:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@205:19","span":{"start":[205,19],"end":[205,32],"bytes":[4438,4451]},"callee":"can://litestream/litestream/@external/os/Stat"},"206:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@206:29","span":{"start":[206,29],"end":[206,41],"bytes":[4480,4492]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir"},"211:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@211:7","span":{"start":[211,7],"end":[211,30],"bytes":[4706,4729]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern"},"216:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@216:2","span":{"start":[216,2],"end":[216,14],"bytes":[4757,4769]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"218:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@218:2","span":{"start":[218,2],"end":[218,16],"bytes":[4813,4827]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"222:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@222:14","span":{"start":[222,14],"end":[222,40],"bytes":[4925,4951]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch"},"223:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@223:5","span":{"start":[223,5],"end":[223,71],"bytes":[4970,5036]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"225:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@225:4","span":{"start":[225,4],"end":[225,26],"bytes":[5045,5067]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory"},"230:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@230:3","span":{"start":[230,3],"end":[230,32],"bytes":[5160,5189]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch"},"231:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@231:3","span":{"start":[231,3],"end":[231,32],"bytes":[5192,5221]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder"},"239:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@239:24","span":{"start":[239,24],"end":[239,46],"bytes":[5295,5317]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"240:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@240:3","span":{"start":[240,3],"end":[240,69],"bytes":[5322,5388]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"245:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent@245:3","span":{"start":[245,3],"end":[245,26],"bytes":[5464,5487]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","kind":"method","span":{"start":[271,1],"end":[319,2],"bytes":[5984,6918]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","parameters":[{"name":"path","type":"string","span":{"start":[271,1],"end":[271,67],"bytes":[5984,6050]}}],"metrics":{"cyclomatic":8},"body":{"272:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@272:6","span":{"start":[272,6],"end":[272,29],"bytes":[6056,6079]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern"},"276:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@276:2","span":{"start":[276,2],"end":[276,14],"bytes":[6096,6108]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"278:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@278:3","span":{"start":[278,3],"end":[278,17],"bytes":[6151,6165]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"282:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@282:2","span":{"start":[282,2],"end":[282,16],"bytes":[6199,6213]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"286:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@286:8","span":{"start":[286,8],"end":[295,5],"bytes":[6263,6426]},"callee":null,"is_deferred":true},"297:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@297:6","span":{"start":[297,6],"end":[297,28],"bytes":[6433,6455]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase"},"302:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@302:12","span":{"start":[302,12],"end":[302,64],"bytes":[6497,6549]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry"},"304:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@304:3","span":{"start":[304,3],"end":[304,68],"bytes":[6569,6634]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"308:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@308:12","span":{"start":[308,12],"end":[308,35],"bytes":[6659,6682]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB"},"309:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@309:3","span":{"start":[309,3],"end":[309,78],"bytes":[6699,6774]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"313:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@313:2","span":{"start":[313,2],"end":[313,14],"bytes":[6789,6801]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"315:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@315:2","span":{"start":[315,2],"end":[315,16],"bytes":[6822,6836]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"318:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase@318:2","span":{"start":[318,2],"end":[318,63],"bytes":[6855,6916]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1","kind":"function","span":{"start":[286,1],"end":[295,5],"bytes":[6256,6426]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1","parameters":[],"body":{"289:39":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1@289:39","span":{"start":[289,39],"end":[289,48],"bytes":[6344,6353]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"289:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1@289:9","span":{"start":[289,9],"end":[289,49],"bytes":[6314,6354]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB"},"291:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1@291:4","span":{"start":[291,4],"end":[291,16],"bytes":[6363,6375]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"292:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1@292:4","span":{"start":[292,4],"end":[292,24],"bytes":[6379,6399]},"callee":null},"293:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1@293:4","span":{"start":[293,4],"end":[293,18],"bytes":[6403,6417]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","kind":"method","span":{"start":[374,1],"end":[381,2],"bytes":[8079,8352]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","parameters":[{"name":"path","type":"string","span":{"start":[374,1],"end":[374,63],"bytes":[8079,8141]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"375:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern@375:18","span":{"start":[375,18],"end":[375,65],"bytes":[8159,8206]},"callee":"can://litestream/litestream/@external/path/filepath/Match"},"375:45":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern@375:45","span":{"start":[375,45],"end":[375,64],"bytes":[8186,8205]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"377:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern@377:3","span":{"start":[377,3],"end":[377,93],"bytes":[8226,8316]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","kind":"method","span":{"start":[321,1],"end":[340,2],"bytes":[6920,7338]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","parameters":[{"name":"path","type":"string","span":{"start":[321,1],"end":[321,58],"bytes":[6920,6977]}}],"metrics":{"cyclomatic":3},"body":{"322:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@322:2","span":{"start":[322,2],"end":[322,14],"bytes":[6979,6991]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"324:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@324:2","span":{"start":[324,2],"end":[324,16],"bytes":[7013,7027]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"330:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@330:12","span":{"start":[330,12],"end":[330,52],"bytes":[7069,7109]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB"},"330:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@330:42","span":{"start":[330,42],"end":[330,51],"bytes":[7099,7108]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"331:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@331:3","span":{"start":[331,3],"end":[331,80],"bytes":[7126,7203]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"335:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@335:2","span":{"start":[335,2],"end":[335,14],"bytes":[7218,7230]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"336:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@336:2","span":{"start":[336,2],"end":[336,22],"bytes":[7232,7252]},"callee":null},"337:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@337:2","span":{"start":[337,2],"end":[337,16],"bytes":[7254,7268]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"339:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase@339:2","span":{"start":[339,2],"end":[339,67],"bytes":[7271,7336]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","kind":"method","span":{"start":[342,1],"end":[372,2],"bytes":[7340,8077]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","parameters":[{"name":"dir","type":"string","span":{"start":[342,1],"end":[342,63],"bytes":[7340,7402]}}],"metrics":{"cyclomatic":6},"body":{"343:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@343:18","span":{"start":[343,18],"end":[343,42],"bytes":[7420,7444]},"callee":null},"345:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@345:2","span":{"start":[345,2],"end":[345,14],"bytes":[7447,7459]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"349:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@349:21","span":{"start":[349,21],"end":[349,52],"bytes":[7569,7600]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"350:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@350:14","span":{"start":[350,14],"end":[350,33],"bytes":[7616,7635]},"callee":null},"351:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@351:19","span":{"start":[351,19],"end":[351,45],"bytes":[7654,7680]},"callee":null},"354:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@354:2","span":{"start":[354,2],"end":[354,16],"bytes":[7689,7703]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"358:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@358:4","span":{"start":[358,4],"end":[358,16],"bytes":[7755,7767]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"359:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@359:4","span":{"start":[359,4],"end":[359,35],"bytes":[7771,7802]},"callee":null},"360:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@360:4","span":{"start":[360,4],"end":[360,18],"bytes":[7806,7820]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"363:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@363:13","span":{"start":[363,13],"end":[363,53],"bytes":[7849,7889]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB"},"363:43":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@363:43","span":{"start":[363,43],"end":[363,52],"bytes":[7879,7888]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"364:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@364:4","span":{"start":[364,4],"end":[364,86],"bytes":[7907,7989]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"364:62":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@364:62","span":{"start":[364,62],"end":[364,71],"bytes":[7965,7974]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"368:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@368:3","span":{"start":[368,3],"end":[368,15],"bytes":[8009,8021]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"369:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@369:3","span":{"start":[369,3],"end":[369,34],"bytes":[8024,8055]},"callee":null},"370:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder@370:3","span":{"start":[370,3],"end":[370,17],"bytes":[8058,8072]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","kind":"method","span":{"start":[177,1],"end":[191,2],"bytes":[3736,4092]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","parameters":[{"name":"path","type":"string","span":{"start":[177,1],"end":[177,64],"bytes":[3736,3799]}}],"metrics":{"cyclomatic":3},"body":{"178:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch@178:13","span":{"start":[178,13],"end":[178,33],"bytes":[3812,3832]},"callee":"can://litestream/litestream/@external/path/filepath/Clean"},"180:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch@180:2","span":{"start":[180,2],"end":[180,14],"bytes":[3835,3847]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"181:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch@181:8","span":{"start":[181,8],"end":[181,22],"bytes":[3855,3869]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"186:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch@186:2","span":{"start":[186,2],"end":[186,33],"bytes":[3928,3959]},"callee":null},"188:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch@188:12","span":{"start":[188,12],"end":[188,38],"bytes":[3972,3998]},"callee":null},"189:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch@189:3","span":{"start":[189,3],"end":[189,75],"bytes":[4015,4087]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","kind":"method","span":{"start":[110,1],"end":[139,2],"bytes":[2317,2994]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","parameters":[],"metrics":{"cyclomatic":10},"body":{"111:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@111:8","span":{"start":[111,8],"end":[111,20],"bytes":[2360,2372]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"114:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@114:19","span":{"start":[114,19],"end":[114,50],"bytes":[2474,2505]},"callee":"can://litestream/litestream/@external/time/NewTimer"},"115:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@115:2","span":{"start":[115,2],"end":[115,22],"bytes":[2507,2527]},"callee":"can://litestream/litestream/@external/time/Timer.Stop"},"116:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@116:8","span":{"start":[116,8],"end":[116,28],"bytes":[2535,2555]},"callee":"can://litestream/litestream/@external/time/Timer.Stop","is_deferred":true},"120:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@120:10","span":{"start":[120,10],"end":[120,23],"bytes":[2584,2597]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"126:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@126:7","span":{"start":[126,7],"end":[126,28],"bytes":[2684,2705]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent"},"127:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@127:5","span":{"start":[127,5],"end":[127,42],"bytes":[2734,2771]},"callee":"can://litestream/litestream/@external/time/Timer.Reset"},"131:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@131:4","span":{"start":[131,4],"end":[131,27],"bytes":[2835,2858]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents"},"136:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run@136:4","span":{"start":[136,4],"end":[136,60],"bytes":[2929,2985]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","kind":"method","span":{"start":[394,1],"end":[438,2],"bytes":[8881,9883]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","parameters":[{"name":"dir","type":"string","span":{"start":[394,1],"end":[394,56],"bytes":[8881,8936]}}],"metrics":{"cyclomatic":12},"body":{"396:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@396:19","span":{"start":[396,19],"end":[396,34],"bytes":[8975,8990]},"callee":"can://litestream/litestream/@external/os/ReadDir"},"398:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@398:8","span":{"start":[398,8],"end":[398,26],"bytes":[9016,9034]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"399:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@399:5","span":{"start":[399,5],"end":[399,65],"bytes":[9041,9101]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"405:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@405:7","span":{"start":[405,7],"end":[405,20],"bytes":[9162,9175]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir"},"408:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@408:12","span":{"start":[408,12],"end":[408,44],"bytes":[9207,9239]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"408:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@408:31","span":{"start":[408,31],"end":[408,43],"bytes":[9226,9238]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.Name"},"409:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@409:4","span":{"start":[409,4],"end":[409,36],"bytes":[9243,9275]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase"},"414:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@414:9","span":{"start":[414,9],"end":[434,4],"bytes":[9301,9775]},"callee":"can://litestream/litestream/@external/path/filepath/WalkDir"},"435:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@435:20","span":{"start":[435,20],"end":[435,38],"bytes":[9795,9813]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"436:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory@436:3","span":{"start":[436,3],"end":[436,63],"bytes":[9818,9878]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","kind":"function","span":{"start":[414,1],"end":[434,4],"bytes":[9293,9775]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[414,1],"end":[414,82],"bytes":[9293,9374]}},{"name":"d","type":"os.DirEntry","span":{"start":[414,1],"end":[414,82],"bytes":[9293,9374]}},{"name":"err","type":"error","span":{"start":[414,1],"end":[414,82],"bytes":[9293,9374]}}],"return_type":"error","error_channel":["error"],"body":{"416:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1@416:7","span":{"start":[416,7],"end":[416,25],"bytes":[9399,9417]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"419:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1@419:4","span":{"start":[419,4],"end":[419,71],"bytes":[9443,9510]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"423:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1@423:6","span":{"start":[423,6],"end":[423,15],"bytes":[9535,9544]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir"},"425:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1@425:15","span":{"start":[425,15],"end":[425,41],"bytes":[9581,9607]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch"},"426:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1@426:6","span":{"start":[426,6],"end":[426,72],"bytes":[9627,9693]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"432:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1@432:3","span":{"start":[432,3],"end":[432,35],"bytes":[9726,9758]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath","kind":"method","span":{"start":[385,1],"end":[390,2],"bytes":[8497,8708]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath","parameters":[{"name":"path","type":"string","span":{"start":[385,1],"end":[385,63],"bytes":[8497,8559]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"386:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath@386:10","span":{"start":[386,10],"end":[386,29],"bytes":[8569,8588]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"387:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath@387:9","span":{"start":[387,9],"end":[387,40],"bytes":[8597,8628]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"},"388:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath@388:3","span":{"start":[388,3],"end":[388,34],"bytes":[8634,8665]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"},"389:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath@389:3","span":{"start":[389,3],"end":[389,38],"bytes":[8671,8706]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}}},"fields":{"cancel":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[31,1],"end":[31,28],"bytes":[577,604]}},"config":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/config","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[24,1],"end":[24,21],"bytes":[451,471]}},"ctx":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/ctx","kind":"field","type":"context.Context","span":{"start":[30,1],"end":[30,25],"bytes":[552,576]}},"dbs":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/dbs","kind":"field","type":"map[string]*github.com/benbjohnson/litestream.DB","span":{"start":[36,1],"end":[36,39],"bytes":[652,690]}},"debounceActive":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/debounceActive","kind":"field","type":"bool","span":{"start":[41,1],"end":[41,21],"bytes":[831,851]}},"dirPath":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/dirPath","kind":"field","type":"string","span":{"start":[25,1],"end":[25,18],"bytes":[472,489]}},"logger":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[33,1],"end":[33,21],"bytes":[606,626]}},"mu":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/mu","kind":"field","type":"sync.Mutex","span":{"start":[35,1],"end":[35,24],"bytes":[628,651]}},"pattern":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/pattern","kind":"field","type":"string","span":{"start":[26,1],"end":[26,18],"bytes":[490,507]}},"pendingEvents":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/pendingEvents","kind":"field","type":"map[string]invalid type","span":{"start":[40,1],"end":[40,39],"bytes":[792,830]}},"recursive":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/recursive","kind":"field","type":"bool","span":{"start":[27,1],"end":[27,16],"bytes":[508,523]}},"store":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/store","kind":"field","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[23,1],"end":[23,29],"bytes":[422,450]}},"watchedDirs":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/watchedDirs","kind":"field","type":"map[string]struct{}","span":{"start":[37,1],"end":[37,33],"bytes":[691,723]}},"watcher":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/watcher","kind":"field","type":"invalid type","span":{"start":[29,1],"end":[29,27],"bytes":[525,551]}},"wg":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[43,1],"end":[43,19],"bytes":[853,871]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor":{"id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","kind":"function","span":{"start":[47,1],"end":[101,2],"bytes":[953,2162]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[47,1],"end":[47,142],"bytes":[953,1094]}},{"name":"store","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[47,1],"end":[47,142],"bytes":[953,1094]}},{"name":"dbc","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[47,1],"end":[47,142],"bytes":[953,1094]}},{"name":"existing","type":"[]*github.com/benbjohnson/litestream.DB","span":{"start":[47,1],"end":[47,142],"bytes":[953,1094]}}],"return_type":"(*github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"49:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@49:15","span":{"start":[49,15],"end":[49,53],"bytes":[1126,1164]},"callee":"can://litestream/litestream/@external/errors/New"},"52:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@52:15","span":{"start":[52,15],"end":[52,43],"bytes":[1201,1229]},"callee":"can://litestream/litestream/@external/errors/New"},"55:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@55:18","span":{"start":[55,18],"end":[55,33],"bytes":[1251,1266]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"60:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@60:15","span":{"start":[60,15],"end":[60,31],"bytes":[1320,1336]},"callee":"can://litestream/litestream/@external/os/Stat"},"64:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@64:18","span":{"start":[64,18],"end":[64,39],"bytes":[1390,1411]},"callee":null},"69:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@69:24","span":{"start":[69,24],"end":[69,47],"bytes":[1474,1497]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"79:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@79:18","span":{"start":[79,18],"end":[79,43],"bytes":[1755,1780]},"callee":"can://litestream/litestream/@external/log/slog/With"},"80:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@80:18","span":{"start":[80,18],"end":[80,49],"bytes":[1799,1830]},"callee":null},"81:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@81:18","span":{"start":[81,18],"end":[81,43],"bytes":[1849,1874]},"callee":null},"82:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@82:18","span":{"start":[82,18],"end":[82,46],"bytes":[1893,1921]},"callee":null},"86:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@86:10","span":{"start":[86,10],"end":[86,19],"bytes":[1967,1976]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"89:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@89:12","span":{"start":[89,12],"end":[89,34],"bytes":[1998,2020]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches"},"90:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@90:3","span":{"start":[90,3],"end":[90,18],"bytes":[2037,2052]},"callee":null},"91:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@91:3","span":{"start":[91,3],"end":[91,11],"bytes":[2055,2063]},"callee":null},"95:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@95:2","span":{"start":[95,2],"end":[95,30],"bytes":[2087,2115]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory"},"97:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@97:2","span":{"start":[97,2],"end":[97,14],"bytes":[2118,2130]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"98:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor@98:5","span":{"start":[98,5],"end":[98,13],"bytes":[2135,2143]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","is_goroutine":true}}}},"content_hash":"4ce58f90eab9eeb776b3513c62283d921b77d2c3b830358b012af2d7e7ac2f36"},"cmd/litestream/info.go":{"id":"can://litestream/litestream/go/cmd/litestream/info.go","kind":"module","span":{"start":[1,1],"end":[113,1],"bytes":[0,2888]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// InfoCommand represents the command to show daemon information.\ntype InfoCommand struct{}\n\n// Run executes the info command.\nfunc (c *InfoCommand) Run(_ context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-info\", flag.ContinueOnError)\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\ttimeout := fs.Int(\"timeout\", 10, \"timeout in seconds\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() \u003e 0 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\tresp, err := client.Get(\"http://localhost/info\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"info failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"info failed: %s\", string(body))\n\t}\n\n\tvar result litestream.InfoResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t} else {\n\t\tuptime := time.Duration(result.UptimeSeconds) * time.Second\n\t\tfmt.Printf(\"Litestream %s\\n\", result.Version)\n\t\tfmt.Printf(\" PID: %d\\n\", result.PID)\n\t\tfmt.Printf(\" Uptime: %s\\n\", uptime)\n\t\tfmt.Printf(\" Started at: %s\\n\", result.StartedAt.Format(time.RFC3339))\n\t\tfmt.Printf(\" Databases: %d\\n\", result.DatabaseCount)\n\t}\n\n\treturn nil\n}\n\n// Usage prints the help text for the info command.\nfunc (c *InfoCommand) Usage() {\n\tfmt.Println(`\nusage: litestream info [OPTIONS]\n\nShow daemon information from a running Litestream instance.\n\nOptions:\n -json\n Output raw JSON instead of human-readable text.\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -timeout SECONDS\n Maximum time to wait in seconds (default: 10).\n\nExamples:\n $ litestream info\n $ litestream info -json\n $ litestream info -socket /tmp/litestream.sock\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"net","path":"net","span":{"start":[9,1],"end":[9,7],"bytes":[72,78]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[79,90]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[91,98]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[13,1],"end":[13,37],"bytes":[100,136]}}],"types":{"InfoCommand":{"id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand","kind":"struct","span":{"start":[17,1],"end":[17,26],"bytes":[206,231]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","kind":"method","span":{"start":[20,1],"end":[88,2],"bytes":[267,2351]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","parameters":[{"name":"_","type":"context.Context","span":{"start":[20,1],"end":[20,68],"bytes":[267,334]}},{"name":"args","type":"[]string","span":{"start":[20,1],"end":[20,68],"bytes":[267,334]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"21:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@21:8","span":{"start":[21,8],"end":[21,64],"bytes":[342,398]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"22:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@22:16","span":{"start":[22,16],"end":[22,86],"bytes":[414,484]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"23:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@23:13","span":{"start":[23,13],"end":[23,56],"bytes":[497,540]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Int"},"24:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@24:16","span":{"start":[24,16],"end":[24,57],"bytes":[556,597]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"26:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@26:12","span":{"start":[26,12],"end":[26,26],"bytes":[629,643]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"30:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@30:5","span":{"start":[30,5],"end":[30,14],"bytes":[679,688]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"31:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@31:10","span":{"start":[31,10],"end":[31,42],"bytes":[704,736]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"35:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@35:10","span":{"start":[35,10],"end":[35,54],"bytes":[770,814]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"38:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@38:19","span":{"start":[38,19],"end":[38,42],"bytes":[837,860]},"callee":null},"48:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@48:15","span":{"start":[48,15],"end":[48,50],"bytes":[1121,1156]},"callee":"can://litestream/litestream/@external/net/http/Client.Get"},"50:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@50:10","span":{"start":[50,10],"end":[50,68],"bytes":[1183,1241]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"52:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@52:8","span":{"start":[52,8],"end":[52,25],"bytes":[1252,1269]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"54:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@54:15","span":{"start":[54,15],"end":[54,36],"bytes":[1285,1306]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"56:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@56:10","span":{"start":[56,10],"end":[56,56],"bytes":[1333,1379]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"61:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@61:13","span":{"start":[61,13],"end":[61,43],"bytes":[1474,1504]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"62:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@62:11","span":{"start":[62,11],"end":[62,55],"bytes":[1552,1596]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"64:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@64:10","span":{"start":[64,10],"end":[64,53],"bytes":[1610,1653]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"64:40":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@64:40","span":{"start":[64,40],"end":[64,52],"bytes":[1640,1652]},"callee":null},"68:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@68:12","span":{"start":[68,12],"end":[68,41],"bytes":[1705,1734]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"69:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@69:10","span":{"start":[69,10],"end":[69,57],"bytes":[1758,1805]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"73:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@73:18","span":{"start":[73,18],"end":[73,54],"bytes":[1845,1881]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"75:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@75:11","span":{"start":[75,11],"end":[75,59],"bytes":[1910,1958]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"77:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@77:15","span":{"start":[77,15],"end":[77,29],"bytes":[1977,1991]},"callee":null},"77:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@77:3","span":{"start":[77,3],"end":[77,30],"bytes":[1965,1992]},"callee":"can://litestream/litestream/@external/fmt/Println"},"79:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@79:13","span":{"start":[79,13],"end":[79,48],"bytes":[2015,2050]},"callee":null},"80:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@80:3","span":{"start":[80,3],"end":[80,48],"bytes":[2067,2112]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"81:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@81:3","span":{"start":[81,3],"end":[81,47],"bytes":[2115,2159]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"82:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@82:3","span":{"start":[82,3],"end":[82,43],"bytes":[2162,2202]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"83:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@83:3","span":{"start":[83,3],"end":[83,74],"bytes":[2205,2276]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"83:36":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@83:36","span":{"start":[83,36],"end":[83,73],"bytes":[2238,2275]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"84:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run@84:3","span":{"start":[84,3],"end":[84,57],"bytes":[2279,2333]},"callee":"can://litestream/litestream/@external/fmt/Printf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run.closure_1","kind":"function","span":{"start":[42,1],"end":[44,6],"bytes":[956,1097]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[42,1],"end":[42,73],"bytes":[956,1028]}},{"name":"_","type":"string","span":{"start":[42,1],"end":[42,73],"bytes":[956,1028]}},{"name":"_","type":"string","span":{"start":[42,1],"end":[42,73],"bytes":[956,1028]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"43:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run.closure_1@43:12","span":{"start":[43,12],"end":[43,63],"bytes":[1040,1091]},"callee":"can://litestream/litestream/@external/net/DialTimeout"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Usage","kind":"method","span":{"start":[91,1],"end":[112,2],"bytes":[2405,2887]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"92:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Usage@92:2","span":{"start":[92,2],"end":[111,7],"bytes":[2438,2885]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}}},"functions":{},"content_hash":"c67f1ed730a0f301fb7642ebc95fca5357a437b59373b2e2eaf4b0acd322a2d7"},"cmd/litestream/list.go":{"id":"can://litestream/litestream/go/cmd/litestream/list.go","kind":"module","span":{"start":[1,1],"end":[118,1],"bytes":[0,2872]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// ListCommand represents the command to list all managed databases.\ntype ListCommand struct{}\n\n// Run executes the list command.\nfunc (c *ListCommand) Run(_ context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-list\", flag.ContinueOnError)\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\ttimeout := fs.Int(\"timeout\", 10, \"timeout in seconds\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() \u003e 0 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\tresp, err := client.Get(\"http://localhost/list\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"list failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"list failed: %s\", string(body))\n\t}\n\n\tvar result litestream.ListResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t} else {\n\t\tif len(result.Databases) == 0 {\n\t\t\tfmt.Println(\"No databases configured\")\n\t\t} else {\n\t\t\tfor _, db := range result.Databases {\n\t\t\t\tsyncInfo := \"never\"\n\t\t\t\tif db.LastSyncAt != nil {\n\t\t\t\t\tsyncInfo = db.LastSyncAt.Format(time.RFC3339)\n\t\t\t\t}\n\t\t\t\tfmt.Printf(\"%s [%s] (last sync: %s)\\n\", db.Path, db.Status, syncInfo)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Usage prints the help text for the list command.\nfunc (c *ListCommand) Usage() {\n\tfmt.Println(`\nusage: litestream list [OPTIONS]\n\nList all managed databases from a running daemon.\n\nOptions:\n -json\n Output raw JSON instead of human-readable text.\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -timeout SECONDS\n Maximum time to wait in seconds (default: 10).\n\nExamples:\n $ litestream list\n $ litestream list -json\n $ litestream list -socket /tmp/litestream.sock\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"net","path":"net","span":{"start":[9,1],"end":[9,7],"bytes":[72,78]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[79,90]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[91,98]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[13,1],"end":[13,37],"bytes":[100,136]}}],"types":{"ListCommand":{"id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand","kind":"struct","span":{"start":[17,1],"end":[17,26],"bytes":[209,234]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","kind":"method","span":{"start":[20,1],"end":[93,2],"bytes":[270,2345]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","parameters":[{"name":"_","type":"context.Context","span":{"start":[20,1],"end":[20,68],"bytes":[270,337]}},{"name":"args","type":"[]string","span":{"start":[20,1],"end":[20,68],"bytes":[270,337]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":14},"body":{"21:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@21:8","span":{"start":[21,8],"end":[21,64],"bytes":[345,401]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"22:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@22:16","span":{"start":[22,16],"end":[22,86],"bytes":[417,487]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"23:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@23:13","span":{"start":[23,13],"end":[23,56],"bytes":[500,543]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Int"},"24:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@24:16","span":{"start":[24,16],"end":[24,57],"bytes":[559,600]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"26:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@26:12","span":{"start":[26,12],"end":[26,26],"bytes":[632,646]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"30:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@30:5","span":{"start":[30,5],"end":[30,14],"bytes":[682,691]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"31:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@31:10","span":{"start":[31,10],"end":[31,42],"bytes":[707,739]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"35:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@35:10","span":{"start":[35,10],"end":[35,54],"bytes":[773,817]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"38:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@38:19","span":{"start":[38,19],"end":[38,42],"bytes":[840,863]},"callee":null},"48:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@48:15","span":{"start":[48,15],"end":[48,50],"bytes":[1124,1159]},"callee":"can://litestream/litestream/@external/net/http/Client.Get"},"50:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@50:10","span":{"start":[50,10],"end":[50,68],"bytes":[1186,1244]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"52:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@52:8","span":{"start":[52,8],"end":[52,25],"bytes":[1255,1272]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"54:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@54:15","span":{"start":[54,15],"end":[54,36],"bytes":[1288,1309]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"56:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@56:10","span":{"start":[56,10],"end":[56,56],"bytes":[1336,1382]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"61:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@61:13","span":{"start":[61,13],"end":[61,43],"bytes":[1477,1507]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"62:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@62:11","span":{"start":[62,11],"end":[62,55],"bytes":[1555,1599]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"64:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@64:10","span":{"start":[64,10],"end":[64,53],"bytes":[1613,1656]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"64:40":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@64:40","span":{"start":[64,40],"end":[64,52],"bytes":[1643,1655]},"callee":null},"68:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@68:12","span":{"start":[68,12],"end":[68,41],"bytes":[1708,1737]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"69:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@69:10","span":{"start":[69,10],"end":[69,57],"bytes":[1761,1808]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"73:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@73:18","span":{"start":[73,18],"end":[73,54],"bytes":[1848,1884]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"75:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@75:11","span":{"start":[75,11],"end":[75,59],"bytes":[1913,1961]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"77:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@77:15","span":{"start":[77,15],"end":[77,29],"bytes":[1980,1994]},"callee":null},"77:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@77:3","span":{"start":[77,3],"end":[77,30],"bytes":[1968,1995]},"callee":"can://litestream/litestream/@external/fmt/Println"},"79:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@79:6","span":{"start":[79,6],"end":[79,27],"bytes":[2011,2032]},"callee":null},"80:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@80:4","span":{"start":[80,4],"end":[80,42],"bytes":[2043,2081]},"callee":"can://litestream/litestream/@external/fmt/Println"},"85:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@85:17","span":{"start":[85,17],"end":[85,51],"bytes":[2204,2238]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"87:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run@87:5","span":{"start":[87,5],"end":[87,74],"bytes":[2249,2318]},"callee":"can://litestream/litestream/@external/fmt/Printf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run.closure_1","kind":"function","span":{"start":[42,1],"end":[44,6],"bytes":[959,1100]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[42,1],"end":[42,73],"bytes":[959,1031]}},{"name":"_","type":"string","span":{"start":[42,1],"end":[42,73],"bytes":[959,1031]}},{"name":"_","type":"string","span":{"start":[42,1],"end":[42,73],"bytes":[959,1031]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"43:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run.closure_1@43:12","span":{"start":[43,12],"end":[43,63],"bytes":[1043,1094]},"callee":"can://litestream/litestream/@external/net/DialTimeout"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Usage","kind":"method","span":{"start":[96,1],"end":[117,2],"bytes":[2399,2871]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"97:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Usage@97:2","span":{"start":[97,2],"end":[116,7],"bytes":[2432,2869]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}}},"functions":{},"content_hash":"dc9c59c70f84ba2a92cb656c5b6d52a9d74272c89b53fea8d58a1087b60d66ee"},"cmd/litestream/ltx.go":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go","kind":"module","span":{"start":[1,1],"end":[186,1],"bytes":[0,4202]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// LTXCommand represents a command to list LTX files for a database.\ntype LTXCommand struct{}\n\n// Run executes the command.\nfunc (c *LTXCommand) Run(ctx context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-ltx\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tvar level levelVar\n\tfs.Var(\u0026level, \"level\", \"compaction level (0-9 or \\\"all\\\")\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t} else if fs.NArg() == 0 || fs.Arg(0) == \"\" {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path or replica URL required\",\n\t\t\thint: \"litestream ltx /path/to/db\",\n\t\t}\n\t} else if fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tvar r *litestream.Replica\n\tif litestream.IsURL(fs.Arg(0)) {\n\t\tif *configPath != \"\" {\n\t\t\treturn fmt.Errorf(\"cannot specify a replica URL and the -config flag\")\n\t\t}\n\t\tif r, err = NewReplicaFromConfig(\u0026ReplicaConfig{URL: fs.Arg(0)}, nil); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tinternal.InitLog(os.Stdout, \"INFO\", \"text\", false)\n\t} else {\n\t\tif *configPath == \"\" {\n\t\t\t*configPath = DefaultConfigPath()\n\t\t}\n\n\t\t// Load configuration.\n\t\tconfig, err := ReadConfigFile(*configPath, !*noExpandEnv)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Lookup database from configuration file by path.\n\t\tpath, err := expand(fs.Arg(0))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdbc := config.DBConfig(path)\n\t\tif dbc == nil {\n\t\t\treturn fmt.Errorf(\"database not found in config: %s\", path)\n\t\t}\n\n\t\tdb, err := NewDBFromConfig(dbc)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t} else if db.Replica == nil {\n\t\t\treturn fmt.Errorf(\"database has no replica\")\n\t\t}\n\t\tr = db.Replica\n\t}\n\n\t// Determine which levels to iterate.\n\tvar levels []int\n\tif int(level) == levelAll {\n\t\tfor lvl := 0; lvl \u003c= litestream.SnapshotLevel; lvl++ {\n\t\t\tlevels = append(levels, lvl)\n\t\t}\n\t} else {\n\t\tlevels = []int{int(level)}\n\t}\n\n\tfiles := make([]LTXFileInfo, 0)\n\tfor _, lvl := range levels {\n\t\titr, err := r.Client.LTXFiles(ctx, lvl, 0, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor itr.Next() {\n\t\t\tinfo := itr.Item()\n\t\t\tfiles = append(files, LTXFileInfo{\n\t\t\t\tLevel: lvl,\n\t\t\t\tMinTXID: info.MinTXID.String(),\n\t\t\t\tMaxTXID: info.MaxTXID.String(),\n\t\t\t\tSize: info.Size,\n\t\t\t\tTimestamp: info.CreatedAt.Format(time.RFC3339),\n\t\t\t})\n\t\t}\n\t\tif err := itr.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(files, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tw := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)\n\tdefer w.Flush()\n\n\tfmt.Fprintln(w, \"level\\tmin_txid\\tmax_txid\\tsize\\tcreated\")\n\tfor _, file := range files {\n\t\tfmt.Fprintf(w, \"%d\\t%s\\t%s\\t%d\\t%s\\n\",\n\t\t\tfile.Level,\n\t\t\tfile.MinTXID,\n\t\t\tfile.MaxTXID,\n\t\t\tfile.Size,\n\t\t\tfile.Timestamp,\n\t\t)\n\t}\n\treturn nil\n}\n\ntype LTXFileInfo struct {\n\tLevel int `json:\"level\"`\n\tMinTXID string `json:\"min_txid\"`\n\tMaxTXID string `json:\"max_txid\"`\n\tSize int64 `json:\"size\"`\n\tTimestamp string `json:\"timestamp\"`\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *LTXCommand) Usage() {\n\tfmt.Printf(`\nThe ltx command lists all LTX files available for a database.\n\nUsage:\n\n\tlitestream ltx [arguments] DB_PATH\n\n\tlitestream ltx [arguments] REPLICA_URL\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\n\t-level LEVEL\n\t Compaction level to list (0-9 or \"all\").\n\t Defaults to 0.\n\n\t-json\n\t Output raw JSON instead of human-readable text.\n\nExamples:\n\n\t# List all LTX files for a database.\n\t$ litestream ltx /path/to/db\n\n\t# List all LTX files for replica URL.\n\t$ litestream ltx s3://mybkt/db\n\n\t# List LTX files at snapshot level (level 9).\n\t$ litestream ltx -level 9 /path/to/db\n\n\t# List LTX files across all compaction levels.\n\t$ litestream ltx -level all /path/to/db\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"tabwriter","path":"text/tabwriter","span":{"start":[9,1],"end":[9,18],"bytes":[72,89]}},{"name":"time","path":"time","span":{"start":[10,1],"end":[10,8],"bytes":[90,97]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[12,1],"end":[12,37],"bytes":[99,135]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[13,1],"end":[13,46],"bytes":[136,181]}}],"types":{"LTXCommand":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand","kind":"struct","span":{"start":[17,1],"end":[17,25],"bytes":[254,278]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","kind":"method","span":{"start":[20,1],"end":[131,2],"bytes":[309,3083]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[20,1],"end":[20,75],"bytes":[309,383]}},{"name":"args","type":"[]string","span":{"start":[20,1],"end":[20,75],"bytes":[309,383]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":22},"body":{"100:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@100:16","span":{"start":[100,16],"end":[100,51],"bytes":[2471,2506]},"callee":null},"103:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@103:13","span":{"start":[103,13],"end":[103,24],"bytes":[2530,2541]},"callee":null},"109:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@109:18","span":{"start":[109,18],"end":[109,53],"bytes":[2613,2648]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"111:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@111:11","span":{"start":[111,11],"end":[111,59],"bytes":[2677,2725]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"113:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@113:15","span":{"start":[113,15],"end":[113,29],"bytes":[2744,2758]},"callee":null},"113:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@113:3","span":{"start":[113,3],"end":[113,30],"bytes":[2732,2759]},"callee":"can://litestream/litestream/@external/fmt/Println"},"117:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@117:7","span":{"start":[117,7],"end":[117,54],"bytes":[2783,2830]},"callee":"can://litestream/litestream/@external/text/tabwriter/NewWriter"},"118:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@118:8","span":{"start":[118,8],"end":[118,17],"bytes":[2838,2847]},"callee":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","is_deferred":true},"120:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@120:2","span":{"start":[120,2],"end":[120,61],"bytes":[2850,2909]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"},"122:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@122:3","span":{"start":[122,3],"end":[128,4],"bytes":[2942,3066]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"},"21:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@21:8","span":{"start":[21,8],"end":[21,63],"bytes":[391,446]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"22:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@22:29","span":{"start":[22,29],"end":[22,51],"bytes":[475,497]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"23:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@23:16","span":{"start":[23,16],"end":[23,57],"bytes":[513,554]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"25:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@25:2","span":{"start":[25,2],"end":[25,62],"bytes":[576,636]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Var"},"27:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@27:12","span":{"start":[27,12],"end":[27,26],"bytes":[668,682]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"29:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@29:12","span":{"start":[29,12],"end":[29,21],"bytes":[721,730]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"29:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@29:30","span":{"start":[29,30],"end":[29,39],"bytes":[739,748]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"34:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@34:12","span":{"start":[34,12],"end":[34,21],"bytes":[889,898]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"35:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@35:10","span":{"start":[35,10],"end":[35,42],"bytes":[914,946]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"39:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@39:22","span":{"start":[39,22],"end":[39,31],"bytes":[999,1008]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"39:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@39:5","span":{"start":[39,5],"end":[39,32],"bytes":[982,1009]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL"},"41:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@41:11","span":{"start":[41,11],"end":[41,74],"bytes":[1047,1110]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"43:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@43:15","span":{"start":[43,15],"end":[43,72],"bytes":[1129,1186]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"},"43:56":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@43:56","span":{"start":[43,56],"end":[43,65],"bytes":[1170,1179]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"46:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@46:3","span":{"start":[46,3],"end":[46,53],"bytes":[1221,1271]},"callee":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"49:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@49:18","span":{"start":[49,18],"end":[49,37],"bytes":[1324,1343]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"53:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@53:18","span":{"start":[53,18],"end":[53,60],"bytes":[1391,1433]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"59:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@59:16","span":{"start":[59,16],"end":[59,33],"bytes":[1540,1557]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"59:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@59:23","span":{"start":[59,23],"end":[59,32],"bytes":[1547,1556]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"63:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@63:10","span":{"start":[63,10],"end":[63,31],"bytes":[1603,1624]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig"},"65:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@65:11","span":{"start":[65,11],"end":[65,63],"bytes":[1653,1705]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"68:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@68:14","span":{"start":[68,14],"end":[68,34],"bytes":[1724,1744]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"72:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@72:11","span":{"start":[72,11],"end":[72,48],"bytes":[1819,1856]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"79:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@79:5","span":{"start":[79,5],"end":[79,15],"bytes":[1943,1953]},"callee":null},"81:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@81:13","span":{"start":[81,13],"end":[81,32],"bytes":[2037,2056]},"callee":null},"84:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@84:18","span":{"start":[84,18],"end":[84,28],"bytes":[2088,2098]},"callee":null},"87:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@87:11","span":{"start":[87,11],"end":[87,33],"bytes":[2114,2136]},"callee":null},"89:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@89:15","span":{"start":[89,15],"end":[89,52],"bytes":[2181,2218]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"93:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@93:7","span":{"start":[93,7],"end":[93,17],"bytes":[2261,2271]},"callee":null},"94:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@94:12","span":{"start":[94,12],"end":[94,22],"bytes":[2285,2295]},"callee":null},"95:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@95:12","span":{"start":[95,12],"end":[101,6],"bytes":[2307,2513]},"callee":null},"97:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@97:16","span":{"start":[97,16],"end":[97,37],"bytes":[2369,2390]},"callee":null},"98:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run@98:16","span":{"start":[98,16],"end":[98,37],"bytes":[2407,2428]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage","kind":"method","span":{"start":[142,1],"end":[185,2],"bytes":[3331,4201]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"143:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage@143:2","span":{"start":[143,2],"end":[184,3],"bytes":[3363,4199]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"183:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage@183:3","span":{"start":[183,3],"end":[183,22],"bytes":[4176,4195]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}}}},"LTXFileInfo":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo","kind":"struct","span":{"start":[133,1],"end":[139,2],"bytes":[3085,3286]},"callables":{},"fields":{"Level":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/Level","kind":"field","type":"int","span":{"start":[134,1],"end":[134,33],"bytes":[3111,3143]}},"MaxTXID":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/MaxTXID","kind":"field","type":"string","span":{"start":[136,1],"end":[136,36],"bytes":[3180,3215]}},"MinTXID":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/MinTXID","kind":"field","type":"string","span":{"start":[135,1],"end":[135,36],"bytes":[3144,3179]}},"Size":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/Size","kind":"field","type":"int64","span":{"start":[137,1],"end":[137,32],"bytes":[3216,3247]}},"Timestamp":{"id":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXFileInfo/Timestamp","kind":"field","type":"string","span":{"start":[138,1],"end":[138,37],"bytes":[3248,3284]}}}}},"functions":{},"content_hash":"c867d7c1e1585c6d60a877522f63f540250d718c555f7798562841631be556b5"},"cmd/litestream/main.go":{"id":"can://litestream/litestream/go/cmd/litestream/main.go","kind":"module","span":{"start":[1,1],"end":[2209,1],"bytes":[0,65049]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"math\"\n\t\"net/url\"\n\t\"os\"\n\t\"os/user\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"runtime/debug\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/dustin/go-humanize\"\n\t\"github.com/superfly/ltx\"\n\t_ \"golang.org/x/crypto/x509roots/fallback\"\n\t\"gopkg.in/yaml.v2\"\n\t_ \"modernc.org/sqlite\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/abs\"\n\t\"github.com/benbjohnson/litestream/file\"\n\t\"github.com/benbjohnson/litestream/gs\"\n\t\"github.com/benbjohnson/litestream/internal\"\n\t\"github.com/benbjohnson/litestream/nats\"\n\t\"github.com/benbjohnson/litestream/oss\"\n\t\"github.com/benbjohnson/litestream/s3\"\n\t\"github.com/benbjohnson/litestream/sftp\"\n\t\"github.com/benbjohnson/litestream/webdav\"\n)\n\n// Version is set via -ldflags \"-X main.Version=...\" on release and Makefile\n// builds; otherwise it is resolved from embedded VCS build info at startup.\nvar Version = defaultVersion\n\nfunc init() {\n\tbi, _ := debug.ReadBuildInfo()\n\tVersion = resolveVersion(Version, bi)\n}\n\n// errStop is a terminal error for indicating program should quit.\nvar errStop = errors.New(\"stop\")\n\n// Sentinel errors for configuration validation\nvar (\n\tErrInvalidSnapshotInterval = errors.New(\"snapshot interval must be greater than 0\")\n\tErrInvalidSnapshotRetention = errors.New(\"snapshot retention must be greater than 0\")\n\tErrInvalidCompactionInterval = errors.New(\"compaction interval must be greater than 0\")\n\tErrInvalidSyncInterval = errors.New(\"sync interval must be greater than 0\")\n\tErrInvalidL0Retention = errors.New(\"l0 retention must not be negative\")\n\tErrInvalidL0RetentionCheckInterval = errors.New(\"l0 retention check interval must be greater than 0\")\n\tErrInvalidShutdownSyncTimeout = errors.New(\"shutdown-sync-timeout must be \u003e= 0\")\n\tErrInvalidShutdownSyncInterval = errors.New(\"shutdown sync interval must be greater than 0\")\n\tErrInvalidHeartbeatURL = errors.New(\"heartbeat URL must be a valid HTTP or HTTPS URL\")\n\tErrInvalidHeartbeatInterval = errors.New(\"heartbeat interval must be at least 1 minute\")\n\tErrConfigFileNotFound = errors.New(\"config file not found\")\n)\n\n// ConfigValidationError wraps a validation error with additional context\ntype ConfigValidationError struct {\n\tErr error\n\tField string\n\tValue interface{}\n}\n\nfunc (e *ConfigValidationError) Error() string {\n\tif e.Value != nil {\n\t\treturn fmt.Sprintf(\"%s: %v (got %v)\", e.Field, e.Err, e.Value)\n\t}\n\treturn fmt.Sprintf(\"%s: %v\", e.Field, e.Err)\n}\n\nfunc (e *ConfigValidationError) Unwrap() error {\n\treturn e.Err\n}\n\nfunc main() {\n\tinternal.InitLog(os.Stdout, \"INFO\", \"text\", false)\n\n\tm := NewMain()\n\tif err := m.Run(context.Background(), os.Args[1:]); errors.Is(err, errStop) {\n\t\tos.Exit(1)\n\t} else if errors.Is(err, flag.ErrHelp) {\n\t\tfor _, arg := range os.Args[1:] {\n\t\t\tif arg == \"-h\" || arg == \"-help\" || arg == \"--help\" {\n\t\t\t\tos.Exit(0)\n\t\t\t}\n\t\t}\n\t\tos.Exit(1)\n\t} else if err != nil {\n\t\t_, _ = fmt.Fprintf(os.Stderr, \"Error: %s\\n\", err)\n\t\tvar usageErr *usageError\n\t\tif errors.As(err, \u0026usageErr) \u0026\u0026 usageErr.hint != \"\" {\n\t\t\t_, _ = fmt.Fprintf(os.Stderr, \"Try: %s\\n\", usageErr.hint)\n\t\t}\n\t\tos.Exit(1)\n\t}\n}\n\ntype usageError struct {\n\tmessage string\n\thint string\n}\n\nfunc (e *usageError) Error() string {\n\treturn e.message\n}\n\n// Main represents the main program execution.\ntype Main struct{}\n\n// NewMain returns a new instance of Main.\nfunc NewMain() *Main {\n\treturn \u0026Main{}\n}\n\n// Run executes the program.\nfunc (m *Main) Run(ctx context.Context, args []string) (err error) {\n\t// Execute replication command if running as a Windows service.\n\tif isService, err := isWindowsService(); err != nil {\n\t\treturn err\n\t} else if isService {\n\t\treturn runWindowsService(ctx)\n\t}\n\n\t// Copy \"LITESTEAM\" environment credentials.\n\tapplyLitestreamEnv()\n\n\t// Extract command name.\n\tvar cmd string\n\tif len(args) \u003e 0 {\n\t\tcmd, args = args[0], args[1:]\n\t}\n\n\tswitch cmd {\n\tcase \"databases\":\n\t\treturn (\u0026DatabasesCommand{}).Run(ctx, args)\n\tcase \"replicate\":\n\t\tc := NewReplicateCommand()\n\t\tif err := c.ParseFlags(ctx, args); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Setup signal handler.\n\t\tsignalCh := signalChan()\n\n\t\t// Create done channel for interrupt during shutdown. It will be\n\t\t// closed when a second signal arrives, allowing each database's\n\t\t// retry loop to observe the interrupt.\n\t\tdone := make(chan struct{})\n\t\tc.SetDone(done)\n\n\t\tif err := c.Run(ctx); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Wait for signal to stop program.\n\t\tselect {\n\t\tcase err = \u003c-c.execCh:\n\t\t\tif c.cmd != nil {\n\t\t\t\tslog.Info(\"subprocess exited, litestream shutting down\")\n\t\t\t} else {\n\t\t\t\tslog.Info(\"replication complete, litestream shutting down\")\n\t\t\t}\n\t\tcase sig := \u003c-signalCh:\n\t\t\tslog.Info(\"signal received, litestream shutting down\", \"signal\", sig)\n\n\t\t\tif c.cmd != nil {\n\t\t\t\tslog.Info(\"sending signal to exec process\")\n\t\t\t\tif err := c.cmd.Process.Signal(sig); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"cannot signal exec process: %w\", err)\n\t\t\t\t}\n\n\t\t\t\tslog.Info(\"waiting for exec process to close\")\n\t\t\t\tif err := \u003c-c.execCh; err != nil \u0026\u0026 !strings.HasPrefix(err.Error(), \"signal:\") {\n\t\t\t\t\treturn fmt.Errorf(\"cannot wait for exec process: %w\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Listen for a second signal to close done and interrupt retry loops.\n\t\t\tgo func() {\n\t\t\t\t\u003c-signalCh\n\t\t\t\tclose(done)\n\t\t\t}()\n\t\t}\n\n\t\t// Gracefully close.\n\t\tif e := c.Close(ctx); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t\tslog.Info(\"litestream shut down\")\n\t\treturn err\n\n\tcase \"start\":\n\t\treturn (\u0026StartCommand{}).Run(ctx, args)\n\tcase \"stop\":\n\t\treturn (\u0026StopCommand{}).Run(ctx, args)\n\tcase \"register\":\n\t\treturn (\u0026RegisterCommand{}).Run(ctx, args)\n\tcase \"unregister\":\n\t\treturn (\u0026UnregisterCommand{}).Run(ctx, args)\n\tcase \"reset\":\n\t\treturn (\u0026ResetCommand{}).Run(ctx, args)\n\tcase \"restore\":\n\t\treturn (\u0026RestoreCommand{}).Run(ctx, args)\n\tcase \"status\":\n\t\treturn (\u0026StatusCommand{}).Run(ctx, args)\n\tcase \"sync\":\n\t\treturn (\u0026SyncCommand{}).Run(ctx, args)\n\tcase \"list\":\n\t\treturn (\u0026ListCommand{}).Run(ctx, args)\n\tcase \"info\":\n\t\treturn (\u0026InfoCommand{}).Run(ctx, args)\n\tcase \"version\":\n\t\treturn (\u0026VersionCommand{}).Run(ctx, args)\n\tcase \"ltx\":\n\t\treturn (\u0026LTXCommand{}).Run(ctx, args)\n\tcase \"wal\":\n\t\t// Deprecated: Keep for backward compatibility\n\t\tfmt.Fprintln(os.Stderr, \"Warning: 'wal' command is deprecated, please use 'ltx' instead\")\n\t\treturn (\u0026LTXCommand{}).Run(ctx, args)\n\tdefault:\n\t\tif cmd == \"help\" || cmd == \"-h\" || cmd == \"-help\" || cmd == \"--help\" {\n\t\t\tm.Usage()\n\t\t\treturn nil\n\t\t} else if cmd == \"\" || strings.HasPrefix(cmd, \"-\") {\n\t\t\tm.Usage()\n\t\t\treturn flag.ErrHelp\n\t\t}\n\t\treturn fmt.Errorf(\"litestream %s: unknown command\", cmd)\n\t}\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (m *Main) Usage() {\n\tfmt.Println(`\nlitestream is a tool for replicating SQLite databases.\n\nUsage:\n\n\tlitestream \u003ccommand\u003e [arguments]\n\nThe commands are:\n\n\tdatabases list databases specified in config file\n\tinfo show daemon information\n\tlist list all managed databases\n\tltx list available LTX files for a database\n\tregister register a database for replication\n\treplicate runs a server to replicate databases\n\treset reset local state for a database\n\trestore recovers database backup from a replica\n\tstart start replication for a database\n\tstatus display replication status for databases\n\tstop stop replication for a database\n\tsync force an immediate sync for a database\n\tunregister unregister a database from replication\n\tversion prints the binary version\n`[1:])\n}\n\n// Config represents a configuration file for the litestream daemon.\ntype Config struct {\n\t// Global replica settings that serve as defaults for all replicas\n\tReplicaSettings `yaml:\",inline\"`\n\n\t// Bind address for serving metrics.\n\tAddr string `yaml:\"addr\"`\n\n\t// Socket configuration for control commands.\n\tSocket litestream.SocketConfig `yaml:\"socket\"`\n\n\t// List of stages in a multi-level compaction.\n\t// Only includes L1 through the last non-snapshot level.\n\tLevels []*CompactionLevelConfig `yaml:\"levels\"`\n\n\t// Snapshot configuration\n\tSnapshot SnapshotConfig `yaml:\"snapshot\"`\n\n\t// Validation configuration\n\tValidation ValidationConfig `yaml:\"validation\"`\n\n\t// L0 retention settings\n\tL0Retention *time.Duration `yaml:\"l0-retention\"`\n\tL0RetentionCheckInterval *time.Duration `yaml:\"l0-retention-check-interval\"`\n\n\t// Verify TXID consistency at destination level after each compaction.\n\t// When enabled, logs warnings if gaps or overlaps are detected.\n\tVerifyCompaction bool `yaml:\"verify-compaction\"`\n\n\t// Retention configuration\n\tRetention RetentionConfig `yaml:\"retention\"`\n\n\t// Heartbeat settings (global defaults)\n\tHeartbeatURL string `yaml:\"heartbeat-url\"`\n\tHeartbeatInterval *time.Duration `yaml:\"heartbeat-interval\"`\n\n\t// List of databases to manage.\n\tDBs []*DBConfig `yaml:\"dbs\"`\n\n\t// Subcommand to execute during replication.\n\t// Litestream will shutdown when subcommand exits.\n\tExec string `yaml:\"exec\"`\n\n\t// Logging\n\tLogging internal.LoggingConfig `yaml:\"logging\"`\n\n\t// MCP server options\n\tMCPAddr string `yaml:\"mcp-addr\"`\n\n\t// Shutdown sync retry settings\n\tShutdownSyncTimeout *time.Duration `yaml:\"shutdown-sync-timeout\"`\n\tShutdownSyncInterval *time.Duration `yaml:\"shutdown-sync-interval\"`\n\n\t// Path to the config file\n\t// This is only used internally to pass the config path to the MCP tool\n\tConfigPath string `yaml:\"-\"`\n}\n\n// SnapshotConfig configures snapshots.\ntype SnapshotConfig struct {\n\tInterval *time.Duration `yaml:\"interval\"`\n\tRetention *time.Duration `yaml:\"retention\"`\n}\n\n// RetentionConfig configures retention enforcement behavior.\ntype RetentionConfig struct {\n\tEnabled *bool `yaml:\"enabled\"`\n}\n\n// ValidationConfig configures periodic validation checks.\ntype ValidationConfig struct {\n\tInterval *time.Duration `yaml:\"interval\"`\n}\n\n// propagateGlobalSettings copies global replica settings to individual replica configs.\nfunc (c *Config) propagateGlobalSettings() {\n\tfor _, dbc := range c.DBs {\n\t\t// Handle both old-style 'replicas' and new-style 'replica'\n\t\tif dbc.Replica != nil {\n\t\t\tdbc.Replica.SetDefaults(\u0026c.ReplicaSettings)\n\t\t}\n\t\tfor _, rc := range dbc.Replicas {\n\t\t\trc.SetDefaults(\u0026c.ReplicaSettings)\n\t\t}\n\t}\n}\n\nfunc (c *Config) applyDBSnapshotConfig(globalIntervalSet, globalRetentionSet bool) error {\n\tvar interval *time.Duration\n\tvar intervalDB string\n\tvar retention *time.Duration\n\tvar retentionDB string\n\n\tfor _, db := range c.DBs {\n\t\tdbID := db.Path\n\t\tif dbID == \"\" {\n\t\t\tdbID = db.Dir\n\t\t}\n\t\tif db.Snapshot.Interval != nil {\n\t\t\tif interval != nil \u0026\u0026 *interval != *db.Snapshot.Interval {\n\t\t\t\treturn fmt.Errorf(\"conflicting database snapshot intervals: %s has %v, %s has %v\", intervalDB, *interval, dbID, *db.Snapshot.Interval)\n\t\t\t}\n\t\t\tinterval = db.Snapshot.Interval\n\t\t\tintervalDB = dbID\n\t\t}\n\t\tif db.Snapshot.Retention != nil {\n\t\t\tif retention != nil \u0026\u0026 *retention != *db.Snapshot.Retention {\n\t\t\t\treturn fmt.Errorf(\"conflicting database snapshot retentions: %s has %v, %s has %v\", retentionDB, *retention, dbID, *db.Snapshot.Retention)\n\t\t\t}\n\t\t\tretention = db.Snapshot.Retention\n\t\t\tretentionDB = dbID\n\t\t}\n\t}\n\n\tif !globalIntervalSet \u0026\u0026 interval != nil {\n\t\tc.Snapshot.Interval = interval\n\t}\n\tif !globalRetentionSet \u0026\u0026 retention != nil {\n\t\tc.Snapshot.Retention = retention\n\t}\n\treturn nil\n}\n\n// DefaultConfig returns a new instance of Config with defaults set.\nfunc DefaultConfig() Config {\n\tdefaultSnapshotInterval := 24 * time.Hour\n\tdefaultSnapshotRetention := 24 * time.Hour\n\tdefaultL0Retention := litestream.DefaultL0Retention\n\tdefaultL0RetentionCheckInterval := litestream.DefaultL0RetentionCheckInterval\n\tdefaultShutdownSyncTimeout := litestream.DefaultShutdownSyncTimeout\n\tdefaultShutdownSyncInterval := litestream.DefaultShutdownSyncInterval\n\treturn Config{\n\t\tLevels: []*CompactionLevelConfig{\n\t\t\t{Interval: litestream.DefaultCompactionLevels[1].Interval},\n\t\t\t{Interval: litestream.DefaultCompactionLevels[2].Interval},\n\t\t\t{Interval: litestream.DefaultCompactionLevels[3].Interval},\n\t\t},\n\t\tSnapshot: SnapshotConfig{\n\t\t\tInterval: \u0026defaultSnapshotInterval,\n\t\t\tRetention: \u0026defaultSnapshotRetention,\n\t\t},\n\t\tSocket: litestream.DefaultSocketConfig(),\n\t\tL0Retention: \u0026defaultL0Retention,\n\t\tL0RetentionCheckInterval: \u0026defaultL0RetentionCheckInterval,\n\t\tShutdownSyncTimeout: \u0026defaultShutdownSyncTimeout,\n\t\tShutdownSyncInterval: \u0026defaultShutdownSyncInterval,\n\t}\n}\n\n// Validate returns an error if config contains invalid settings.\nfunc (c *Config) Validate() error {\n\t// Validate snapshot intervals\n\tif c.Snapshot.Interval != nil \u0026\u0026 *c.Snapshot.Interval \u003c= 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidSnapshotInterval,\n\t\t\tField: \"snapshot.interval\",\n\t\t\tValue: *c.Snapshot.Interval,\n\t\t}\n\t}\n\tif c.Snapshot.Retention != nil \u0026\u0026 *c.Snapshot.Retention \u003c= 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidSnapshotRetention,\n\t\t\tField: \"snapshot.retention\",\n\t\t\tValue: *c.Snapshot.Retention,\n\t\t}\n\t}\n\tif c.L0Retention != nil \u0026\u0026 *c.L0Retention \u003c 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidL0Retention,\n\t\t\tField: \"l0-retention\",\n\t\t\tValue: *c.L0Retention,\n\t\t}\n\t}\n\tif c.L0RetentionCheckInterval != nil \u0026\u0026 *c.L0RetentionCheckInterval \u003c= 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidL0RetentionCheckInterval,\n\t\t\tField: \"l0-retention-check-interval\",\n\t\t\tValue: *c.L0RetentionCheckInterval,\n\t\t}\n\t}\n\tif c.ShutdownSyncTimeout != nil \u0026\u0026 *c.ShutdownSyncTimeout \u003c 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidShutdownSyncTimeout,\n\t\t\tField: \"shutdown-sync-timeout\",\n\t\t\tValue: *c.ShutdownSyncTimeout,\n\t\t}\n\t}\n\tif c.ShutdownSyncInterval != nil \u0026\u0026 *c.ShutdownSyncInterval \u003c= 0 {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidShutdownSyncInterval,\n\t\t\tField: \"shutdown-sync-interval\",\n\t\t\tValue: *c.ShutdownSyncInterval,\n\t\t}\n\t}\n\n\t// Validate global heartbeat settings\n\tif c.HeartbeatURL != \"\" \u0026\u0026 !isValidHeartbeatURL(c.HeartbeatURL) {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidHeartbeatURL,\n\t\t\tField: \"heartbeat-url\",\n\t\t\tValue: c.HeartbeatURL,\n\t\t}\n\t}\n\tif c.HeartbeatInterval != nil \u0026\u0026 *c.HeartbeatInterval \u003c litestream.MinHeartbeatInterval {\n\t\treturn \u0026ConfigValidationError{\n\t\t\tErr: ErrInvalidHeartbeatInterval,\n\t\t\tField: \"heartbeat-interval\",\n\t\t\tValue: *c.HeartbeatInterval,\n\t\t}\n\t}\n\n\t// Validate compaction level intervals\n\tfor i, level := range c.Levels {\n\t\tif level.Interval \u003c= 0 {\n\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\tErr: ErrInvalidCompactionInterval,\n\t\t\t\tField: fmt.Sprintf(\"levels[%d].interval\", i),\n\t\t\t\tValue: level.Interval,\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate database configs\n\tseenPaths := make(map[string]int) // cleaned path -\u003e 1-based config index\n\tfor idx, db := range c.DBs {\n\t\t// Validate that either path or dir is specified, but not both\n\t\tif db.Path != \"\" \u0026\u0026 db.Dir != \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: cannot specify both 'path' and 'dir'\", idx+1)\n\t\t}\n\t\tif db.Path == \"\" \u0026\u0026 db.Dir == \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: must specify either 'path' or 'dir'\", idx+1)\n\t\t}\n\n\t\t// Reject the same database path listed twice. The metadata directory is\n\t\t// derived from the path, so two entries would share it and race on the\n\t\t// same LTX temp files.\n\t\tif db.Path != \"\" {\n\t\t\tkey := filepath.Clean(db.Path)\n\t\t\tif first, ok := seenPaths[key]; ok {\n\t\t\t\treturn fmt.Errorf(\"database config #%d: duplicate path %q (already used by database config #%d); each database can be listed only once\", idx+1, db.Path, first)\n\t\t\t}\n\t\t\tseenPaths[key] = idx + 1\n\t\t}\n\n\t\t// When using dir, pattern must be specified\n\t\tif db.Dir != \"\" \u0026\u0026 db.Pattern == \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: 'pattern' is required when using 'dir'\", idx+1)\n\t\t}\n\t\tif db.Watch \u0026\u0026 db.Dir == \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: 'watch' can only be enabled with a directory\", idx+1)\n\t\t}\n\t\tif db.MetaDir != nil \u0026\u0026 db.Dir == \"\" {\n\t\t\treturn fmt.Errorf(\"database config #%d: 'meta-dir' can only be used with a directory\", idx+1)\n\t\t}\n\t\tif db.MetaPath != nil \u0026\u0026 db.MetaDir != nil {\n\t\t\treturn fmt.Errorf(\"database config #%d: cannot specify both 'meta-path' and 'meta-dir'\", idx+1)\n\t\t}\n\n\t\t// Use path or dir for identifying the config in error messages\n\t\tdbIdentifier := db.Path\n\t\tif dbIdentifier == \"\" {\n\t\t\tdbIdentifier = db.Dir\n\t\t}\n\n\t\tif db.Snapshot.Interval != nil \u0026\u0026 *db.Snapshot.Interval \u003c= 0 {\n\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\tErr: ErrInvalidSnapshotInterval,\n\t\t\t\tField: fmt.Sprintf(\"dbs[%s].snapshot.interval\", dbIdentifier),\n\t\t\t\tValue: *db.Snapshot.Interval,\n\t\t\t}\n\t\t}\n\t\tif db.Snapshot.Retention != nil \u0026\u0026 *db.Snapshot.Retention \u003c= 0 {\n\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\tErr: ErrInvalidSnapshotRetention,\n\t\t\t\tField: fmt.Sprintf(\"dbs[%s].snapshot.retention\", dbIdentifier),\n\t\t\t\tValue: *db.Snapshot.Retention,\n\t\t\t}\n\t\t}\n\n\t\t// Validate sync intervals for replicas\n\t\tif db.Replica != nil \u0026\u0026 db.Replica.SyncInterval != nil \u0026\u0026 *db.Replica.SyncInterval \u003c= 0 {\n\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\tErr: ErrInvalidSyncInterval,\n\t\t\t\tField: fmt.Sprintf(\"dbs[%s].replica.sync-interval\", dbIdentifier),\n\t\t\t\tValue: *db.Replica.SyncInterval,\n\t\t\t}\n\t\t}\n\t\tfor i, replica := range db.Replicas {\n\t\t\tif replica.SyncInterval != nil \u0026\u0026 *replica.SyncInterval \u003c= 0 {\n\t\t\t\treturn \u0026ConfigValidationError{\n\t\t\t\t\tErr: ErrInvalidSyncInterval,\n\t\t\t\t\tField: fmt.Sprintf(\"dbs[%s].replicas[%d].sync-interval\", dbIdentifier, i),\n\t\t\t\t\tValue: *replica.SyncInterval,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// CompactionLevels returns a full list of compaction levels include L0.\nfunc (c *Config) CompactionLevels() litestream.CompactionLevels {\n\tlevels := litestream.CompactionLevels{\n\t\t{Level: 0},\n\t}\n\n\tfor i, lvl := range c.Levels {\n\t\tlevels = append(levels, \u0026litestream.CompactionLevel{\n\t\t\tLevel: i + 1,\n\t\t\tInterval: lvl.Interval,\n\t\t})\n\t}\n\n\treturn levels\n}\n\n// DBConfig returns database configuration by path.\nfunc (c *Config) DBConfig(configPath string) *DBConfig {\n\tfor _, dbConfig := range c.DBs {\n\t\tif dbConfig.Path == configPath {\n\t\t\treturn dbConfig\n\t\t}\n\t}\n\treturn nil\n}\n\n// OpenConfigFile opens a configuration file and returns a reader.\n// Expands the filename path if needed.\nfunc OpenConfigFile(filename string) (io.ReadCloser, error) {\n\t// Expand filename, if necessary.\n\tfilename, err := expand(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Open configuration file.\n\tf, err := os.Open(filename)\n\tif os.IsNotExist(err) {\n\t\treturn nil, fmt.Errorf(\"%w: %s\", ErrConfigFileNotFound, filename)\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn f, nil\n}\n\n// ReadConfigFile unmarshals config from filename. Expands path if needed.\n// If expandEnv is true then environment variables are expanded in the config.\nfunc ReadConfigFile(filename string, expandEnv bool) (Config, error) {\n\tf, err := OpenConfigFile(filename)\n\tif err != nil {\n\t\treturn DefaultConfig(), err\n\t}\n\tdefer f.Close()\n\n\treturn ParseConfig(f, expandEnv)\n}\n\n// ParseConfig unmarshals config from a reader.\n// If expandEnv is true then environment variables are expanded in the config.\nfunc ParseConfig(r io.Reader, expandEnv bool) (_ Config, err error) {\n\tconfig := DefaultConfig()\n\n\t// Read configuration.\n\tbuf, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn config, err\n\t}\n\n\t// Expand environment variables, if enabled.\n\tif expandEnv {\n\t\tbuf = []byte(os.Expand(string(buf), func(key string) string {\n\t\t\tif key == \"PID\" {\n\t\t\t\treturn strconv.Itoa(os.Getpid())\n\t\t\t}\n\t\t\treturn os.Getenv(key)\n\t\t}))\n\t}\n\n\tvar raw struct {\n\t\tSnapshot *SnapshotConfig `yaml:\"snapshot\"`\n\t}\n\tif err := yaml.Unmarshal(buf, \u0026raw); err != nil {\n\t\treturn config, err\n\t}\n\tglobalSnapshotIntervalSet := raw.Snapshot != nil \u0026\u0026 raw.Snapshot.Interval != nil\n\tglobalSnapshotRetentionSet := raw.Snapshot != nil \u0026\u0026 raw.Snapshot.Retention != nil\n\n\t// Save defaults before unmarshaling\n\tdefaultSnapshotInterval := config.Snapshot.Interval\n\tdefaultSnapshotRetention := config.Snapshot.Retention\n\tdefaultL0Retention := config.L0Retention\n\tdefaultL0RetentionCheckInterval := config.L0RetentionCheckInterval\n\n\tif err := yaml.Unmarshal(buf, \u0026config); err != nil {\n\t\treturn config, err\n\t}\n\n\t// Restore defaults if they were overwritten with nil by empty YAML sections\n\tif config.Snapshot.Interval == nil {\n\t\tconfig.Snapshot.Interval = defaultSnapshotInterval\n\t}\n\tif config.Snapshot.Retention == nil {\n\t\tconfig.Snapshot.Retention = defaultSnapshotRetention\n\t}\n\tif config.L0Retention == nil {\n\t\tconfig.L0Retention = defaultL0Retention\n\t}\n\tif config.L0RetentionCheckInterval == nil {\n\t\tconfig.L0RetentionCheckInterval = defaultL0RetentionCheckInterval\n\t}\n\tif err := config.applyDBSnapshotConfig(globalSnapshotIntervalSet, globalSnapshotRetentionSet); err != nil {\n\t\treturn config, err\n\t}\n\n\t// Normalize paths.\n\tfor _, dbConfig := range config.DBs {\n\t\tif dbConfig.Path == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif dbConfig.Path, err = expand(dbConfig.Path); err != nil {\n\t\t\treturn config, err\n\t\t}\n\t}\n\n\t// Propagate settings from global config to individual configs.\n\tconfig.propagateGlobalSettings()\n\n\t// Validate configuration\n\tif err := config.Validate(); err != nil {\n\t\treturn config, err\n\t}\n\n\t// Configure logging.\n\tlogOutput := os.Stdout\n\tif config.Logging.Stderr {\n\t\tlogOutput = os.Stderr\n\t}\n\tif v := os.Getenv(\"LOG_LEVEL\"); v != \"\" {\n\t\tconfig.Logging.Level = v\n\t}\n\tinternal.InitLog(logOutput, config.Logging.Level, config.Logging.Type, config.Logging.Source)\n\n\treturn config, nil\n}\n\n// CompactionLevelConfig the configuration for a single level of compaction.\ntype CompactionLevelConfig struct {\n\tInterval time.Duration `yaml:\"interval\"`\n}\n\n// DBConfig represents the configuration for a single database or directory of databases.\ntype DBConfig struct {\n\tPath string `yaml:\"path\"`\n\tDir string `yaml:\"dir\"` // Directory to scan for databases\n\tPattern string `yaml:\"pattern\"` // File pattern to match (e.g., \"*.db\", \"*.sqlite\")\n\tRecursive bool `yaml:\"recursive\"` // Scan subdirectories recursively\n\tWatch bool `yaml:\"watch\"` // Enable directory monitoring for changes\n\tSnapshot SnapshotConfig `yaml:\"snapshot\"`\n\tMetaPath *string `yaml:\"meta-path\"`\n\tMetaDir *string `yaml:\"meta-dir\"`\n\tMonitorInterval *time.Duration `yaml:\"monitor-interval\"`\n\tCheckpointInterval *time.Duration `yaml:\"checkpoint-interval\"`\n\tBusyTimeout *time.Duration `yaml:\"busy-timeout\"`\n\tMinCheckpointPageN *int `yaml:\"min-checkpoint-page-count\"`\n\tTruncatePageN *int `yaml:\"truncate-page-n\"`\n\tMaxSyncWALBytes *int64 `yaml:\"max-sync-wal-bytes\"`\n\n\tRestoreIfDBNotExists bool `yaml:\"restore-if-db-not-exists\"`\n\n\tReplica *ReplicaConfig `yaml:\"replica\"`\n\tReplicas []*ReplicaConfig `yaml:\"replicas\"` // Deprecated\n}\n\n// NewDBFromConfig instantiates a DB based on a configuration.\nfunc NewDBFromConfig(dbc *DBConfig) (*litestream.DB, error) {\n\tif dbc.MetaDir != nil {\n\t\treturn nil, fmt.Errorf(\"'meta-dir' can only be used with a directory\")\n\t}\n\n\tconfigPath, err := expand(dbc.Path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Initialize database with given path.\n\tdb := litestream.NewDB(configPath)\n\n\t// Override default database settings if specified in configuration.\n\tif dbc.MetaPath != nil {\n\t\texpandedMetaPath, err := expand(*dbc.MetaPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to expand meta path: %w\", err)\n\t\t}\n\t\tdbc.MetaPath = \u0026expandedMetaPath\n\t\tdb.SetMetaPath(expandedMetaPath)\n\t}\n\tif dbc.MonitorInterval != nil {\n\t\tdb.MonitorInterval = *dbc.MonitorInterval\n\t}\n\tif dbc.CheckpointInterval != nil {\n\t\tdb.CheckpointInterval = *dbc.CheckpointInterval\n\t}\n\tif dbc.BusyTimeout != nil {\n\t\tdb.BusyTimeout = *dbc.BusyTimeout\n\t}\n\tif dbc.MinCheckpointPageN != nil {\n\t\tdb.MinCheckpointPageN = *dbc.MinCheckpointPageN\n\t}\n\tif dbc.TruncatePageN != nil {\n\t\tdb.TruncatePageN = *dbc.TruncatePageN\n\t}\n\tif dbc.MaxSyncWALBytes != nil {\n\t\tdb.MaxSyncWALBytes = *dbc.MaxSyncWALBytes\n\t}\n\n\t// Instantiate and attach replica.\n\t// v0.3.x and before supported multiple replicas but that was dropped to\n\t// ensure there's a single remote data authority.\n\tswitch {\n\tcase dbc.Replica == nil \u0026\u0026 len(dbc.Replicas) == 0:\n\t\treturn nil, fmt.Errorf(\"must specify replica for database\")\n\tcase dbc.Replica != nil \u0026\u0026 len(dbc.Replicas) \u003e 0:\n\t\treturn nil, fmt.Errorf(\"cannot specify 'replica' and 'replicas' on a database\")\n\tcase len(dbc.Replicas) \u003e 1:\n\t\treturn nil, fmt.Errorf(\"multiple replicas on a single database are no longer supported\")\n\t}\n\n\tvar rc *ReplicaConfig\n\tif dbc.Replica != nil {\n\t\trc = dbc.Replica\n\t} else {\n\t\trc = dbc.Replicas[0]\n\t}\n\n\tr, err := NewReplicaFromConfig(rc, db)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdb.Replica = r\n\n\treturn db, nil\n}\n\n// NewDBsFromDirectoryConfig scans a directory and creates DB instances for all SQLite databases found.\nfunc NewDBsFromDirectoryConfig(dbc *DBConfig) ([]*litestream.DB, error) {\n\tif dbc.Dir == \"\" {\n\t\treturn nil, fmt.Errorf(\"directory path is required for directory replication\")\n\t}\n\n\tif dbc.Pattern == \"\" {\n\t\treturn nil, fmt.Errorf(\"pattern is required for directory replication\")\n\t}\n\tif dbc.MetaPath != nil \u0026\u0026 dbc.MetaDir != nil {\n\t\treturn nil, fmt.Errorf(\"cannot specify both 'meta-path' and 'meta-dir'\")\n\t}\n\n\tdirPath, err := expand(dbc.Dir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Find all SQLite databases in the directory\n\tdbPaths, err := FindSQLiteDatabases(dirPath, dbc.Pattern, dbc.Recursive)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to scan directory %s: %w\", dirPath, err)\n\t}\n\n\tif len(dbPaths) == 0 \u0026\u0026 !dbc.Watch {\n\t\treturn nil, fmt.Errorf(\"no SQLite databases found in directory %s with pattern %s\", dirPath, dbc.Pattern)\n\t}\n\n\t// Create DB instances for each found database\n\tvar dbs []*litestream.DB\n\tmetaPaths := make(map[string]string)\n\n\tfor _, dbPath := range dbPaths {\n\t\tdb, err := newDBFromDirectoryEntry(dbc, dirPath, dbPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create DB for %s: %w\", dbPath, err)\n\t\t}\n\n\t\t// Validate unique meta-path to prevent replication state corruption\n\t\tif mp := db.MetaPath(); mp != \"\" {\n\t\t\tif existingDB, exists := metaPaths[mp]; exists {\n\t\t\t\treturn nil, fmt.Errorf(\"meta-path collision: databases %s and %s would share meta-path %s, causing replication state corruption\", existingDB, dbPath, mp)\n\t\t\t}\n\t\t\tmetaPaths[mp] = dbPath\n\t\t}\n\n\t\tdbs = append(dbs, db)\n\t}\n\n\treturn dbs, nil\n}\n\n// newDBFromDirectoryEntry creates a DB instance for a database discovered via directory replication.\nfunc newDBFromDirectoryEntry(dbc *DBConfig, dirPath, dbPath string) (*litestream.DB, error) {\n\t// Calculate relative path from directory root\n\trelPath, err := filepath.Rel(dirPath, dbPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to calculate relative path for %s: %w\", dbPath, err)\n\t}\n\n\t// Create a copy of the config for the discovered database\n\tdbConfigCopy := *dbc\n\tdbConfigCopy.Path = dbPath\n\tdbConfigCopy.Dir = \"\" // Clear dir field for individual DB\n\tdbConfigCopy.Pattern = \"\" // Clear pattern field\n\tdbConfigCopy.Recursive = false // Clear recursive flag\n\tdbConfigCopy.Watch = false // Individual DBs do not watch directories\n\n\t// Ensure every database discovered beneath a directory receives a unique\n\t// metadata path. Without this, all databases share the same meta-path and\n\t// clobber each other's replication state.\n\tswitch {\n\tcase dbc.MetaDir != nil:\n\t\tbaseMetaDir, err := expand(*dbc.MetaDir)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to expand meta dir for %s: %w\", dbPath, err)\n\t\t}\n\t\tmetaPathCopy := filepath.Join(baseMetaDir, relPath+litestream.MetaDirSuffix)\n\t\tdbConfigCopy.MetaPath = \u0026metaPathCopy\n\t\tdbConfigCopy.MetaDir = nil\n\tcase dbc.MetaPath != nil:\n\t\tbaseMetaPath, err := expand(*dbc.MetaPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to expand meta path for %s: %w\", dbPath, err)\n\t\t}\n\t\tmetaPathCopy := deriveMetaPathForDirectoryEntry(baseMetaPath, relPath)\n\t\tdbConfigCopy.MetaPath = \u0026metaPathCopy\n\t\tdbConfigCopy.MetaDir = nil\n\t}\n\n\t// Deep copy replica config and make path unique per database.\n\t// This prevents all databases from writing to the same replica path.\n\tif dbc.Replica != nil {\n\t\treplicaCopy, err := cloneReplicaConfigWithRelativePath(dbc.Replica, relPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to configure replica for %s: %w\", dbPath, err)\n\t\t}\n\t\tdbConfigCopy.Replica = replicaCopy\n\t}\n\n\t// Also handle deprecated 'replicas' array field.\n\tif len(dbc.Replicas) \u003e 0 {\n\t\tdbConfigCopy.Replicas = make([]*ReplicaConfig, len(dbc.Replicas))\n\t\tfor i, replica := range dbc.Replicas {\n\t\t\treplicaCopy, err := cloneReplicaConfigWithRelativePath(replica, relPath)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"failed to configure replica %d for %s: %w\", i, dbPath, err)\n\t\t\t}\n\t\t\tdbConfigCopy.Replicas[i] = replicaCopy\n\t\t}\n\t}\n\n\treturn NewDBFromConfig(\u0026dbConfigCopy)\n}\n\n// cloneReplicaConfigWithRelativePath returns a copy of the replica configuration with the\n// database-relative path appended to either the replica path or URL, depending on how the\n// replica was configured.\nfunc cloneReplicaConfigWithRelativePath(base *ReplicaConfig, relPath string) (*ReplicaConfig, error) {\n\tif base == nil {\n\t\treturn nil, nil\n\t}\n\n\treplicaCopy := *base\n\trelPath = filepath.ToSlash(relPath)\n\tif relPath == \"\" || relPath == \".\" {\n\t\treturn \u0026replicaCopy, nil\n\t}\n\n\tif replicaCopy.URL != \"\" {\n\t\tu, err := url.Parse(replicaCopy.URL)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"parse replica url: %w\", err)\n\t\t}\n\t\tappendRelativePathToURL(u, relPath)\n\t\treplicaCopy.URL = u.String()\n\t\treturn \u0026replicaCopy, nil\n\t}\n\n\tswitch base.ReplicaType() {\n\tcase \"file\":\n\t\trelOSPath := filepath.FromSlash(relPath)\n\t\tif replicaCopy.Path != \"\" {\n\t\t\treplicaCopy.Path = filepath.Join(replicaCopy.Path, relOSPath)\n\t\t} else {\n\t\t\treplicaCopy.Path = relOSPath\n\t\t}\n\tdefault:\n\t\t// Normalize to forward slashes for cloud/object storage backends.\n\t\tbasePath := filepath.ToSlash(replicaCopy.Path)\n\t\tif basePath != \"\" {\n\t\t\treplicaCopy.Path = path.Join(basePath, relPath)\n\t\t} else {\n\t\t\treplicaCopy.Path = relPath\n\t\t}\n\t}\n\n\treturn \u0026replicaCopy, nil\n}\n\n// deriveMetaPathForDirectoryEntry returns a unique metadata directory for a\n// database discovered through directory replication by appending the database's\n// relative path and the standard Litestream suffix to the configured base path.\nfunc deriveMetaPathForDirectoryEntry(basePath, relPath string) string {\n\trelPath = filepath.Clean(relPath)\n\tif relPath == \".\" || relPath == \"\" {\n\t\treturn basePath\n\t}\n\n\trelDir, relFile := filepath.Split(relPath)\n\tif relFile == \"\" || relFile == \".\" {\n\t\treturn filepath.Join(basePath, relPath)\n\t}\n\n\tmetaDirName := \".\" + relFile + litestream.MetaDirSuffix\n\treturn filepath.Join(basePath, relDir, metaDirName)\n}\n\n// appendRelativePathToURL appends relPath to the URL's path component, ensuring\n// the result remains rooted and uses forward slashes.\nfunc appendRelativePathToURL(u *url.URL, relPath string) {\n\tcleanRel := strings.TrimPrefix(relPath, \"/\")\n\tif cleanRel == \"\" || cleanRel == \".\" {\n\t\treturn\n\t}\n\n\tbasePath := u.Path\n\tvar joined string\n\tif basePath == \"\" {\n\t\tjoined = cleanRel\n\t} else {\n\t\tjoined = path.Join(basePath, cleanRel)\n\t}\n\n\tjoined = \"/\" + strings.TrimPrefix(joined, \"/\")\n\tu.Path = joined\n}\n\n// FindSQLiteDatabases recursively finds all SQLite database files in a directory.\n// Exported for testing.\nfunc FindSQLiteDatabases(dir string, pattern string, recursive bool) ([]string, error) {\n\tvar dbPaths []string\n\n\terr := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Skip directories unless recursive\n\t\tif info.IsDir() {\n\t\t\tif !recursive \u0026\u0026 path != dir {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\n\t\t// Check if file matches pattern\n\t\tmatched, err := filepath.Match(pattern, filepath.Base(path))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !matched {\n\t\t\treturn nil\n\t\t}\n\n\t\t// Check if it's a SQLite database\n\t\tif IsSQLiteDatabase(path) {\n\t\t\tdbPaths = append(dbPaths, path)\n\t\t}\n\n\t\treturn nil\n\t})\n\n\treturn dbPaths, err\n}\n\n// IsSQLiteDatabase checks if a file is a SQLite database by reading its header.\n// Exported for testing.\nfunc IsSQLiteDatabase(path string) bool {\n\tfile, err := os.Open(path)\n\tif err != nil {\n\t\treturn false\n\t}\n\tdefer file.Close()\n\n\t// SQLite files start with \"SQLite format 3\\x00\"\n\theader := make([]byte, 16)\n\tif _, err := file.Read(header); err != nil {\n\t\treturn false\n\t}\n\n\treturn string(header) == \"SQLite format 3\\x00\"\n}\n\n// ByteSize is a custom type for parsing byte sizes from YAML.\n// It supports both SI units (KB, MB, GB using base 1000) and IEC units\n// (KiB, MiB, GiB using base 1024) as well as short forms (K, M, G).\ntype ByteSize int64\n\n// UnmarshalYAML implements yaml.Unmarshaler for ByteSize.\nfunc (b *ByteSize) UnmarshalYAML(unmarshal func(interface{}) error) error {\n\tvar s string\n\tif err := unmarshal(\u0026s); err != nil {\n\t\treturn err\n\t}\n\n\tsize, err := ParseByteSize(s)\n\tif err != nil {\n\t\treturn err\n\t}\n\t*b = ByteSize(size)\n\treturn nil\n}\n\n// ParseByteSize parses a byte size string using github.com/dustin/go-humanize.\n// Supports both SI units (KB=1000, MB=1000², etc.) and IEC units (KiB=1024, MiB=1024², etc.).\n// Examples: \"1MB\", \"5MiB\", \"1.5GB\", \"100B\", \"1024KB\"\nfunc ParseByteSize(s string) (int64, error) {\n\ts = strings.TrimSpace(s)\n\tif s == \"\" {\n\t\treturn 0, fmt.Errorf(\"empty size string\")\n\t}\n\n\t// Use go-humanize to parse the byte size string\n\tbytes, err := humanize.ParseBytes(s)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"invalid size format: %w\", err)\n\t}\n\n\t// Check that the value fits in int64\n\tif bytes \u003e math.MaxInt64 {\n\t\treturn 0, fmt.Errorf(\"size %d exceeds maximum allowed value (%d)\", bytes, int64(math.MaxInt64))\n\t}\n\n\treturn int64(bytes), nil\n}\n\n// ReplicaSettings contains settings shared across replica configurations.\n// These can be set globally in Config or per-replica in ReplicaConfig.\ntype ReplicaSettings struct {\n\tSyncInterval *time.Duration `yaml:\"sync-interval\"`\n\tValidationInterval *time.Duration `yaml:\"validation-interval\"`\n\n\t// Maximum L0 files to upload in a single monitor sync run.\n\t// Set to zero to process all pending L0 files in one run.\n\tMaxSyncLTXFiles *int `yaml:\"max-sync-ltx-files\"`\n\n\t// If true, automatically reset local state when LTX errors are detected.\n\t// This allows recovery from corrupted/missing LTX files by forcing a fresh sync.\n\t// Disabled by default to prevent silent data loss scenarios.\n\tAutoRecover *bool `yaml:\"auto-recover\"`\n\n\t// S3 settings\n\tAccessKeyID string `yaml:\"access-key-id\"`\n\tSecretAccessKey string `yaml:\"secret-access-key\"`\n\tRegion string `yaml:\"region\"`\n\tBucket string `yaml:\"bucket\"`\n\tEndpoint string `yaml:\"endpoint\"`\n\tForcePathStyle *bool `yaml:\"force-path-style\"`\n\tSignPayload *bool `yaml:\"sign-payload\"`\n\tSignAcceptEncoding *bool `yaml:\"sign-accept-encoding\"`\n\tRequireContentMD5 *bool `yaml:\"require-content-md5\"`\n\tSkipVerify bool `yaml:\"skip-verify\"`\n\tStorageClass string `yaml:\"storage-class\"`\n\tPartSize *ByteSize `yaml:\"part-size\"`\n\tConcurrency *int `yaml:\"concurrency\"`\n\n\t// S3 Server-Side Encryption (SSE-C: Customer-provided keys)\n\tSSECustomerAlgorithm string `yaml:\"sse-customer-algorithm\"`\n\tSSECustomerKey string `yaml:\"sse-customer-key\"`\n\tSSECustomerKeyPath string `yaml:\"sse-customer-key-path\"`\n\n\t// S3 Server-Side Encryption (SSE-KMS: AWS Key Management Service)\n\tSSEKMSKeyID string `yaml:\"sse-kms-key-id\"`\n\n\t// ABS settings\n\tAccountName string `yaml:\"account-name\"`\n\tAccountKey string `yaml:\"account-key\"`\n\tSASToken string `yaml:\"sas-token\"`\n\n\t// SFTP settings\n\tHost string `yaml:\"host\"`\n\tUser string `yaml:\"user\"`\n\tPassword string `yaml:\"password\"`\n\tKeyPath string `yaml:\"key-path\"`\n\tConcurrentWrites *bool `yaml:\"concurrent-writes\"`\n\tHostKey string `yaml:\"host-key\"`\n\n\t// WebDAV settings\n\tWebDAVURL string `yaml:\"webdav-url\"`\n\tWebDAVUsername string `yaml:\"webdav-username\"`\n\tWebDAVPassword string `yaml:\"webdav-password\"`\n\n\t// NATS settings\n\tJWT string `yaml:\"jwt\"`\n\tSeed string `yaml:\"seed\"`\n\tCreds string `yaml:\"creds\"`\n\tNKey string `yaml:\"nkey\"`\n\tUsername string `yaml:\"username\"`\n\tToken string `yaml:\"token\"`\n\tTLS *bool `yaml:\"tls\"`\n\tRootCAs []string `yaml:\"root-cas\"`\n\tClientCert string `yaml:\"client-cert\"`\n\tClientKey string `yaml:\"client-key\"`\n\tMaxReconnects *int `yaml:\"max-reconnects\"`\n\tReconnectWait *time.Duration `yaml:\"reconnect-wait\"`\n\tTimeout *time.Duration `yaml:\"timeout\"`\n\n\t// Encryption identities and recipients\n\tAge struct {\n\t\tIdentities []string `yaml:\"identities\"`\n\t\tRecipients []string `yaml:\"recipients\"`\n\t} `yaml:\"age\"`\n}\n\n// SetDefaults merges default settings from src into the current ReplicaSettings.\n// Individual settings override defaults when already set.\nfunc (rs *ReplicaSettings) SetDefaults(src *ReplicaSettings) {\n\tif src == nil {\n\t\treturn\n\t}\n\n\t// Timing settings\n\tif rs.SyncInterval == nil \u0026\u0026 src.SyncInterval != nil {\n\t\trs.SyncInterval = src.SyncInterval\n\t}\n\tif rs.ValidationInterval == nil \u0026\u0026 src.ValidationInterval != nil {\n\t\trs.ValidationInterval = src.ValidationInterval\n\t}\n\tif rs.MaxSyncLTXFiles == nil \u0026\u0026 src.MaxSyncLTXFiles != nil {\n\t\trs.MaxSyncLTXFiles = src.MaxSyncLTXFiles\n\t}\n\n\t// Recovery settings\n\tif rs.AutoRecover == nil \u0026\u0026 src.AutoRecover != nil {\n\t\trs.AutoRecover = src.AutoRecover\n\t}\n\n\t// S3 settings\n\tif rs.AccessKeyID == \"\" {\n\t\trs.AccessKeyID = src.AccessKeyID\n\t}\n\tif rs.SecretAccessKey == \"\" {\n\t\trs.SecretAccessKey = src.SecretAccessKey\n\t}\n\tif rs.Region == \"\" {\n\t\trs.Region = src.Region\n\t}\n\tif rs.Bucket == \"\" {\n\t\trs.Bucket = src.Bucket\n\t}\n\tif rs.Endpoint == \"\" {\n\t\trs.Endpoint = src.Endpoint\n\t}\n\tif rs.ForcePathStyle == nil {\n\t\trs.ForcePathStyle = src.ForcePathStyle\n\t}\n\tif rs.SignPayload == nil {\n\t\trs.SignPayload = src.SignPayload\n\t}\n\tif rs.SignAcceptEncoding == nil {\n\t\trs.SignAcceptEncoding = src.SignAcceptEncoding\n\t}\n\tif rs.RequireContentMD5 == nil {\n\t\trs.RequireContentMD5 = src.RequireContentMD5\n\t}\n\tif src.SkipVerify {\n\t\trs.SkipVerify = true\n\t}\n\tif rs.StorageClass == \"\" {\n\t\trs.StorageClass = src.StorageClass\n\t}\n\n\t// S3 SSE settings\n\tif rs.SSECustomerAlgorithm == \"\" {\n\t\trs.SSECustomerAlgorithm = src.SSECustomerAlgorithm\n\t}\n\tif rs.SSECustomerKey == \"\" {\n\t\trs.SSECustomerKey = src.SSECustomerKey\n\t}\n\tif rs.SSECustomerKeyPath == \"\" {\n\t\trs.SSECustomerKeyPath = src.SSECustomerKeyPath\n\t}\n\tif rs.SSEKMSKeyID == \"\" {\n\t\trs.SSEKMSKeyID = src.SSEKMSKeyID\n\t}\n\n\t// ABS settings\n\tif rs.AccountName == \"\" {\n\t\trs.AccountName = src.AccountName\n\t}\n\tif rs.AccountKey == \"\" {\n\t\trs.AccountKey = src.AccountKey\n\t}\n\tif rs.SASToken == \"\" {\n\t\trs.SASToken = src.SASToken\n\t}\n\n\t// SFTP settings\n\tif rs.Host == \"\" {\n\t\trs.Host = src.Host\n\t}\n\tif rs.User == \"\" {\n\t\trs.User = src.User\n\t}\n\tif rs.Password == \"\" {\n\t\trs.Password = src.Password\n\t}\n\tif rs.KeyPath == \"\" {\n\t\trs.KeyPath = src.KeyPath\n\t}\n\tif rs.ConcurrentWrites == nil {\n\t\trs.ConcurrentWrites = src.ConcurrentWrites\n\t}\n\n\t// NATS settings\n\tif rs.JWT == \"\" {\n\t\trs.JWT = src.JWT\n\t}\n\tif rs.Seed == \"\" {\n\t\trs.Seed = src.Seed\n\t}\n\tif rs.Creds == \"\" {\n\t\trs.Creds = src.Creds\n\t}\n\tif rs.NKey == \"\" {\n\t\trs.NKey = src.NKey\n\t}\n\tif rs.Username == \"\" {\n\t\trs.Username = src.Username\n\t}\n\tif rs.Token == \"\" {\n\t\trs.Token = src.Token\n\t}\n\tif rs.TLS == nil {\n\t\trs.TLS = src.TLS\n\t}\n\tif len(rs.RootCAs) == 0 {\n\t\trs.RootCAs = src.RootCAs\n\t}\n\tif rs.ClientCert == \"\" {\n\t\trs.ClientCert = src.ClientCert\n\t}\n\tif rs.ClientKey == \"\" {\n\t\trs.ClientKey = src.ClientKey\n\t}\n\tif rs.MaxReconnects == nil {\n\t\trs.MaxReconnects = src.MaxReconnects\n\t}\n\tif rs.ReconnectWait == nil {\n\t\trs.ReconnectWait = src.ReconnectWait\n\t}\n\tif rs.Timeout == nil {\n\t\trs.Timeout = src.Timeout\n\t}\n\n\t// Age encryption settings\n\tif len(rs.Age.Identities) == 0 {\n\t\trs.Age.Identities = src.Age.Identities\n\t}\n\tif len(rs.Age.Recipients) == 0 {\n\t\trs.Age.Recipients = src.Age.Recipients\n\t}\n}\n\n// ReplicaConfig represents the configuration for a single replica in a database.\ntype ReplicaConfig struct {\n\tReplicaSettings `yaml:\",inline\"`\n\n\tType string `yaml:\"type\"` // \"file\", \"s3\"\n\tName string `yaml:\"name\"` // Deprecated\n\tPath string `yaml:\"path\"`\n\tURL string `yaml:\"url\"`\n}\n\n// NewReplicaFromConfig instantiates a replica for a DB based on a config.\nfunc NewReplicaFromConfig(c *ReplicaConfig, db *litestream.DB) (_ *litestream.Replica, err error) {\n\t// Ensure user did not specify URL in path.\n\tif litestream.IsURL(c.Path) {\n\t\treturn nil, fmt.Errorf(\"replica path cannot be a url, please use the 'url' field instead: %s\", c.Path)\n\t}\n\n\t// Reject age encryption configuration as it's currently non-functional.\n\t// Age encryption support was removed during the LTX storage layer refactor\n\t// and has not been reimplemented. Accepting this config would silently\n\t// write plaintext data to remote storage instead of encrypted data.\n\t// See: https://github.com/benbjohnson/litestream/issues/790\n\tif len(c.Age.Identities) \u003e 0 || len(c.Age.Recipients) \u003e 0 {\n\t\treturn nil, fmt.Errorf(\"age encryption is not currently supported, if you need encryption please revert back to Litestream v0.3.x\")\n\t}\n\n\t// Build replica.\n\tr := litestream.NewReplica(db)\n\tif v := c.SyncInterval; v != nil {\n\t\tr.SyncInterval = *v\n\t}\n\tif v := c.MaxSyncLTXFiles; v != nil {\n\t\tr.MaxSyncLTXFiles = *v\n\t}\n\tif v := c.AutoRecover; v != nil {\n\t\tr.AutoRecoverEnabled = *v\n\t}\n\n\t// Build and set client on replica.\n\tswitch c.ReplicaType() {\n\tcase \"file\":\n\t\tif r.Client, err = newFileReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"s3\":\n\t\tif r.Client, err = NewS3ReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"gs\":\n\t\tif r.Client, err = newGSReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"abs\":\n\t\tif r.Client, err = newABSReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"sftp\":\n\t\tif r.Client, err = newSFTPReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"webdav\":\n\t\tif r.Client, err = newWebDAVReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"nats\":\n\t\tif r.Client, err = newNATSReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tcase \"oss\":\n\t\tif r.Client, err = newOSSReplicaClientFromConfig(c, r); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown replica type in config: %q\", c.ReplicaType())\n\t}\n\n\tr.Client.SetLogger(r.Logger())\n\n\treturn r, nil\n}\n\n// newFileReplicaClientFromConfig returns a new instance of file.ReplicaClient built from config.\nfunc newFileReplicaClientFromConfig(c *ReplicaConfig, r *litestream.Replica) (_ *file.ReplicaClient, err error) {\n\t// Ensure URL \u0026 path are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for file replica\")\n\t}\n\n\t// Parse configPath from URL, if specified.\n\tconfigPath := c.Path\n\tif c.URL != \"\" {\n\t\tif _, _, configPath, err = litestream.ParseReplicaURL(c.URL); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Ensure path is set explicitly or derived from URL field.\n\tif configPath == \"\" {\n\t\treturn nil, fmt.Errorf(\"file replica path required\")\n\t}\n\n\t// Expand home prefix and return absolute path.\n\tif configPath, err = expand(configPath); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Instantiate replica and apply time fields, if set.\n\tclient := file.NewReplicaClient(configPath)\n\tclient.Replica = r\n\treturn client, nil\n}\n\n// NewS3ReplicaClientFromConfig returns a new instance of s3.ReplicaClient built from config.\n// Exported for testing.\nfunc NewS3ReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *s3.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for s3 replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Bucket != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 bucket for s3 replica\")\n\t}\n\n\tbucket, configPath := c.Bucket, c.Path\n\tregion, endpoint, skipVerify := c.Region, c.Endpoint, c.SkipVerify\n\tstorageClass := c.StorageClass\n\tsignSetting := newBoolSetting(true)\n\tif v := c.SignPayload; v != nil {\n\t\tsignSetting.Set(*v)\n\t}\n\tsignAcceptEncodingSetting := newBoolSetting(true)\n\tif v := c.SignAcceptEncoding; v != nil {\n\t\tsignAcceptEncodingSetting.Set(*v)\n\t}\n\trequireSetting := newBoolSetting(true)\n\tif v := c.RequireContentMD5; v != nil {\n\t\trequireSetting.Set(*v)\n\t}\n\n\t// Use path style if an endpoint is explicitly set. This works because the\n\t// only service to not use path style is AWS which does not use an endpoint.\n\tforcePathStyle := (endpoint != \"\")\n\tif v := c.ForcePathStyle; v != nil {\n\t\tforcePathStyle = *v\n\t}\n\n\t// Apply settings from URL, if specified.\n\tvar (\n\t\tendpointWasSet bool\n\t\tusignPayload bool\n\t\tusignPayloadSet bool\n\t\tusignAcceptEncoding bool\n\t\tusignAcceptEncodingSet bool\n\t\turequireContentMD5 bool\n\t\turequireContentMD5Set bool\n\t\tustorageClass string\n\t\tupartSize int64\n\t\tupartSizeSet bool\n\t\tuconcurrency int64\n\t\tuconcurrencySet bool\n\t)\n\tif endpoint != \"\" {\n\t\tendpointWasSet = true\n\t}\n\n\tif c.URL != \"\" {\n\t\t_, host, upath, query, _, err := litestream.ParseReplicaURLWithQuery(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar (\n\t\t\tubucket string\n\t\t\turegion string\n\t\t\tuendpoint string\n\t\t\tuforcePathStyle bool\n\t\t)\n\n\t\tif strings.HasPrefix(host, \"arn:\") {\n\t\t\tubucket = host\n\t\t\turegion = litestream.RegionFromS3ARN(host)\n\t\t} else {\n\t\t\tubucket, uregion, uendpoint, uforcePathStyle = s3.ParseHost(host)\n\t\t}\n\n\t\t// Override with query parameters if provided\n\t\tif qEndpoint := query.Get(\"endpoint\"); qEndpoint != \"\" {\n\t\t\t// Ensure endpoint has a scheme (defaults to https:// for cloud, http:// for local)\n\t\t\tqEndpoint, _ = litestream.EnsureEndpointScheme(qEndpoint)\n\t\t\tuendpoint = qEndpoint\n\t\t\t// Default to path style for custom endpoints unless explicitly set to false\n\t\t\tif query.Get(\"forcePathStyle\") != \"false\" {\n\t\t\t\tuforcePathStyle = true\n\t\t\t}\n\t\t\tendpointWasSet = true\n\t\t}\n\t\tif qRegion := query.Get(\"region\"); qRegion != \"\" {\n\t\t\turegion = qRegion\n\t\t}\n\t\tif qForcePathStyle := query.Get(\"forcePathStyle\"); qForcePathStyle != \"\" {\n\t\t\tuforcePathStyle = qForcePathStyle == \"true\"\n\t\t}\n\t\tif qSkipVerify := query.Get(\"skipVerify\"); qSkipVerify != \"\" {\n\t\t\tskipVerify = qSkipVerify == \"true\"\n\t\t}\n\t\tif v, ok := litestream.BoolQueryValue(query, \"signPayload\", \"sign-payload\"); ok {\n\t\t\tusignPayload = v\n\t\t\tusignPayloadSet = true\n\t\t}\n\t\tif v, ok := litestream.BoolQueryValue(query, \"signAcceptEncoding\", \"sign-accept-encoding\"); ok {\n\t\t\tusignAcceptEncoding = v\n\t\t\tusignAcceptEncodingSet = true\n\t\t}\n\t\tif v, ok := litestream.BoolQueryValue(query, \"requireContentMD5\", \"require-content-md5\"); ok {\n\t\t\turequireContentMD5 = v\n\t\t\turequireContentMD5Set = true\n\t\t}\n\t\tif v := query.Get(\"storageClass\"); v != \"\" {\n\t\t\tustorageClass = v\n\t\t} else if v := query.Get(\"storage-class\"); v != \"\" {\n\t\t\tustorageClass = v\n\t\t}\n\t\tif v, ok, err := litestream.IntQueryValue(query, \"partSize\", \"part-size\"); err != nil {\n\t\t\treturn nil, err\n\t\t} else if ok {\n\t\t\tupartSize = v\n\t\t\tupartSizeSet = true\n\t\t}\n\t\tif v, ok, err := litestream.IntQueryValue(query, \"concurrency\"); err != nil {\n\t\t\treturn nil, err\n\t\t} else if ok {\n\t\t\tuconcurrency = v\n\t\t\tuconcurrencySet = true\n\t\t}\n\n\t\t// Only apply URL parts to field that have not been overridden.\n\t\tif configPath == \"\" {\n\t\t\tconfigPath = upath\n\t\t}\n\t\tif bucket == \"\" {\n\t\t\tbucket = ubucket\n\t\t}\n\t\tif region == \"\" {\n\t\t\tregion = uregion\n\t\t}\n\t\tif endpoint == \"\" {\n\t\t\tendpoint = uendpoint\n\t\t}\n\t\tif storageClass == \"\" {\n\t\t\tstorageClass = ustorageClass\n\t\t}\n\t\tif !forcePathStyle {\n\t\t\tforcePathStyle = uforcePathStyle\n\t\t}\n\t\tif !signSetting.set \u0026\u0026 usignPayloadSet {\n\t\t\tsignSetting.Set(usignPayload)\n\t\t}\n\t\tif !signAcceptEncodingSetting.set \u0026\u0026 usignAcceptEncodingSet {\n\t\t\tsignAcceptEncodingSetting.Set(usignAcceptEncoding)\n\t\t}\n\t\tif !requireSetting.set \u0026\u0026 urequireContentMD5Set {\n\t\t\trequireSetting.Set(urequireContentMD5)\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for s3 replica\")\n\t}\n\n\t// Detect S3-compatible provider endpoints for applying appropriate defaults.\n\t// These providers require specific settings to work correctly with AWS SDK v2.\n\tisHetzner := litestream.IsHetznerEndpoint(endpoint)\n\tisTigris := litestream.IsTigrisEndpoint(endpoint)\n\tif !isTigris \u0026\u0026 !endpointWasSet \u0026\u0026 litestream.IsTigrisEndpoint(c.Endpoint) {\n\t\tisTigris = true\n\t}\n\tisDigitalOcean := litestream.IsDigitalOceanEndpoint(endpoint)\n\tisBackblaze := litestream.IsBackblazeEndpoint(endpoint)\n\tisFilebase := litestream.IsFilebaseEndpoint(endpoint)\n\tisScaleway := litestream.IsScalewayEndpoint(endpoint)\n\tisMinIO := litestream.IsMinIOEndpoint(endpoint)\n\tisCloudflareR2 := litestream.IsCloudflareR2Endpoint(endpoint)\n\tisSupabase := litestream.IsSupabaseEndpoint(endpoint)\n\n\t// Track if forcePathStyle was explicitly set by user (config or URL query param).\n\tforcePathStyleSet := c.ForcePathStyle != nil\n\n\t// Apply provider-specific defaults for S3-compatible providers.\n\t// These settings ensure compatibility with each provider's S3 implementation.\n\tif isTigris {\n\t\t// Tigris: requires signed payloads, no MD5\n\t\tsignSetting.ApplyDefault(true)\n\t\trequireSetting.ApplyDefault(false)\n\t}\n\tif isHetzner || isDigitalOcean || isBackblaze || isFilebase || isScaleway || isCloudflareR2 || isMinIO || isSupabase {\n\t\t// All these providers require signed payloads (don't support UNSIGNED-PAYLOAD)\n\t\tsignSetting.ApplyDefault(true)\n\t}\n\tif !forcePathStyleSet {\n\t\t// Filebase, Backblaze B2, MinIO, and Supabase require path-style URLs\n\t\tif isFilebase || isBackblaze || isMinIO || isSupabase {\n\t\t\tforcePathStyle = true\n\t\t}\n\t}\n\n\t// Build replica.\n\tclient := s3.NewReplicaClient()\n\tclient.AccessKeyID = c.AccessKeyID\n\tclient.SecretAccessKey = c.SecretAccessKey\n\tclient.Bucket = bucket\n\tclient.Path = configPath\n\tclient.Region = region\n\tclient.Endpoint = endpoint\n\tclient.ForcePathStyle = forcePathStyle\n\tclient.SkipVerify = skipVerify\n\tclient.StorageClass = storageClass\n\n\tclient.SignPayload = signSetting.value\n\tclient.SignAcceptEncoding = signAcceptEncodingSetting.value\n\tclient.RequireContentMD5 = requireSetting.value\n\n\tif isCloudflareR2 {\n\t\tclient.Concurrency = s3.DefaultR2Concurrency\n\t}\n\tif isTigris {\n\t\tclient.Concurrency = s3.DefaultTigrisConcurrency\n\t\tclient.PartSize = s3.DefaultTigrisPartSize\n\t}\n\n\t// Apply upload configuration from URL query, then config overrides.\n\tif upartSizeSet {\n\t\tclient.PartSize = upartSize\n\t}\n\tif uconcurrencySet {\n\t\tclient.Concurrency = int(uconcurrency)\n\t}\n\tif c.PartSize != nil {\n\t\tclient.PartSize = int64(*c.PartSize)\n\t}\n\tif c.Concurrency != nil {\n\t\tclient.Concurrency = *c.Concurrency\n\t}\n\n\t// Apply SSE-C configuration if specified.\n\tif c.SSECustomerKey != \"\" || c.SSECustomerKeyPath != \"\" {\n\t\tclient.SSECustomerAlgorithm = c.SSECustomerAlgorithm\n\t\tif client.SSECustomerAlgorithm == \"\" {\n\t\t\tclient.SSECustomerAlgorithm = \"AES256\"\n\t\t}\n\n\t\t// Read key from file if path is specified, otherwise use direct value.\n\t\tif c.SSECustomerKeyPath != \"\" {\n\t\t\tkeyPath := c.SSECustomerKeyPath\n\t\t\t// Expand ~ to home directory\n\t\t\tif strings.HasPrefix(keyPath, \"~\") {\n\t\t\t\thome, err := os.UserHomeDir()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"cannot expand home directory for sse-customer-key-path: %w\", err)\n\t\t\t\t}\n\t\t\t\tkeyPath = home + keyPath[1:]\n\t\t\t}\n\t\t\tkeyData, err := os.ReadFile(keyPath)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"cannot read sse-customer-key-path %q: %w\", c.SSECustomerKeyPath, err)\n\t\t\t}\n\t\t\tclient.SSECustomerKey = strings.TrimSpace(string(keyData))\n\t\t} else {\n\t\t\tclient.SSECustomerKey = c.SSECustomerKey\n\t\t}\n\t}\n\n\t// Apply SSE-KMS configuration if specified.\n\tif c.SSEKMSKeyID != \"\" {\n\t\tclient.SSEKMSKeyID = c.SSEKMSKeyID\n\t}\n\n\treturn client, nil\n}\n\n// newGSReplicaClientFromConfig returns a new instance of gs.ReplicaClient built from config.\nfunc newGSReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *gs.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for gs replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Bucket != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 bucket for gs replica\")\n\t}\n\n\tbucket, configPath := c.Bucket, c.Path\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\t_, uhost, upath, err := litestream.ParseReplicaURL(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Only apply URL parts to field that have not been overridden.\n\t\tif configPath == \"\" {\n\t\t\tconfigPath = upath\n\t\t}\n\t\tif bucket == \"\" {\n\t\t\tbucket = uhost\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for gs replica\")\n\t}\n\n\t// Build replica.\n\tclient := gs.NewReplicaClient()\n\tclient.Bucket = bucket\n\tclient.Path = configPath\n\treturn client, nil\n}\n\n// newABSReplicaClientFromConfig returns a new instance of abs.ReplicaClient built from config.\nfunc newABSReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *abs.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for abs replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Bucket != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 bucket for abs replica\")\n\t}\n\n\t// Build replica.\n\tclient := abs.NewReplicaClient()\n\tclient.AccountName = c.AccountName\n\tclient.AccountKey = c.AccountKey\n\tclient.SASToken = c.SASToken\n\tclient.Bucket = c.Bucket\n\tclient.Path = c.Path\n\tclient.Endpoint = c.Endpoint\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\tu, err := url.Parse(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif client.AccountName == \"\" \u0026\u0026 u.User != nil {\n\t\t\tclient.AccountName = u.User.Username()\n\t\t}\n\t\tif client.Bucket == \"\" {\n\t\t\tclient.Bucket = u.Host\n\t\t}\n\t\tif client.Path == \"\" {\n\t\t\tclient.Path = strings.TrimPrefix(path.Clean(u.Path), \"/\")\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif client.Bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for abs replica\")\n\t}\n\n\treturn client, nil\n}\n\n// newSFTPReplicaClientFromConfig returns a new instance of sftp.ReplicaClient built from config.\nfunc newSFTPReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *sftp.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for sftp replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Host != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 host for sftp replica\")\n\t}\n\n\thost, user, password, path := c.Host, c.User, c.Password, c.Path\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\tu, err := url.Parse(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Only apply URL parts to field that have not been overridden.\n\t\tif host == \"\" {\n\t\t\thost = u.Host\n\t\t}\n\t\tif user == \"\" \u0026\u0026 u.User != nil {\n\t\t\tuser = u.User.Username()\n\t\t}\n\t\tif password == \"\" \u0026\u0026 u.User != nil {\n\t\t\tpassword, _ = u.User.Password()\n\t\t}\n\t\tif path == \"\" {\n\t\t\tpath = u.Path\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif host == \"\" {\n\t\treturn nil, fmt.Errorf(\"host required for sftp replica\")\n\t} else if user == \"\" {\n\t\treturn nil, fmt.Errorf(\"user required for sftp replica\")\n\t}\n\n\t// Build replica.\n\tclient := sftp.NewReplicaClient()\n\tclient.Host = host\n\tclient.User = user\n\tclient.Password = password\n\tclient.Path = path\n\tclient.KeyPath = c.KeyPath\n\tclient.HostKey = c.HostKey\n\n\t// Set concurrent writes if specified, otherwise use default (true)\n\tif c.ConcurrentWrites != nil {\n\t\tclient.ConcurrentWrites = *c.ConcurrentWrites\n\t}\n\n\treturn client, nil\n}\n\n// newWebDAVReplicaClientFromConfig returns a new instance of webdav.ReplicaClient built from config.\nfunc newWebDAVReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *webdav.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for webdav replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.WebDAVURL != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 webdav-url for webdav replica\")\n\t}\n\n\twebdavURL, username, password, path := c.WebDAVURL, c.WebDAVUsername, c.WebDAVPassword, c.Path\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\tu, err := url.Parse(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Build WebDAV URL from scheme and host\n\t\tscheme := \"http\"\n\t\tif u.Scheme == \"webdavs\" {\n\t\t\tscheme = \"https\"\n\t\t}\n\t\tif webdavURL == \"\" \u0026\u0026 u.Host != \"\" {\n\t\t\twebdavURL = fmt.Sprintf(\"%s://%s\", scheme, u.Host)\n\t\t}\n\n\t\t// Extract credentials from URL\n\t\tif username == \"\" \u0026\u0026 u.User != nil {\n\t\t\tusername = u.User.Username()\n\t\t}\n\t\tif password == \"\" \u0026\u0026 u.User != nil {\n\t\t\tpassword, _ = u.User.Password()\n\t\t}\n\t\tif path == \"\" {\n\t\t\tpath = u.Path\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif webdavURL == \"\" {\n\t\treturn nil, fmt.Errorf(\"webdav-url required for webdav replica\")\n\t}\n\n\t// Build replica.\n\tclient := webdav.NewReplicaClient()\n\tclient.URL = webdavURL\n\tclient.Username = username\n\tclient.Password = password\n\tclient.Path = path\n\n\treturn client, nil\n}\n\n// newNATSReplicaClientFromConfig returns a new instance of nats.ReplicaClient built from config.\nfunc newNATSReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *nats.ReplicaClient, err error) {\n\t// Parse URL if provided to extract bucket name and server URL\n\tvar url, bucket string\n\tif c.URL != \"\" {\n\t\tscheme, host, bucketPath, err := litestream.ParseReplicaURL(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid NATS URL: %w\", err)\n\t\t}\n\t\tif scheme != \"nats\" {\n\t\t\treturn nil, fmt.Errorf(\"invalid scheme for NATS replica: %s\", scheme)\n\t\t}\n\n\t\t// Reconstruct URL without bucket path\n\t\tif host != \"\" {\n\t\t\turl = fmt.Sprintf(\"nats://%s\", host)\n\t\t}\n\n\t\t// Extract bucket name from path\n\t\tif bucketPath != \"\" {\n\t\t\tbucket = strings.Trim(bucketPath, \"/\")\n\t\t}\n\t}\n\n\t// Use bucket from config if not extracted from URL\n\tif bucket == \"\" {\n\t\tbucket = c.Bucket\n\t}\n\n\t// Ensure required settings are set\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for NATS replica\")\n\t}\n\n\t// Validate TLS configuration\n\t// Both client cert and key must be specified together\n\tif (c.ClientCert != \"\") != (c.ClientKey != \"\") {\n\t\treturn nil, fmt.Errorf(\"client-cert and client-key must both be specified for mutual TLS authentication\")\n\t}\n\n\t// Build replica client\n\tclient := nats.NewReplicaClient()\n\tclient.URL = url\n\tclient.BucketName = bucket\n\n\t// Set authentication options\n\tclient.JWT = c.JWT\n\tclient.Seed = c.Seed\n\tclient.Creds = c.Creds\n\tclient.NKey = c.NKey\n\tclient.Username = c.Username\n\tclient.Password = c.Password\n\tclient.Token = c.Token\n\n\t// Set TLS options\n\tif c.TLS != nil {\n\t\tclient.TLS = *c.TLS\n\t}\n\tclient.RootCAs = c.RootCAs\n\tclient.ClientCert = c.ClientCert\n\tclient.ClientKey = c.ClientKey\n\n\t// Set connection options with defaults\n\tif c.MaxReconnects != nil {\n\t\tclient.MaxReconnects = *c.MaxReconnects\n\t}\n\tif c.ReconnectWait != nil {\n\t\tclient.ReconnectWait = *c.ReconnectWait\n\t}\n\tif c.Timeout != nil {\n\t\tclient.Timeout = *c.Timeout\n\t}\n\n\treturn client, nil\n}\n\n// newOSSReplicaClientFromConfig returns a new instance of oss.ReplicaClient built from config.\nfunc newOSSReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *oss.ReplicaClient, err error) {\n\t// Ensure URL \u0026 constituent parts are not both specified.\n\tif c.URL != \"\" \u0026\u0026 c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 path for oss replica\")\n\t} else if c.URL != \"\" \u0026\u0026 c.Bucket != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url \u0026 bucket for oss replica\")\n\t}\n\n\tbucket, configPath := c.Bucket, c.Path\n\tregion, endpoint := c.Region, c.Endpoint\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\t_, host, upath, err := litestream.ParseReplicaURL(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar (\n\t\t\tubucket string\n\t\t\turegion string\n\t\t)\n\n\t\tubucket, uregion, _ = oss.ParseHost(host)\n\n\t\t// Only apply URL parts to fields that have not been overridden.\n\t\tif configPath == \"\" {\n\t\t\tconfigPath = upath\n\t\t}\n\t\tif bucket == \"\" {\n\t\t\tbucket = ubucket\n\t\t}\n\t\tif region == \"\" {\n\t\t\tregion = uregion\n\t\t}\n\t}\n\n\t// Ensure required settings are set.\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for oss replica\")\n\t}\n\n\t// Build replica client.\n\tclient := oss.NewReplicaClient()\n\tclient.AccessKeyID = c.AccessKeyID\n\tclient.AccessKeySecret = c.SecretAccessKey\n\tclient.Bucket = bucket\n\tclient.Path = configPath\n\tclient.Region = region\n\tclient.Endpoint = endpoint\n\n\t// Apply upload configuration if specified.\n\tif c.PartSize != nil {\n\t\tclient.PartSize = int64(*c.PartSize)\n\t}\n\tif c.Concurrency != nil {\n\t\tclient.Concurrency = *c.Concurrency\n\t}\n\n\treturn client, nil\n}\n\n// applyLitestreamEnv copies \"LITESTREAM\" prefixed environment variables to\n// their AWS counterparts as the \"AWS\" prefix can be confusing when using a\n// non-AWS S3-compatible service.\nfunc applyLitestreamEnv() {\n\tif v, ok := os.LookupEnv(\"LITESTREAM_ACCESS_KEY_ID\"); ok {\n\t\tif _, ok := os.LookupEnv(\"AWS_ACCESS_KEY_ID\"); !ok {\n\t\t\tos.Setenv(\"AWS_ACCESS_KEY_ID\", v)\n\t\t}\n\t}\n\tif v, ok := os.LookupEnv(\"LITESTREAM_SECRET_ACCESS_KEY\"); ok {\n\t\tif _, ok := os.LookupEnv(\"AWS_SECRET_ACCESS_KEY\"); !ok {\n\t\t\tos.Setenv(\"AWS_SECRET_ACCESS_KEY\", v)\n\t\t}\n\t}\n}\n\ntype boolSetting struct {\n\tvalue bool\n\tset bool\n}\n\nfunc newBoolSetting(defaultValue bool) boolSetting {\n\treturn boolSetting{value: defaultValue}\n}\n\nfunc (s *boolSetting) Set(value bool) {\n\ts.value = value\n\ts.set = true\n}\n\nfunc (s *boolSetting) ApplyDefault(value bool) {\n\tif !s.set {\n\t\ts.value = value\n\t}\n}\n\n// ReplicaType returns the type based on the type field or extracted from the URL.\nfunc (c *ReplicaConfig) ReplicaType() string {\n\tif replicaType := litestream.ReplicaTypeFromURL(c.URL); replicaType != \"\" {\n\t\treturn replicaType\n\t} else if c.Type != \"\" {\n\t\treturn c.Type\n\t}\n\treturn \"file\"\n}\n\n// DefaultConfigPath returns the default config path.\nfunc DefaultConfigPath() string {\n\tif v := os.Getenv(\"LITESTREAM_CONFIG\"); v != \"\" {\n\t\treturn v\n\t}\n\treturn defaultConfigPath\n}\n\nfunc registerConfigFlag(fs *flag.FlagSet) (configPath *string, noExpandEnv *bool) {\n\treturn fs.String(\"config\", \"\", \"config path\"),\n\t\tfs.Bool(\"no-expand-env\", false, \"do not expand env vars in config\")\n}\n\n// isValidHeartbeatURL checks if the URL is a valid HTTP or HTTPS URL.\nfunc isValidHeartbeatURL(u string) bool {\n\treturn strings.HasPrefix(u, \"http://\") || strings.HasPrefix(u, \"https://\")\n}\n\n// expand returns an absolute path for s.\n// It also strips SQLite connection string prefixes (sqlite://, sqlite3://).\nfunc expand(s string) (string, error) {\n\t// Strip SQLite connection string prefixes if present.\n\ts = StripSQLitePrefix(s)\n\n\t// Just expand to absolute path if there is no home directory prefix.\n\tprefix := \"~\" + string(os.PathSeparator)\n\tif s != \"~\" \u0026\u0026 !strings.HasPrefix(s, prefix) {\n\t\treturn filepath.Abs(s)\n\t}\n\n\t// Look up home directory.\n\tu, err := user.Current()\n\tif err != nil {\n\t\treturn \"\", err\n\t} else if u.HomeDir == \"\" {\n\t\treturn \"\", fmt.Errorf(\"cannot expand path %s, no home directory available\", s)\n\t}\n\n\t// Return path with tilde replaced by the home directory.\n\tif s == \"~\" {\n\t\treturn u.HomeDir, nil\n\t}\n\treturn filepath.Join(u.HomeDir, strings.TrimPrefix(s, prefix)), nil\n}\n\n// StripSQLitePrefix removes SQLite connection string prefixes (sqlite://, sqlite3://)\n// from the given path. This allows users to use standard connection string formats\n// across their tooling while Litestream extracts just the file path.\nfunc StripSQLitePrefix(s string) string {\n\tif len(s) \u003c 9 || s[0] != 's' {\n\t\treturn s\n\t}\n\tfor _, prefix := range []string{\"sqlite3://\", \"sqlite://\"} {\n\t\tif strings.HasPrefix(s, prefix) {\n\t\t\treturn strings.TrimPrefix(s, prefix)\n\t\t}\n\t}\n\treturn s\n}\n\n// txidVar allows the flag package to parse index flags as hex-formatted TXIDs\ntype txidVar ltx.TXID\n\n// Ensure type implements interface.\nvar _ flag.Value = (*txidVar)(nil)\n\n// String returns an 8-character hexadecimal value.\nfunc (v *txidVar) String() string {\n\treturn ltx.TXID(*v).String()\n}\n\n// Set parses s into an integer from a hexadecimal value.\nfunc (v *txidVar) Set(s string) error {\n\ttxID, err := ltx.ParseTXID(s)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid txid format\")\n\t}\n\t*v = txidVar(txID)\n\treturn nil\n}\n\n// levelAll is a sentinel value indicating all compaction levels should be shown.\nconst levelAll = -1\n\n// levelVar allows the flag package to parse compaction level flags.\n// Accepts integers 0-9 or \"all\" for all levels.\ntype levelVar int\n\nvar _ flag.Value = (*levelVar)(nil)\n\nfunc (v *levelVar) String() string {\n\tif *v == levelAll {\n\t\treturn \"all\"\n\t}\n\treturn strconv.Itoa(int(*v))\n}\n\nfunc (v *levelVar) Set(s string) error {\n\tif s == \"all\" {\n\t\t*v = levelAll\n\t\treturn nil\n\t}\n\tn, err := strconv.Atoi(s)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid level: must be 0-%d or \\\"all\\\"\", litestream.SnapshotLevel)\n\t}\n\tif n \u003c 0 || n \u003e litestream.SnapshotLevel {\n\t\treturn fmt.Errorf(\"level must be between 0 and %d\", litestream.SnapshotLevel)\n\t}\n\t*v = levelVar(n)\n\treturn nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[34,43]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[44,51]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[52,58]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[59,64]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[65,76]}},{"name":"math","path":"math","span":{"start":[10,1],"end":[10,8],"bytes":[77,84]}},{"name":"url","path":"net/url","span":{"start":[11,1],"end":[11,11],"bytes":[85,95]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[96,101]}},{"name":"user","path":"os/user","span":{"start":[13,1],"end":[13,11],"bytes":[102,112]}},{"name":"path","path":"path","span":{"start":[14,1],"end":[14,8],"bytes":[113,120]}},{"name":"filepath","path":"path/filepath","span":{"start":[15,1],"end":[15,17],"bytes":[121,137]}},{"name":"debug","path":"runtime/debug","span":{"start":[16,1],"end":[16,17],"bytes":[138,154]}},{"name":"strconv","path":"strconv","span":{"start":[17,1],"end":[17,11],"bytes":[155,165]}},{"name":"strings","path":"strings","span":{"start":[18,1],"end":[18,11],"bytes":[166,176]}},{"name":"time","path":"time","span":{"start":[19,1],"end":[19,8],"bytes":[177,184]}},{"name":"go-humanize","path":"github.com/dustin/go-humanize","span":{"start":[21,1],"end":[21,33],"bytes":[186,218]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[22,1],"end":[22,27],"bytes":[219,245]}},{"name":"fallback","path":"golang.org/x/crypto/x509roots/fallback","alias":"_","span":{"start":[23,1],"end":[23,44],"bytes":[246,289]}},{"name":"yaml.v2","path":"gopkg.in/yaml.v2","span":{"start":[24,1],"end":[24,20],"bytes":[290,309]}},{"name":"sqlite","path":"modernc.org/sqlite","alias":"_","span":{"start":[25,1],"end":[25,24],"bytes":[310,333]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[27,1],"end":[27,37],"bytes":[335,371]}},{"name":"abs","path":"github.com/benbjohnson/litestream/abs","span":{"start":[28,1],"end":[28,41],"bytes":[372,412]}},{"name":"file","path":"github.com/benbjohnson/litestream/file","span":{"start":[29,1],"end":[29,42],"bytes":[413,454]}},{"name":"gs","path":"github.com/benbjohnson/litestream/gs","span":{"start":[30,1],"end":[30,40],"bytes":[455,494]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[31,1],"end":[31,46],"bytes":[495,540]}},{"name":"nats","path":"github.com/benbjohnson/litestream/nats","span":{"start":[32,1],"end":[32,42],"bytes":[541,582]}},{"name":"oss","path":"github.com/benbjohnson/litestream/oss","span":{"start":[33,1],"end":[33,41],"bytes":[583,623]}},{"name":"s3","path":"github.com/benbjohnson/litestream/s3","span":{"start":[34,1],"end":[34,40],"bytes":[624,663]}},{"name":"sftp","path":"github.com/benbjohnson/litestream/sftp","span":{"start":[35,1],"end":[35,42],"bytes":[664,705]}},{"name":"webdav","path":"github.com/benbjohnson/litestream/webdav","span":{"start":[36,1],"end":[36,44],"bytes":[706,749]}}],"types":{"ByteSize":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize","kind":"defined","span":{"start":[1071,1],"end":[1071,20],"bytes":[32518,32537]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize/github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML","kind":"method","span":{"start":[1074,1],"end":[1086,2],"bytes":[32598,32842]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML","parameters":[{"name":"unmarshal","type":"func(interface{}) error","span":{"start":[1074,1],"end":[1074,76],"bytes":[32598,32673]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1076:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize/github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML@1076:12","span":{"start":[1076,12],"end":[1076,25],"bytes":[32699,32712]},"callee":null},"1080:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize/github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML@1080:15","span":{"start":[1080,15],"end":[1080,31],"bytes":[32758,32774]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize"},"1084:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize/github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML@1084:7","span":{"start":[1084,7],"end":[1084,21],"bytes":[32814,32828]},"callee":null}}}}},"CompactionLevelConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.CompactionLevelConfig","kind":"struct","span":{"start":[717,1],"end":[719,2],"bytes":[21344,21423]},"callables":{},"fields":{"Interval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.CompactionLevelConfig/Interval","kind":"field","type":"time.Duration","span":{"start":[718,1],"end":[718,42],"bytes":[21380,21421]}}}},"Config":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config","kind":"struct","span":{"start":[270,1],"end":[325,2],"bytes":[7596,9394]},"base_types":["github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings"],"callables":{"github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels","kind":"method","span":{"start":[571,1],"end":[584,2],"bytes":[17438,17721]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels","parameters":[],"return_type":"github.com/benbjohnson/litestream.CompactionLevels","metrics":{"cyclomatic":2},"body":{"577:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels@577:12","span":{"start":[577,12],"end":[580,5],"bytes":[17605,17700]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig","kind":"method","span":{"start":[587,1],"end":[594,2],"bytes":[17775,17940]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig","parameters":[{"name":"configPath","type":"string","span":{"start":[587,1],"end":[587,57],"bytes":[17775,17831]}}],"return_type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","metrics":{"cyclomatic":3},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.Config.Validate":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","kind":"method","span":{"start":[419,1],"end":[568,2],"bytes":[12463,17363]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":26},"body":{"465:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@465:30","span":{"start":[465,30],"end":[465,65],"bytes":[13863,13898]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL"},"485:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@485:12","span":{"start":[485,12],"end":[485,49],"bytes":[14450,14487]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"492:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@492:15","span":{"start":[492,15],"end":[492,35],"bytes":[14573,14593]},"callee":null},"496:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@496:11","span":{"start":[496,11],"end":[496,89],"bytes":[14776,14854]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"499:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@499:11","span":{"start":[499,11],"end":[499,88],"bytes":[14906,14983]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"506:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@506:11","span":{"start":[506,11],"end":[506,34],"bytes":[15195,15218]},"callee":"can://litestream/litestream/@external/path/filepath/Clean"},"508:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@508:12","span":{"start":[508,12],"end":[508,164],"bytes":[15270,15422]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"515:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@515:11","span":{"start":[515,11],"end":[515,91],"bytes":[15558,15638]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"518:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@518:11","span":{"start":[518,11],"end":[518,97],"bytes":[15685,15771]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"521:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@521:11","span":{"start":[521,11],"end":[521,97],"bytes":[15827,15913]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"524:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@524:11","span":{"start":[524,11],"end":[524,99],"bytes":[15975,16063]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"536:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@536:12","span":{"start":[536,12],"end":[536,66],"bytes":[16366,16420]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"543:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@543:12","span":{"start":[543,12],"end":[543,67],"bytes":[16617,16672]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"552:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@552:12","span":{"start":[552,12],"end":[552,70],"bytes":[16933,16991]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"560:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate@560:13","span":{"start":[560,13],"end":[560,79],"bytes":[17228,17294]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig","kind":"method","span":{"start":[356,1],"end":[390,2],"bytes":[10206,11283]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig","parameters":[{"name":"globalIntervalSet","type":"bool","span":{"start":[356,1],"end":[356,91],"bytes":[10206,10296]}},{"name":"globalRetentionSet","type":"bool","span":{"start":[356,1],"end":[356,91],"bytes":[10206,10296]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"369:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig@369:12","span":{"start":[369,12],"end":[369,139],"bytes":[10597,10724]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"376:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig@376:12","span":{"start":[376,12],"end":[376,143],"bytes":[10902,11033]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings","kind":"method","span":{"start":[344,1],"end":[354,2],"bytes":[9909,10204]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings","parameters":[],"metrics":{"cyclomatic":4},"body":{"348:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings@348:4","span":{"start":[348,4],"end":[348,47],"bytes":[10074,10117]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults"},"351:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings@351:4","span":{"start":[351,4],"end":[351,38],"bytes":[10161,10195]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults"}}}},"fields":{"Addr":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Addr","kind":"field","type":"string","span":{"start":[275,1],"end":[275,27],"bytes":[7758,7784]}},"ConfigPath":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/ConfigPath","kind":"field","type":"string","span":{"start":[324,1],"end":[324,30],"bytes":[9363,9392]}},"DBs":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/DBs","kind":"field","type":"[]*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[306,1],"end":[306,30],"bytes":[8814,8843]}},"Exec":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Exec","kind":"field","type":"string","span":{"start":[310,1],"end":[310,27],"bytes":[8943,8969]}},"HeartbeatInterval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/HeartbeatInterval","kind":"field","type":"*time.Duration","span":{"start":[303,1],"end":[303,62],"bytes":[8718,8779]}},"HeartbeatURL":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/HeartbeatURL","kind":"field","type":"string","span":{"start":[302,1],"end":[302,57],"bytes":[8661,8717]}},"L0Retention":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/L0Retention","kind":"field","type":"*time.Duration","span":{"start":[291,1],"end":[291,63],"bytes":[8214,8276]}},"L0RetentionCheckInterval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/L0RetentionCheckInterval","kind":"field","type":"*time.Duration","span":{"start":[292,1],"end":[292,78],"bytes":[8277,8354]}},"Levels":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Levels","kind":"field","type":"[]*github.com/benbjohnson/litestream/cmd/litestream.CompactionLevelConfig","span":{"start":[282,1],"end":[282,49],"bytes":[7988,8036]}},"Logging":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Logging","kind":"field","type":"github.com/benbjohnson/litestream/internal.LoggingConfig","span":{"start":[313,1],"end":[313,49],"bytes":[8983,9031]}},"MCPAddr":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/MCPAddr","kind":"field","type":"string","span":{"start":[316,1],"end":[316,34],"bytes":[9056,9089]}},"Retention":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Retention","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.RetentionConfig","span":{"start":[299,1],"end":[299,46],"bytes":[8573,8618]}},"ShutdownSyncInterval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/ShutdownSyncInterval","kind":"field","type":"*time.Duration","span":{"start":[320,1],"end":[320,69],"bytes":[9192,9260]}},"ShutdownSyncTimeout":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/ShutdownSyncTimeout","kind":"field","type":"*time.Duration","span":{"start":[319,1],"end":[319,68],"bytes":[9124,9191]}},"Snapshot":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Snapshot","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig","span":{"start":[285,1],"end":[285,43],"bytes":[8065,8107]}},"Socket":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Socket","kind":"field","type":"github.com/benbjohnson/litestream.SocketConfig","span":{"start":[278,1],"end":[278,48],"bytes":[7833,7880]}},"Validation":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/Validation","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.ValidationConfig","span":{"start":[288,1],"end":[288,49],"bytes":[8138,8186]}},"VerifyCompaction":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/VerifyCompaction","kind":"field","type":"bool","span":{"start":[296,1],"end":[296,50],"bytes":[8494,8543]}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","span":{"start":[272,1],"end":[272,34],"bytes":[7685,7718]}}}},"ConfigValidationError":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError","kind":"struct","span":{"start":[67,1],"end":[71,2],"bytes":[2273,2356]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error","kind":"method","span":{"start":[73,1],"end":[78,2],"bytes":[2358,2543]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"75:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error@75:10","span":{"start":[75,10],"end":[75,65],"bytes":[2437,2492]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"77:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error@77:9","span":{"start":[77,9],"end":[77,46],"bytes":[2504,2541]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Unwrap":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Unwrap","kind":"method","span":{"start":[80,1],"end":[82,2],"bytes":[2545,2609]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Unwrap","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"Err":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/Err","kind":"field","type":"error","span":{"start":[68,1],"end":[68,13],"bytes":[2309,2321]}},"Field":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/Field","kind":"field","type":"string","span":{"start":[69,1],"end":[69,14],"bytes":[2322,2335]}},"Value":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/Value","kind":"field","type":"interface{}","span":{"start":[70,1],"end":[70,19],"bytes":[2336,2354]}}}},"DBConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig","kind":"struct","span":{"start":[722,1],"end":[742,2],"bytes":[21515,22670]},"callables":{},"fields":{"BusyTimeout":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/BusyTimeout","kind":"field","type":"*time.Duration","span":{"start":[733,1],"end":[733,57],"bytes":[22253,22309]}},"CheckpointInterval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/CheckpointInterval","kind":"field","type":"*time.Duration","span":{"start":[732,1],"end":[732,64],"bytes":[22189,22252]}},"Dir":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Dir","kind":"field","type":"string","span":{"start":[724,1],"end":[724,89],"bytes":[21587,21675]}},"MaxSyncWALBytes":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MaxSyncWALBytes","kind":"field","type":"*int64","span":{"start":[736,1],"end":[736,63],"bytes":[22440,22502]}},"MetaDir":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MetaDir","kind":"field","type":"*string","span":{"start":[730,1],"end":[730,53],"bytes":[22075,22127]}},"MetaPath":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MetaPath","kind":"field","type":"*string","span":{"start":[729,1],"end":[729,54],"bytes":[22021,22074]}},"MinCheckpointPageN":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MinCheckpointPageN","kind":"field","type":"*int","span":{"start":[734,1],"end":[734,70],"bytes":[22310,22379]}},"MonitorInterval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/MonitorInterval","kind":"field","type":"*time.Duration","span":{"start":[731,1],"end":[731,61],"bytes":[22128,22188]}},"Path":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Path","kind":"field","type":"string","span":{"start":[723,1],"end":[723,49],"bytes":[21538,21586]}},"Pattern":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Pattern","kind":"field","type":"string","span":{"start":[725,1],"end":[725,106],"bytes":[21676,21781]}},"Recursive":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Recursive","kind":"field","type":"bool","span":{"start":[726,1],"end":[726,89],"bytes":[21782,21870]}},"Replica":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Replica","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[740,1],"end":[740,44],"bytes":[22566,22609]}},"Replicas":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Replicas","kind":"field","type":"[]*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[741,1],"end":[741,59],"bytes":[22610,22668]}},"RestoreIfDBNotExists":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/RestoreIfDBNotExists","kind":"field","type":"bool","span":{"start":[738,1],"end":[738,61],"bytes":[22504,22564]}},"Snapshot":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Snapshot","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig","span":{"start":[728,1],"end":[728,53],"bytes":[21968,22020]}},"TruncatePageN":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/TruncatePageN","kind":"field","type":"*int","span":{"start":[735,1],"end":[735,60],"bytes":[22380,22439]}},"Watch":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DBConfig/Watch","kind":"field","type":"bool","span":{"start":[727,1],"end":[727,97],"bytes":[21871,21967]}}}},"Main":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main","kind":"struct","span":{"start":[117,1],"end":[117,19],"bytes":[3367,3385]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.Main.Run":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","kind":"method","span":{"start":[125,1],"end":[239,2],"bytes":[3501,6631]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Main.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[125,1],"end":[125,69],"bytes":[3501,3569]}},{"name":"args","type":"[]string","span":{"start":[125,1],"end":[125,69],"bytes":[3501,3569]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":33},"body":{"127:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@127:23","span":{"start":[127,23],"end":[127,41],"bytes":[3657,3675]},"callee":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.isWindowsService"},"130:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@130:10","span":{"start":[130,10],"end":[130,32],"bytes":[3735,3757]},"callee":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.runWindowsService"},"134:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@134:2","span":{"start":[134,2],"end":[134,22],"bytes":[3809,3829]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv"},"138:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@138:5","span":{"start":[138,5],"end":[138,14],"bytes":[3877,3886]},"callee":null},"144:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@144:10","span":{"start":[144,10],"end":[144,46],"bytes":[3971,4007]},"callee":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run"},"146:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@146:8","span":{"start":[146,8],"end":[146,29],"bytes":[4034,4055]},"callee":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand"},"147:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@147:13","span":{"start":[147,13],"end":[147,36],"bytes":[4068,4091]},"callee":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags"},"152:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@152:15","span":{"start":[152,15],"end":[152,27],"bytes":[4166,4178]},"callee":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan"},"157:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@157:11","span":{"start":[157,11],"end":[157,30],"bytes":[4366,4385]},"callee":null},"158:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@158:3","span":{"start":[158,3],"end":[158,18],"bytes":[4388,4403]},"callee":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone"},"160:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@160:13","span":{"start":[160,13],"end":[160,23],"bytes":[4417,4427]},"callee":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run"},"168:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@168:5","span":{"start":[168,5],"end":[168,61],"bytes":[4560,4616]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"170:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@170:5","span":{"start":[170,5],"end":[170,64],"bytes":[4633,4692]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"173:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@173:4","span":{"start":[173,4],"end":[173,73],"bytes":[4727,4796]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"176:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@176:5","span":{"start":[176,5],"end":[176,48],"bytes":[4823,4866]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"177:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@177:15","span":{"start":[177,15],"end":[177,40],"bytes":[4881,4906]},"callee":"can://litestream/litestream/@external/os/Process.Signal"},"178:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@178:13","span":{"start":[178,13],"end":[178,62],"bytes":[4933,4982]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"181:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@181:5","span":{"start":[181,5],"end":[181,51],"bytes":[4994,5040]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"182:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@182:42","span":{"start":[182,42],"end":[182,83],"bytes":[5082,5123]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"182:60":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@182:60","span":{"start":[182,60],"end":[182,71],"bytes":[5100,5111]},"callee":null},"183:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@183:13","span":{"start":[183,13],"end":[183,64],"bytes":[5138,5189]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"188:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@188:7","span":{"start":[188,7],"end":[191,7],"bytes":[5282,5328]},"callee":null,"is_goroutine":true},"195:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@195:11","span":{"start":[195,11],"end":[195,23],"bytes":[5367,5379]},"callee":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close"},"198:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@198:3","span":{"start":[198,3],"end":[198,36],"bytes":[5423,5456]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"202:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@202:10","span":{"start":[202,10],"end":[202,42],"bytes":[5495,5527]},"callee":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run"},"204:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@204:10","span":{"start":[204,10],"end":[204,41],"bytes":[5551,5582]},"callee":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run"},"206:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@206:10","span":{"start":[206,10],"end":[206,45],"bytes":[5610,5645]},"callee":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run"},"208:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@208:10","span":{"start":[208,10],"end":[208,47],"bytes":[5675,5712]},"callee":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run"},"210:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@210:10","span":{"start":[210,10],"end":[210,42],"bytes":[5737,5769]},"callee":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run"},"212:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@212:10","span":{"start":[212,10],"end":[212,44],"bytes":[5796,5830]},"callee":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run"},"214:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@214:10","span":{"start":[214,10],"end":[214,43],"bytes":[5856,5889]},"callee":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run"},"216:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@216:10","span":{"start":[216,10],"end":[216,41],"bytes":[5913,5944]},"callee":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run"},"218:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@218:10","span":{"start":[218,10],"end":[218,41],"bytes":[5968,5999]},"callee":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run"},"220:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@220:10","span":{"start":[220,10],"end":[220,41],"bytes":[6023,6054]},"callee":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run"},"222:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@222:10","span":{"start":[222,10],"end":[222,44],"bytes":[6081,6115]},"callee":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run"},"224:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@224:10","span":{"start":[224,10],"end":[224,40],"bytes":[6138,6168]},"callee":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run"},"227:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@227:3","span":{"start":[227,3],"end":[227,92],"bytes":[6233,6322]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"},"228:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@228:10","span":{"start":[228,10],"end":[228,40],"bytes":[6332,6362]},"callee":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run"},"231:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@231:4","span":{"start":[231,4],"end":[231,13],"bytes":[6449,6458]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage"},"233:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@233:26","span":{"start":[233,26],"end":[233,53],"bytes":[6498,6525]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"234:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@234:4","span":{"start":[234,4],"end":[234,13],"bytes":[6531,6540]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage"},"237:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run@237:10","span":{"start":[237,10],"end":[237,59],"bytes":[6577,6626]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run/github.com/benbjohnson/litestream/cmd/litestream.Main.Run.closure_1","kind":"function","span":{"start":[188,1],"end":[191,7],"bytes":[5276,5328]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Main.Run.closure_1","parameters":[],"body":{"190:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run/github.com/benbjohnson/litestream/cmd/litestream.Main.Run.closure_1@190:5","span":{"start":[190,5],"end":[190,16],"bytes":[5310,5321]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.Main.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage","kind":"method","span":{"start":[242,1],"end":[267,2],"bytes":[6676,7525]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.Main.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"243:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage@243:2","span":{"start":[243,2],"end":[266,7],"bytes":[6702,7523]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}},"ReplicaConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","kind":"struct","span":{"start":[1340,1],"end":[1347,2],"bytes":[39984,40185]},"base_types":["github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings"],"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","kind":"method","span":{"start":[2088,1],"end":[2095,2],"bytes":[61675,61881]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","parameters":[],"return_type":"string","metrics":{"cyclomatic":3},"body":{"2089:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType@2089:20","span":{"start":[2089,20],"end":[2089,56],"bytes":[61741,61777]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL"}}}},"fields":{"Name":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/Name","kind":"field","type":"string","span":{"start":[1344,1],"end":[1344,41],"bytes":[40090,40130]}},"Path":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/Path","kind":"field","type":"string","span":{"start":[1345,1],"end":[1345,27],"bytes":[40131,40157]}},"Type":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/Type","kind":"field","type":"string","span":{"start":[1343,1],"end":[1343,43],"bytes":[40047,40089]}},"URL":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/URL","kind":"field","type":"string","span":{"start":[1346,1],"end":[1346,26],"bytes":[40158,40183]}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","span":{"start":[1341,1],"end":[1341,34],"bytes":[40012,40045]}}}},"ReplicaSettings":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","kind":"struct","span":{"start":[1113,1],"end":[1187,2],"bytes":[33718,36725]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults","kind":"method","span":{"start":[1191,1],"end":[1337,2],"bytes":[36868,39900]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults","parameters":[{"name":"src","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings","span":{"start":[1191,1],"end":[1191,63],"bytes":[36868,36930]}}],"metrics":{"cyclomatic":44},"body":{"1311:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults@1311:5","span":{"start":[1311,5],"end":[1311,20],"bytes":[39342,39357]},"callee":null},"1331:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults@1331:5","span":{"start":[1331,5],"end":[1331,27],"bytes":[39747,39769]},"callee":null},"1334:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults@1334:5","span":{"start":[1334,5],"end":[1334,27],"bytes":[39825,39847]},"callee":null}}}},"fields":{"AccessKeyID":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/AccessKeyID","kind":"field","type":"string","span":{"start":[1127,1],"end":[1127,53],"bytes":[34322,34374]}},"AccountKey":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/AccountKey","kind":"field","type":"string","span":{"start":[1151,1],"end":[1151,41],"bytes":[35415,35455]}},"AccountName":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/AccountName","kind":"field","type":"string","span":{"start":[1150,1],"end":[1150,42],"bytes":[35373,35414]}},"Age":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Age","kind":"field","type":"struct{Identities []string \"yaml:\\\"identities\\\"\"; Recipients []string \"yaml:\\\"recipients\\\"\"}","span":{"start":[1183,1],"end":[1186,16],"bytes":[36610,36723]}},"AutoRecover":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/AutoRecover","kind":"field","type":"*bool","span":{"start":[1124,1],"end":[1124,41],"bytes":[34264,34304]}},"Bucket":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Bucket","kind":"field","type":"string","span":{"start":[1130,1],"end":[1130,46],"bytes":[34478,34523]}},"ClientCert":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ClientCert","kind":"field","type":"string","span":{"start":[1176,1],"end":[1176,51],"bytes":[36312,36362]}},"ClientKey":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ClientKey","kind":"field","type":"string","span":{"start":[1177,1],"end":[1177,50],"bytes":[36363,36412]}},"Concurrency":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Concurrency","kind":"field","type":"*int","span":{"start":[1139,1],"end":[1139,51],"bytes":[34952,35002]}},"ConcurrentWrites":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ConcurrentWrites","kind":"field","type":"*bool","span":{"start":[1159,1],"end":[1159,52],"bytes":[35678,35729]}},"Creds":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Creds","kind":"field","type":"string","span":{"start":[1170,1],"end":[1170,45],"bytes":[36039,36083]}},"Endpoint":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Endpoint","kind":"field","type":"string","span":{"start":[1131,1],"end":[1131,48],"bytes":[34524,34571]}},"ForcePathStyle":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ForcePathStyle","kind":"field","type":"*bool","span":{"start":[1132,1],"end":[1132,56],"bytes":[34572,34627]}},"Host":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Host","kind":"field","type":"string","span":{"start":[1155,1],"end":[1155,39],"bytes":[35514,35552]}},"HostKey":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/HostKey","kind":"field","type":"string","span":{"start":[1160,1],"end":[1160,43],"bytes":[35730,35772]}},"JWT":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/JWT","kind":"field","type":"string","span":{"start":[1168,1],"end":[1168,43],"bytes":[35952,35994]}},"KeyPath":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/KeyPath","kind":"field","type":"string","span":{"start":[1158,1],"end":[1158,43],"bytes":[35635,35677]}},"MaxReconnects":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/MaxReconnects","kind":"field","type":"*int","span":{"start":[1178,1],"end":[1178,54],"bytes":[36413,36466]}},"MaxSyncLTXFiles":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/MaxSyncLTXFiles","kind":"field","type":"*int","span":{"start":[1119,1],"end":[1119,50],"bytes":[33992,34041]}},"NKey":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/NKey","kind":"field","type":"string","span":{"start":[1171,1],"end":[1171,44],"bytes":[36084,36127]}},"PartSize":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/PartSize","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream.ByteSize","span":{"start":[1138,1],"end":[1138,49],"bytes":[34903,34951]}},"Password":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Password","kind":"field","type":"string","span":{"start":[1157,1],"end":[1157,43],"bytes":[35592,35634]}},"ReconnectWait":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ReconnectWait","kind":"field","type":"*time.Duration","span":{"start":[1179,1],"end":[1179,54],"bytes":[36467,36520]}},"Region":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Region","kind":"field","type":"string","span":{"start":[1129,1],"end":[1129,46],"bytes":[34432,34477]}},"RequireContentMD5":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/RequireContentMD5","kind":"field","type":"*bool","span":{"start":[1135,1],"end":[1135,59],"bytes":[34740,34798]}},"RootCAs":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/RootCAs","kind":"field","type":"[]string","span":{"start":[1175,1],"end":[1175,48],"bytes":[36264,36311]}},"SASToken":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SASToken","kind":"field","type":"string","span":{"start":[1152,1],"end":[1152,39],"bytes":[35456,35494]}},"SSECustomerAlgorithm":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SSECustomerAlgorithm","kind":"field","type":"string","span":{"start":[1142,1],"end":[1142,61],"bytes":[35066,35126]}},"SSECustomerKey":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SSECustomerKey","kind":"field","type":"string","span":{"start":[1143,1],"end":[1143,55],"bytes":[35127,35181]}},"SSECustomerKeyPath":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SSECustomerKeyPath","kind":"field","type":"string","span":{"start":[1144,1],"end":[1144,60],"bytes":[35182,35241]}},"SSEKMSKeyID":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SSEKMSKeyID","kind":"field","type":"string","span":{"start":[1147,1],"end":[1147,44],"bytes":[35311,35354]}},"SecretAccessKey":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SecretAccessKey","kind":"field","type":"string","span":{"start":[1128,1],"end":[1128,57],"bytes":[34375,34431]}},"Seed":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Seed","kind":"field","type":"string","span":{"start":[1169,1],"end":[1169,44],"bytes":[35995,36038]}},"SignAcceptEncoding":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SignAcceptEncoding","kind":"field","type":"*bool","span":{"start":[1134,1],"end":[1134,60],"bytes":[34680,34739]}},"SignPayload":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SignPayload","kind":"field","type":"*bool","span":{"start":[1133,1],"end":[1133,52],"bytes":[34628,34679]}},"SkipVerify":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SkipVerify","kind":"field","type":"bool","span":{"start":[1136,1],"end":[1136,51],"bytes":[34799,34849]}},"StorageClass":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/StorageClass","kind":"field","type":"string","span":{"start":[1137,1],"end":[1137,53],"bytes":[34850,34902]}},"SyncInterval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/SyncInterval","kind":"field","type":"*time.Duration","span":{"start":[1114,1],"end":[1114,58],"bytes":[33748,33805]}},"TLS":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/TLS","kind":"field","type":"*bool","span":{"start":[1174,1],"end":[1174,43],"bytes":[36221,36263]}},"Timeout":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Timeout","kind":"field","type":"*time.Duration","span":{"start":[1180,1],"end":[1180,47],"bytes":[36521,36567]}},"Token":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Token","kind":"field","type":"string","span":{"start":[1173,1],"end":[1173,45],"bytes":[36176,36220]}},"User":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/User","kind":"field","type":"string","span":{"start":[1156,1],"end":[1156,39],"bytes":[35553,35591]}},"Username":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/Username","kind":"field","type":"string","span":{"start":[1172,1],"end":[1172,48],"bytes":[36128,36175]}},"ValidationInterval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/ValidationInterval","kind":"field","type":"*time.Duration","span":{"start":[1115,1],"end":[1115,64],"bytes":[33806,33869]}},"WebDAVPassword":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/WebDAVPassword","kind":"field","type":"string","span":{"start":[1165,1],"end":[1165,48],"bytes":[35885,35932]}},"WebDAVURL":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/WebDAVURL","kind":"field","type":"string","span":{"start":[1163,1],"end":[1163,43],"bytes":[35794,35836]}},"WebDAVUsername":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/WebDAVUsername","kind":"field","type":"string","span":{"start":[1164,1],"end":[1164,48],"bytes":[35837,35884]}}}},"RetentionConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.RetentionConfig","kind":"struct","span":{"start":[334,1],"end":[336,2],"bytes":[9619,9682]},"callables":{},"fields":{"Enabled":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.RetentionConfig/Enabled","kind":"field","type":"*bool","span":{"start":[335,1],"end":[335,32],"bytes":[9649,9680]}}}},"SnapshotConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig","kind":"struct","span":{"start":[328,1],"end":[331,2],"bytes":[9436,9555]},"callables":{},"fields":{"Interval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig/Interval","kind":"field","type":"*time.Duration","span":{"start":[329,1],"end":[329,44],"bytes":[9465,9508]}},"Retention":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.SnapshotConfig/Retention","kind":"field","type":"*time.Duration","span":{"start":[330,1],"end":[330,45],"bytes":[9509,9553]}}}},"ValidationConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ValidationConfig","kind":"struct","span":{"start":[339,1],"end":[341,2],"bytes":[9743,9818]},"callables":{},"fields":{"Interval":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ValidationConfig/Interval","kind":"field","type":"*time.Duration","span":{"start":[340,1],"end":[340,43],"bytes":[9774,9816]}}}},"boolSetting":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting","kind":"struct","span":{"start":[2067,1],"end":[2070,2],"bytes":[61282,61333]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault","kind":"method","span":{"start":[2081,1],"end":[2085,2],"bytes":[61506,61590]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault","parameters":[{"name":"value","type":"bool","span":{"start":[2081,1],"end":[2081,49],"bytes":[61506,61554]}}],"metrics":{"cyclomatic":2},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set","kind":"method","span":{"start":[2076,1],"end":[2079,2],"bytes":[61432,61504]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set","parameters":[{"name":"value","type":"bool","span":{"start":[2076,1],"end":[2076,40],"bytes":[61432,61471]}}],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"set":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/set","kind":"field","type":"bool","span":{"start":[2069,1],"end":[2069,12],"bytes":[61320,61331]}},"value":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/value","kind":"field","type":"bool","span":{"start":[2068,1],"end":[2068,12],"bytes":[61308,61319]}}}},"levelVar":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar","kind":"defined","span":{"start":[2183,1],"end":[2183,18],"bytes":[64500,64517]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set","kind":"method","span":{"start":[2194,1],"end":[2208,2],"bytes":[64665,65048]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set","parameters":[{"name":"s","type":"string","span":{"start":[2194,1],"end":[2194,41],"bytes":[64665,64705]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"2199:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set@2199:12","span":{"start":[2199,12],"end":[2199,27],"bytes":[64766,64781]},"callee":"can://litestream/litestream/@external/strconv/Atoi"},"2201:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set@2201:10","span":{"start":[2201,10],"end":[2201,88],"bytes":[64808,64886]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2204:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set@2204:10","span":{"start":[2204,10],"end":[2204,80],"bytes":[64943,65013]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2206:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set@2206:7","span":{"start":[2206,7],"end":[2206,18],"bytes":[65023,65034]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.levelVar.String":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.String","kind":"method","span":{"start":[2187,1],"end":[2192,2],"bytes":[64556,64663]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.levelVar.String","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"2191:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.String@2191:22","span":{"start":[2191,22],"end":[2191,29],"bytes":[64653,64660]},"callee":null},"2191:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.String@2191:9","span":{"start":[2191,9],"end":[2191,30],"bytes":[64640,64661]},"callee":"can://litestream/litestream/@external/strconv/Itoa"}}}}},"txidVar":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar","kind":"defined","span":{"start":[2158,1],"end":[2158,22],"bytes":[63835,63856]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set","kind":"method","span":{"start":[2169,1],"end":[2176,2],"bytes":[64110,64277]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set","parameters":[{"name":"s","type":"string","span":{"start":[2169,1],"end":[2169,40],"bytes":[64110,64149]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"2170:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set@2170:15","span":{"start":[2170,15],"end":[2170,31],"bytes":[64164,64180]},"callee":null},"2172:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set@2172:10","span":{"start":[2172,10],"end":[2172,43],"bytes":[64207,64240]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2174:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set@2174:7","span":{"start":[2174,7],"end":[2174,20],"bytes":[64250,64263]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.txidVar.String":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.String","kind":"method","span":{"start":[2164,1],"end":[2166,2],"bytes":[63983,64050]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.txidVar.String","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{"2165:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.String@2165:9","span":{"start":[2165,9],"end":[2165,30],"bytes":[64027,64048]},"callee":null},"2165:9/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.String@2165:9/2","span":{"start":[2165,9],"end":[2165,21],"bytes":[64027,64039]},"callee":null}}}}},"usageError":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.usageError","kind":"struct","span":{"start":[107,1],"end":[110,2],"bytes":[3201,3259]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.usageError.Error":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.usageError/github.com/benbjohnson/litestream/cmd/litestream.usageError.Error","kind":"method","span":{"start":[112,1],"end":[114,2],"bytes":[3261,3318]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.usageError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}}},"fields":{"hint":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.usageError/hint","kind":"field","type":"string","span":{"start":[109,1],"end":[109,16],"bytes":[3242,3257]}},"message":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.usageError/message","kind":"field","type":"string","span":{"start":[108,1],"end":[108,16],"bytes":[3226,3241]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","kind":"function","span":{"start":[393,1],"end":[416,2],"bytes":[11354,12395]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","parameters":[],"return_type":"github.com/benbjohnson/litestream/cmd/litestream.Config","metrics":{"cyclomatic":1},"body":{"410:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig@410:29","span":{"start":[410,29],"end":[410,61],"bytes":[12131,12163]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.DefaultSocketConfig"}}},"github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","kind":"function","span":{"start":[2098,1],"end":[2103,2],"bytes":[61937,62063]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"2099:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath@2099:10","span":{"start":[2099,10],"end":[2099,40],"bytes":[61980,62010]},"callee":"can://litestream/litestream/@external/os/Getenv"}}},"github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases","kind":"function","span":{"start":[1014,1],"end":[1048,2],"bytes":[31194,31886]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases","parameters":[{"name":"dir","type":"string","span":{"start":[1014,1],"end":[1014,89],"bytes":[31194,31282]}},{"name":"pattern","type":"string","span":{"start":[1014,1],"end":[1014,89],"bytes":[31194,31282]}},{"name":"recursive","type":"bool","span":{"start":[1014,1],"end":[1014,89],"bytes":[31194,31282]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"1017:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases@1017:9","span":{"start":[1017,9],"end":[1045,4],"bytes":[31314,31862]},"callee":"can://litestream/litestream/@external/path/filepath/Walk"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1","kind":"function","span":{"start":[1017,1],"end":[1045,4],"bytes":[31306,31862]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[1017,1],"end":[1017,82],"bytes":[31306,31387]}},{"name":"info","type":"os.FileInfo","span":{"start":[1017,1],"end":[1017,82],"bytes":[31306,31387]}},{"name":"err","type":"error","span":{"start":[1017,1],"end":[1017,82],"bytes":[31306,31387]}}],"return_type":"error","error_channel":["error"],"body":{"1023:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1@1023:6","span":{"start":[1023,6],"end":[1023,18],"bytes":[31469,31481]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir"},"1031:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1@1031:19","span":{"start":[1031,19],"end":[1031,63],"bytes":[31623,31667]},"callee":"can://litestream/litestream/@external/path/filepath/Match"},"1031:43":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1@1031:43","span":{"start":[1031,43],"end":[1031,62],"bytes":[31647,31666]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"1040:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1@1040:6","span":{"start":[1040,6],"end":[1040,28],"bytes":[31781,31803]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase"},"1041:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1@1041:14","span":{"start":[1041,14],"end":[1041,35],"bytes":[31819,31840]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","kind":"function","span":{"start":[1052,1],"end":[1066,2],"bytes":[31994,32312]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","parameters":[{"name":"path","type":"string","span":{"start":[1052,1],"end":[1052,42],"bytes":[31994,32035]}}],"return_type":"bool","metrics":{"cyclomatic":3},"body":{"1053:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase@1053:15","span":{"start":[1053,15],"end":[1053,28],"bytes":[32050,32063]},"callee":"can://litestream/litestream/@external/os/Open"},"1057:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase@1057:8","span":{"start":[1057,8],"end":[1057,20],"bytes":[32106,32118]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"1060:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase@1060:12","span":{"start":[1060,12],"end":[1060,28],"bytes":[32181,32197]},"callee":null},"1061:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase@1061:15","span":{"start":[1061,15],"end":[1061,32],"bytes":[32212,32229]},"callee":"can://litestream/litestream/@external/os/File.Read"},"1065:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase@1065:9","span":{"start":[1065,9],"end":[1065,23],"bytes":[32271,32285]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","kind":"function","span":{"start":[745,1],"end":[812,2],"bytes":[22735,24597]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","parameters":[{"name":"dbc","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[745,1],"end":[745,62],"bytes":[22735,22796]}}],"return_type":"(*github.com/benbjohnson/litestream.DB, error)","error_channel":["error"],"metrics":{"cyclomatic":17},"body":{"747:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@747:15","span":{"start":[747,15],"end":[747,73],"bytes":[22836,22894]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"750:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@750:21","span":{"start":[750,21],"end":[750,37],"bytes":[22919,22935]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"756:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@756:8","span":{"start":[756,8],"end":[756,36],"bytes":[23023,23051]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB"},"760:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@760:28","span":{"start":[760,28],"end":[760,49],"bytes":[23176,23197]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"762:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@762:16","span":{"start":[762,16],"end":[762,65],"bytes":[23231,23280]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"765:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@765:3","span":{"start":[765,3],"end":[765,35],"bytes":[23322,23354]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetMetaPath"},"790:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@790:29","span":{"start":[790,29],"end":[790,46],"bytes":[24038,24055]},"callee":null},"791:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@791:15","span":{"start":[791,15],"end":[791,62],"bytes":[24076,24123]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"792:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@792:29","span":{"start":[792,29],"end":[792,46],"bytes":[24152,24169]},"callee":null},"793:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@793:15","span":{"start":[793,15],"end":[793,82],"bytes":[24189,24256]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"794:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@794:7","span":{"start":[794,7],"end":[794,24],"bytes":[24263,24280]},"callee":null},"795:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@795:15","span":{"start":[795,15],"end":[795,91],"bytes":[24300,24376]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"805:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig@805:12","span":{"start":[805,12],"end":[805,40],"bytes":[24496,24524]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"}}},"github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","kind":"function","span":{"start":[815,1],"end":[864,2],"bytes":[24703,26250]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","parameters":[{"name":"dbc","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[815,1],"end":[815,74],"bytes":[24703,24776]}}],"return_type":"([]*github.com/benbjohnson/litestream.DB, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"817:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@817:15","span":{"start":[817,15],"end":[817,81],"bytes":[24811,24877]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"821:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@821:15","span":{"start":[821,15],"end":[821,74],"bytes":[24920,24979]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"824:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@824:15","span":{"start":[824,15],"end":[824,75],"bytes":[25045,25105]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"827:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@827:18","span":{"start":[827,18],"end":[827,33],"bytes":[25127,25142]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"833:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@833:18","span":{"start":[833,18],"end":[833,74],"bytes":[25246,25302]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases"},"835:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@835:15","span":{"start":[835,15],"end":[835,74],"bytes":[25334,25393]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"838:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@838:5","span":{"start":[838,5],"end":[838,17],"bytes":[25402,25414]},"callee":null},"839:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@839:15","span":{"start":[839,15],"end":[839,108],"bytes":[25450,25543]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"844:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@844:15","span":{"start":[844,15],"end":[844,38],"bytes":[25636,25659]},"callee":null},"847:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@847:14","span":{"start":[847,14],"end":[847,59],"bytes":[25708,25753]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry"},"849:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@849:16","span":{"start":[849,16],"end":[849,73],"bytes":[25787,25844]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"853:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@853:12","span":{"start":[853,12],"end":[853,25],"bytes":[25932,25945]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath"},"855:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@855:17","span":{"start":[855,17],"end":[855,158],"bytes":[26026,26167]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"860:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig@860:9","span":{"start":[860,9],"end":[860,24],"bytes":[26212,26227]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.NewMain":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewMain","kind":"function","span":{"start":[120,1],"end":[122,2],"bytes":[3430,3470]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewMain","parameters":[],"return_type":"*github.com/benbjohnson/litestream/cmd/litestream.Main","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","kind":"function","span":{"start":[1350,1],"end":[1418,2],"bytes":[40262,42418]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1350,1],"end":[1350,100],"bytes":[40262,40361]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[1350,1],"end":[1350,100],"bytes":[40262,40361]}}],"return_type":"(*github.com/benbjohnson/litestream.Replica, error)","error_channel":["error"],"metrics":{"cyclomatic":24},"body":{"1352:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1352:5","span":{"start":[1352,5],"end":[1352,29],"bytes":[40411,40435]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL"},"1353:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1353:15","span":{"start":[1353,15],"end":[1353,105],"bytes":[40452,40542]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1361:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1361:34","span":{"start":[1361,34],"end":[1361,55],"bytes":[40936,40957]},"callee":null},"1361:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1361:5","span":{"start":[1361,5],"end":[1361,26],"bytes":[40907,40928]},"callee":null},"1362:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1362:15","span":{"start":[1362,15],"end":[1362,134],"bytes":[40978,41097]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1366:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1366:7","span":{"start":[1366,7],"end":[1366,32],"bytes":[41127,41152]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica"},"1378:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1378:9","span":{"start":[1378,9],"end":[1378,24],"bytes":[41393,41408]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType"},"1380:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1380:22","span":{"start":[1380,22],"end":[1380,58],"bytes":[41446,41482]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig"},"1384:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1384:22","span":{"start":[1384,22],"end":[1384,56],"bytes":[41553,41587]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig"},"1388:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1388:22","span":{"start":[1388,22],"end":[1388,56],"bytes":[41658,41692]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig"},"1392:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1392:22","span":{"start":[1392,22],"end":[1392,57],"bytes":[41764,41799]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig"},"1396:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1396:22","span":{"start":[1396,22],"end":[1396,58],"bytes":[41872,41908]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig"},"1400:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1400:22","span":{"start":[1400,22],"end":[1400,60],"bytes":[41983,42021]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig"},"1404:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1404:22","span":{"start":[1404,22],"end":[1404,58],"bytes":[42094,42130]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig"},"1408:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1408:22","span":{"start":[1408,22],"end":[1408,57],"bytes":[42202,42237]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig"},"1412:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1412:15","span":{"start":[1412,15],"end":[1412,80],"bytes":[42299,42364]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1412:64":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1412:64","span":{"start":[1412,64],"end":[1412,79],"bytes":[42348,42363]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType"},"1415:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1415:2","span":{"start":[1415,2],"end":[1415,32],"bytes":[42370,42400]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger"},"1415:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig@1415:21","span":{"start":[1415,21],"end":[1415,31],"bytes":[42389,42399]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}}},"github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","kind":"function","span":{"start":[1453,1],"end":[1716,2],"bytes":[43507,51740]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1453,1],"end":[1453,110],"bytes":[43507,43616]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1453,1],"end":[1453,110],"bytes":[43507,43616]}}],"return_type":"(*github.com/benbjohnson/litestream/s3.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":53},"body":{"1456:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1456:15","span":{"start":[1456,15],"end":[1456,69],"bytes":[43724,43778]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1458:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1458:15","span":{"start":[1458,15],"end":[1458,71],"bytes":[43836,43892]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1464:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1464:17","span":{"start":[1464,17],"end":[1464,37],"bytes":[44053,44073]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting"},"1466:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1466:3","span":{"start":[1466,3],"end":[1466,22],"bytes":[44111,44130]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1468:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1468:31","span":{"start":[1468,31],"end":[1468,51],"bytes":[44164,44184]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting"},"1470:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1470:3","span":{"start":[1470,3],"end":[1470,36],"bytes":[44229,44262]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1472:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1472:20","span":{"start":[1472,20],"end":[1472,40],"bytes":[44285,44305]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting"},"1474:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1474:3","span":{"start":[1474,3],"end":[1474,25],"bytes":[44349,44371]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1504:36":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1504:36","span":{"start":[1504,36],"end":[1504,78],"bytes":[45149,45191]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery"},"1516:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1516:6","span":{"start":[1516,6],"end":[1516,37],"bytes":[45354,45385]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"1518:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1518:14","span":{"start":[1518,14],"end":[1518,46],"bytes":[45419,45451]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN"},"1520:51":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1520:51","span":{"start":[1520,51],"end":[1520,69],"bytes":[45513,45531]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost"},"1524:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1524:19","span":{"start":[1524,19],"end":[1524,40],"bytes":[45603,45624]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"1526:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1526:19","span":{"start":[1526,19],"end":[1526,61],"bytes":[45749,45791]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme"},"1529:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1529:7","span":{"start":[1529,7],"end":[1529,34],"bytes":[45903,45930]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"1534:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1534:17","span":{"start":[1534,17],"end":[1534,36],"bytes":[46021,46040]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"1537:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1537:25","span":{"start":[1537,25],"end":[1537,52],"bytes":[46107,46134]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"1540:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1540:21","span":{"start":[1540,21],"end":[1540,44],"bytes":[46231,46254]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"1543:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1543:15","span":{"start":[1543,15],"end":[1543,78],"bytes":[46332,46395]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"1547:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1547:15","span":{"start":[1547,15],"end":[1547,93],"bytes":[46466,46544]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"1551:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1551:15","span":{"start":[1551,15],"end":[1551,91],"bytes":[46629,46705]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"1555:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1555:11","span":{"start":[1555,11],"end":[1555,36],"bytes":[46784,46809]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"1557:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1557:18","span":{"start":[1557,18],"end":[1557,44],"bytes":[46859,46885]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"1560:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1560:20","span":{"start":[1560,20],"end":[1560,76],"bytes":[46941,46997]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue"},"1566:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1566:20","span":{"start":[1566,20],"end":[1566,66],"bytes":[47111,47157]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue"},"1593:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1593:4","span":{"start":[1593,4],"end":[1593,33],"bytes":[47684,47713]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1596:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1596:4","span":{"start":[1596,4],"end":[1596,54],"bytes":[47785,47835]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1599:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1599:4","span":{"start":[1599,4],"end":[1599,42],"bytes":[47895,47933]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set"},"1605:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1605:15","span":{"start":[1605,15],"end":[1605,59],"bytes":[48013,48057]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1610:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1610:15","span":{"start":[1610,15],"end":[1610,53],"bytes":[48236,48274]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint"},"1611:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1611:14","span":{"start":[1611,14],"end":[1611,51],"bytes":[48288,48325]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint"},"1612:37":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1612:37","span":{"start":[1612,37],"end":[1612,76],"bytes":[48362,48401]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint"},"1615:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1615:20","span":{"start":[1615,20],"end":[1615,63],"bytes":[48444,48487]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint"},"1616:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1616:17","span":{"start":[1616,17],"end":[1616,57],"bytes":[48504,48544]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint"},"1617:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1617:16","span":{"start":[1617,16],"end":[1617,55],"bytes":[48560,48599]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint"},"1618:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1618:16","span":{"start":[1618,16],"end":[1618,55],"bytes":[48615,48654]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint"},"1619:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1619:13","span":{"start":[1619,13],"end":[1619,49],"bytes":[48667,48703]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint"},"1620:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1620:20","span":{"start":[1620,20],"end":[1620,63],"bytes":[48723,48766]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint"},"1621:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1621:16","span":{"start":[1621,16],"end":[1621,55],"bytes":[48782,48821]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint"},"1630:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1630:3","span":{"start":[1630,3],"end":[1630,33],"bytes":[49163,49193]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault"},"1631:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1631:3","span":{"start":[1631,3],"end":[1631,37],"bytes":[49196,49230]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault"},"1635:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1635:3","span":{"start":[1635,3],"end":[1635,33],"bytes":[49438,49468]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault"},"1645:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1645:12","span":{"start":[1645,12],"end":[1645,33],"bytes":[49691,49712]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"1673:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1673:24","span":{"start":[1673,24],"end":[1673,41],"bytes":[50508,50525]},"callee":null},"1676:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1676:21","span":{"start":[1676,21],"end":[1676,39],"bytes":[50573,50591]},"callee":null},"1693:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1693:7","span":{"start":[1693,7],"end":[1693,38],"bytes":[51092,51123]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"1694:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1694:18","span":{"start":[1694,18],"end":[1694,34],"bytes":[51143,51159]},"callee":"can://litestream/litestream/@external/os/UserHomeDir"},"1696:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1696:18","span":{"start":[1696,18],"end":[1696,95],"bytes":[51197,51274]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1700:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1700:20","span":{"start":[1700,20],"end":[1700,40],"bytes":[51338,51358]},"callee":"can://litestream/litestream/@external/os/ReadFile"},"1702:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1702:17","span":{"start":[1702,17],"end":[1702,98],"bytes":[51394,51475]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1704:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1704:28","span":{"start":[1704,28],"end":[1704,62],"bytes":[51508,51542]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"1704:46":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig@1704:46","span":{"start":[1704,46],"end":[1704,61],"bytes":[51526,51541]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","kind":"function","span":{"start":[598,1],"end":[614,2],"bytes":[18049,18433]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","parameters":[{"name":"filename","type":"string","span":{"start":[598,1],"end":[598,62],"bytes":[18049,18110]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"600:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile@600:19","span":{"start":[600,19],"end":[600,35],"bytes":[18164,18180]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"606:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile@606:12","span":{"start":[606,12],"end":[606,29],"bytes":[18260,18277]},"callee":"can://litestream/litestream/@external/os/Open"},"607:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile@607:5","span":{"start":[607,5],"end":[607,23],"bytes":[18282,18300]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"608:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile@608:15","span":{"start":[608,15],"end":[608,68],"bytes":[18317,18370]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize","kind":"function","span":{"start":[1091,1],"end":[1109,2],"bytes":[33075,33569]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize","parameters":[{"name":"s","type":"string","span":{"start":[1091,1],"end":[1091,46],"bytes":[33075,33120]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1092:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize@1092:6","span":{"start":[1092,6],"end":[1092,26],"bytes":[33126,33146]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"1094:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize@1094:13","span":{"start":[1094,13],"end":[1094,44],"bytes":[33173,33204]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1098:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize@1098:16","span":{"start":[1098,16],"end":[1098,38],"bytes":[33274,33296]},"callee":null},"1100:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize@1100:13","span":{"start":[1100,13],"end":[1100,55],"bytes":[33326,33368]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1105:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize@1105:13","span":{"start":[1105,13],"end":[1105,98],"bytes":[33452,33537]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1105:77":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize@1105:77","span":{"start":[1105,77],"end":[1105,97],"bytes":[33516,33536]},"callee":null},"1108:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize@1108:9","span":{"start":[1108,9],"end":[1108,21],"bytes":[33550,33562]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ParseConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","kind":"function","span":{"start":[630,1],"end":[714,2],"bytes":[18928,21265]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","parameters":[{"name":"r","type":"io.Reader","span":{"start":[630,1],"end":[630,70],"bytes":[18928,18997]}},{"name":"expandEnv","type":"bool","span":{"start":[630,1],"end":[630,70],"bytes":[18928,18997]}}],"return_type":"(github.com/benbjohnson/litestream/cmd/litestream.Config, error)","error_channel":["error"],"metrics":{"cyclomatic":17},"body":{"631:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@631:12","span":{"start":[631,12],"end":[631,27],"bytes":[19009,19024]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig"},"634:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@634:14","span":{"start":[634,14],"end":[634,27],"bytes":[19063,19076]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"641:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@641:16","span":{"start":[641,16],"end":[646,5],"bytes":[19196,19337]},"callee":"can://litestream/litestream/@external/os/Expand"},"641:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@641:26","span":{"start":[641,26],"end":[641,37],"bytes":[19206,19217]},"callee":null},"641:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@641:9","span":{"start":[641,9],"end":[646,6],"bytes":[19189,19338]},"callee":null},"652:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@652:12","span":{"start":[652,12],"end":[652,37],"bytes":[19420,19445]},"callee":null},"664:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@664:12","span":{"start":[664,12],"end":[664,40],"bytes":[19919,19947]},"callee":null},"681:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@681:12","span":{"start":[681,12],"end":[681,95],"bytes":[20460,20543]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig"},"690:27":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@690:27","span":{"start":[690,27],"end":[690,48],"bytes":[20712,20733]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"696:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@696:2","span":{"start":[696,2],"end":[696,34],"bytes":[20844,20876]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings"},"699:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@699:12","span":{"start":[699,12],"end":[699,29],"bytes":[20916,20933]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate"},"708:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@708:10","span":{"start":[708,10],"end":[708,32],"bytes":[21084,21106]},"callee":"can://litestream/litestream/@external/os/Getenv"},"711:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig@711:2","span":{"start":[711,2],"end":[711,95],"bytes":[21149,21242]},"callee":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1","kind":"function","span":{"start":[641,1],"end":[646,6],"bytes":[19181,19338]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1","parameters":[{"name":"key","type":"string","span":{"start":[641,1],"end":[641,64],"bytes":[19181,19244]}}],"return_type":"string","body":{"643:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1@643:12","span":{"start":[643,12],"end":[643,37],"bytes":[19277,19302]},"callee":"can://litestream/litestream/@external/strconv/Itoa"},"643:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1@643:25","span":{"start":[643,25],"end":[643,36],"bytes":[19290,19301]},"callee":"can://litestream/litestream/@external/os/Getpid"},"645:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1@645:11","span":{"start":[645,11],"end":[645,25],"bytes":[19318,19332]},"callee":"can://litestream/litestream/@external/os/Getenv"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","kind":"function","span":{"start":[618,1],"end":[626,2],"bytes":[18589,18799]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","parameters":[{"name":"filename","type":"string","span":{"start":[618,1],"end":[618,71],"bytes":[18589,18659]}},{"name":"expandEnv","type":"bool","span":{"start":[618,1],"end":[618,71],"bytes":[18589,18659]}}],"return_type":"(github.com/benbjohnson/litestream/cmd/litestream.Config, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"619:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile@619:12","span":{"start":[619,12],"end":[619,36],"bytes":[18671,18695]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile"},"621:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile@621:10","span":{"start":[621,10],"end":[621,25],"bytes":[18722,18737]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig"},"623:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile@623:8","span":{"start":[623,8],"end":[623,17],"bytes":[18753,18762]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"625:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile@625:9","span":{"start":[625,9],"end":[625,34],"bytes":[18772,18797]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig"}}},"github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix","kind":"function","span":{"start":[2145,1],"end":[2155,2],"bytes":[63510,63754]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix","parameters":[{"name":"s","type":"string","span":{"start":[2145,1],"end":[2145,42],"bytes":[63510,63551]}}],"return_type":"string","metrics":{"cyclomatic":4},"body":{"2146:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix@2146:5","span":{"start":[2146,5],"end":[2146,11],"bytes":[63556,63562]},"callee":null},"2150:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix@2150:6","span":{"start":[2150,6],"end":[2150,34],"bytes":[63665,63693]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"2151:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix@2151:11","span":{"start":[2151,11],"end":[2151,40],"bytes":[63706,63735]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"}}},"github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL","kind":"function","span":{"start":[994,1],"end":[1010,2],"bytes":[30725,31084]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL","parameters":[{"name":"u","type":"*net/url.URL","span":{"start":[994,1],"end":[994,59],"bytes":[30725,30783]}},{"name":"relPath","type":"string","span":{"start":[994,1],"end":[994,59],"bytes":[30725,30783]}}],"metrics":{"cyclomatic":3},"body":{"1005:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL@1005:12","span":{"start":[1005,12],"end":[1005,41],"bytes":[30984,31013]},"callee":"can://litestream/litestream/@external/path/Join"},"1008:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL@1008:17","span":{"start":[1008,17],"end":[1008,48],"bytes":[31034,31065]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"995:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL@995:14","span":{"start":[995,14],"end":[995,46],"bytes":[30797,30829]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"}}},"github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","kind":"function","span":{"start":[2054,1],"end":[2065,2],"bytes":[60921,61280]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","parameters":[],"metrics":{"cyclomatic":5},"body":{"2055:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv@2055:14","span":{"start":[2055,14],"end":[2055,54],"bytes":[60962,61002]},"callee":"can://litestream/litestream/@external/os/LookupEnv"},"2056:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv@2056:15","span":{"start":[2056,15],"end":[2056,48],"bytes":[61023,61056]},"callee":"can://litestream/litestream/@external/os/LookupEnv"},"2057:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv@2057:4","span":{"start":[2057,4],"end":[2057,37],"bytes":[61067,61100]},"callee":"can://litestream/litestream/@external/os/Setenv"},"2060:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv@2060:14","span":{"start":[2060,14],"end":[2060,58],"bytes":[61121,61165]},"callee":"can://litestream/litestream/@external/os/LookupEnv"},"2061:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv@2061:15","span":{"start":[2061,15],"end":[2061,52],"bytes":[61186,61223]},"callee":"can://litestream/litestream/@external/os/LookupEnv"},"2062:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv@2062:4","span":{"start":[2062,4],"end":[2062,41],"bytes":[61234,61271]},"callee":"can://litestream/litestream/@external/os/Setenv"}}},"github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","kind":"function","span":{"start":[932,1],"end":[972,2],"bytes":[28919,29940]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","parameters":[{"name":"base","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[932,1],"end":[932,103],"bytes":[28919,29021]}},{"name":"relPath","type":"string","span":{"start":[932,1],"end":[932,103],"bytes":[28919,29021]}}],"return_type":"(*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig, error)","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"938:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@938:12","span":{"start":[938,12],"end":[938,37],"bytes":[29095,29120]},"callee":"can://litestream/litestream/@external/path/filepath/ToSlash"},"944:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@944:13","span":{"start":[944,13],"end":[944,39],"bytes":[29230,29256]},"callee":"can://litestream/litestream/@external/net/url/Parse"},"946:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@946:16","span":{"start":[946,16],"end":[946,56],"bytes":[29290,29330]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"948:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@948:3","span":{"start":[948,3],"end":[948,38],"bytes":[29337,29372]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL"},"949:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@949:21","span":{"start":[949,21],"end":[949,31],"bytes":[29393,29403]},"callee":"can://litestream/litestream/@external/net/url/URL.String"},"953:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@953:9","span":{"start":[953,9],"end":[953,27],"bytes":[29443,29461]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType"},"955:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@955:16","span":{"start":[955,16],"end":[955,43],"bytes":[29493,29520]},"callee":"can://litestream/litestream/@external/path/filepath/FromSlash"},"957:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@957:23","span":{"start":[957,23],"end":[957,65],"bytes":[29573,29615]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"963:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@963:15","span":{"start":[963,15],"end":[963,49],"bytes":[29756,29790]},"callee":"can://litestream/litestream/@external/path/filepath/ToSlash"},"965:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath@965:23","span":{"start":[965,23],"end":[965,51],"bytes":[29835,29863]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","kind":"function","span":{"start":[977,1],"end":[990,2],"bytes":[30181,30587]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","parameters":[{"name":"basePath","type":"string","span":{"start":[977,1],"end":[977,72],"bytes":[30181,30252]}},{"name":"relPath","type":"string","span":{"start":[977,1],"end":[977,72],"bytes":[30181,30252]}}],"return_type":"string","metrics":{"cyclomatic":3},"body":{"978:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry@978:12","span":{"start":[978,12],"end":[978,35],"bytes":[30264,30287]},"callee":"can://litestream/litestream/@external/path/filepath/Clean"},"983:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry@983:21","span":{"start":[983,21],"end":[983,44],"bytes":[30368,30391]},"callee":"can://litestream/litestream/@external/path/filepath/Split"},"985:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry@985:10","span":{"start":[985,10],"end":[985,42],"bytes":[30439,30471]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"989:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry@989:9","span":{"start":[989,9],"end":[989,53],"bytes":[30541,30585]},"callee":"can://litestream/litestream/@external/path/filepath/Join"}}},"github.com/benbjohnson/litestream/cmd/litestream.expand":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","kind":"function","span":{"start":[2117,1],"end":[2140,2],"bytes":[62581,63267]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.expand","parameters":[{"name":"s","type":"string","span":{"start":[2117,1],"end":[2117,40],"bytes":[62581,62620]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"2119:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand@2119:6","span":{"start":[2119,6],"end":[2119,26],"bytes":[62682,62702]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix"},"2122:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand@2122:18","span":{"start":[2122,18],"end":[2122,42],"bytes":[62792,62816]},"callee":null},"2123:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand@2123:18","span":{"start":[2123,18],"end":[2123,46],"bytes":[62834,62862]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"2124:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand@2124:10","span":{"start":[2124,10],"end":[2124,25],"bytes":[62874,62889]},"callee":"can://litestream/litestream/@external/path/filepath/Abs"},"2128:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand@2128:12","span":{"start":[2128,12],"end":[2128,26],"bytes":[62933,62947]},"callee":"can://litestream/litestream/@external/os/user/Current"},"2132:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand@2132:14","span":{"start":[2132,14],"end":[2132,81],"bytes":[63024,63091]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2139:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand@2139:34","span":{"start":[2139,34],"end":[2139,63],"bytes":[63230,63259]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"2139:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand@2139:9","span":{"start":[2139,9],"end":[2139,64],"bytes":[63205,63260]},"callee":"can://litestream/litestream/@external/path/filepath/Join"}}},"github.com/benbjohnson/litestream/cmd/litestream.init":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.init","kind":"function","span":{"start":[43,1],"end":[46,2],"bytes":[937,1023]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"44:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.init@44:11","span":{"start":[44,11],"end":[44,32],"bytes":[961,982]},"callee":"can://litestream/litestream/@external/runtime/debug/ReadBuildInfo"},"45:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.init@45:12","span":{"start":[45,12],"end":[45,39],"bytes":[994,1021]},"callee":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion"}}},"github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL","kind":"function","span":{"start":[2111,1],"end":[2113,2],"bytes":[62341,62460]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL","parameters":[{"name":"u","type":"string","span":{"start":[2111,1],"end":[2111,42],"bytes":[62341,62382]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"2112:44":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL@2112:44","span":{"start":[2112,44],"end":[2112,76],"bytes":[62426,62458]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"2112:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL@2112:9","span":{"start":[2112,9],"end":[2112,40],"bytes":[62391,62422]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"}}},"github.com/benbjohnson/litestream/cmd/litestream.main":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","kind":"function","span":{"start":[84,1],"end":[105,2],"bytes":[2611,3199]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.main","parameters":[],"metrics":{"cyclomatic":7},"body":{"100:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@100:6","span":{"start":[100,6],"end":[100,31],"bytes":[3066,3091]},"callee":"can://litestream/litestream/@external/errors/As"},"101:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@101:11","span":{"start":[101,11],"end":[101,61],"bytes":[3127,3177]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"},"103:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@103:3","span":{"start":[103,3],"end":[103,13],"bytes":[3184,3194]},"callee":"can://litestream/litestream/@external/os/Exit"},"85:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@85:2","span":{"start":[85,2],"end":[85,52],"bytes":[2626,2676]},"callee":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"87:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@87:7","span":{"start":[87,7],"end":[87,16],"bytes":[2684,2693]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewMain"},"88:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@88:12","span":{"start":[88,12],"end":[88,52],"bytes":[2705,2745]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run"},"88:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@88:18","span":{"start":[88,18],"end":[88,38],"bytes":[2711,2731]},"callee":"can://litestream/litestream/@external/context/Background"},"88:54":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@88:54","span":{"start":[88,54],"end":[88,77],"bytes":[2747,2770]},"callee":"can://litestream/litestream/@external/errors/Is"},"89:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@89:3","span":{"start":[89,3],"end":[89,13],"bytes":[2775,2785]},"callee":"can://litestream/litestream/@external/os/Exit"},"90:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@90:12","span":{"start":[90,12],"end":[90,40],"bytes":[2797,2825]},"callee":"can://litestream/litestream/@external/errors/Is"},"93:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@93:5","span":{"start":[93,5],"end":[93,15],"bytes":[2925,2935]},"callee":"can://litestream/litestream/@external/os/Exit"},"96:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@96:3","span":{"start":[96,3],"end":[96,13],"bytes":[2947,2957]},"callee":"can://litestream/litestream/@external/os/Exit"},"98:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main@98:10","span":{"start":[98,10],"end":[98,52],"bytes":[2991,3033]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"}}},"github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","kind":"function","span":{"start":[1758,1],"end":[1799,2],"bytes":[52933,54086]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1758,1],"end":[1758,112],"bytes":[52933,53044]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1758,1],"end":[1758,112],"bytes":[52933,53044]}}],"return_type":"(*github.com/benbjohnson/litestream/abs.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"1761:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig@1761:15","span":{"start":[1761,15],"end":[1761,70],"bytes":[53152,53207]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1763:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig@1763:15","span":{"start":[1763,15],"end":[1763,72],"bytes":[53265,53322]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1767:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig@1767:12","span":{"start":[1767,12],"end":[1767,34],"bytes":[53357,53379]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient"},"1777:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig@1777:13","span":{"start":[1777,13],"end":[1777,29],"bytes":[53632,53648]},"callee":"can://litestream/litestream/@external/net/url/Parse"},"1783:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig@1783:25","span":{"start":[1783,25],"end":[1783,42],"bytes":[53764,53781]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Username"},"1789:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig@1789:18","span":{"start":[1789,18],"end":[1789,61],"bytes":[53885,53928]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"1789:37":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig@1789:37","span":{"start":[1789,37],"end":[1789,55],"bytes":[53904,53922]},"callee":"can://litestream/litestream/@external/path/Clean"},"1795:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig@1795:15","span":{"start":[1795,15],"end":[1795,60],"bytes":[54015,54060]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting","kind":"function","span":{"start":[2072,1],"end":[2074,2],"bytes":[61335,61430]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting","parameters":[{"name":"defaultValue","type":"bool","span":{"start":[2072,1],"end":[2072,53],"bytes":[61335,61387]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream.boolSetting","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","kind":"function","span":{"start":[867,1],"end":[927,2],"bytes":[26354,28708]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","parameters":[{"name":"dbc","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[867,1],"end":[867,94],"bytes":[26354,26447]}},{"name":"dirPath","type":"string","span":{"start":[867,1],"end":[867,94],"bytes":[26354,26447]}},{"name":"dbPath","type":"string","span":{"start":[867,1],"end":[867,94],"bytes":[26354,26447]}}],"return_type":"(*github.com/benbjohnson/litestream.DB, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"869:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@869:18","span":{"start":[869,18],"end":[869,47],"bytes":[26513,26542]},"callee":"can://litestream/litestream/@external/path/filepath/Rel"},"871:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@871:15","span":{"start":[871,15],"end":[871,86],"bytes":[26574,26645]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"887:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@887:23","span":{"start":[887,23],"end":[887,43],"bytes":[27269,27289]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"889:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@889:16","span":{"start":[889,16],"end":[889,79],"bytes":[27323,27386]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"891:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@891:19","span":{"start":[891,19],"end":[891,79],"bytes":[27409,27469]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"895:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@895:24","span":{"start":[895,24],"end":[895,45],"bytes":[27589,27610]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"897:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@897:16","span":{"start":[897,16],"end":[897,80],"bytes":[27644,27708]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"899:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@899:19","span":{"start":[899,19],"end":[899,73],"bytes":[27731,27785]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry"},"907:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@907:23","span":{"start":[907,23],"end":[907,79],"bytes":[28041,28097]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath"},"909:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@909:16","span":{"start":[909,16],"end":[909,81],"bytes":[28131,28196]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"915:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@915:5","span":{"start":[915,5],"end":[915,22],"bytes":[28297,28314]},"callee":null},"916:27":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@916:27","span":{"start":[916,27],"end":[916,68],"bytes":[28347,28388]},"callee":null},"916:50":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@916:50","span":{"start":[916,50],"end":[916,67],"bytes":[28370,28387]},"callee":null},"918:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@918:24","span":{"start":[918,24],"end":[918,76],"bytes":[28453,28505]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath"},"920:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@920:17","span":{"start":[920,17],"end":[920,88],"bytes":[28541,28612]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"926:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry@926:9","span":{"start":[926,9],"end":[926,39],"bytes":[28676,28706]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"}}},"github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","kind":"function","span":{"start":[1421,1],"end":[1449,2],"bytes":[42518,43386]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1421,1],"end":[1421,114],"bytes":[42518,42631]}},{"name":"r","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1421,1],"end":[1421,114],"bytes":[42518,42631]}}],"return_type":"(*github.com/benbjohnson/litestream/file.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1424:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig@1424:15","span":{"start":[1424,15],"end":[1424,71],"bytes":[42726,42782]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1430:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig@1430:30","span":{"start":[1430,30],"end":[1430,63],"bytes":[42901,42934]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"},"1437:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig@1437:15","span":{"start":[1437,15],"end":[1437,55],"bytes":[43074,43114]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1441:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig@1441:23","span":{"start":[1441,23],"end":[1441,41],"bytes":[43190,43208]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"1446:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig@1446:12","span":{"start":[1446,12],"end":[1446,45],"bytes":[43311,43344]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","kind":"function","span":{"start":[1719,1],"end":[1755,2],"bytes":[51836,52835]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1719,1],"end":[1719,110],"bytes":[51836,51945]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1719,1],"end":[1719,110],"bytes":[51836,51945]}}],"return_type":"(*github.com/benbjohnson/litestream/gs.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"1722:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig@1722:15","span":{"start":[1722,15],"end":[1722,69],"bytes":[52053,52107]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1724:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig@1724:15","span":{"start":[1724,15],"end":[1724,71],"bytes":[52165,52221]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1731:27":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig@1731:27","span":{"start":[1731,27],"end":[1731,60],"bytes":[52354,52387]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"},"1747:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig@1747:15","span":{"start":[1747,15],"end":[1747,59],"bytes":[52663,52707]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1751:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig@1751:12","span":{"start":[1751,12],"end":[1751,33],"bytes":[52742,52763]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","kind":"function","span":{"start":[1913,1],"end":[1986,2],"bytes":[57244,59128]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1913,1],"end":[1913,114],"bytes":[57244,57357]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1913,1],"end":[1913,114],"bytes":[57244,57357]}}],"return_type":"(*github.com/benbjohnson/litestream/nats.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"1917:36":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig@1917:36","span":{"start":[1917,36],"end":[1917,69],"bytes":[57499,57532]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"},"1919:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig@1919:16","span":{"start":[1919,16],"end":[1919,55],"bytes":[57566,57605]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1922:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig@1922:16","span":{"start":[1922,16],"end":[1922,73],"bytes":[57649,57706]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1927:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig@1927:10","span":{"start":[1927,10],"end":[1927,40],"bytes":[57780,57810]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1932:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig@1932:13","span":{"start":[1932,13],"end":[1932,42],"bytes":[57887,57916]},"callee":"can://litestream/litestream/@external/strings/Trim"},"1943:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig@1943:15","span":{"start":[1943,15],"end":[1943,61],"bytes":[58091,58137]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1949:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig@1949:15","span":{"start":[1949,15],"end":[1949,108],"bytes":[58293,58386]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1953:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig@1953:12","span":{"start":[1953,12],"end":[1953,35],"bytes":[58427,58450]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","kind":"function","span":{"start":[1989,1],"end":[2049,2],"bytes":[59226,60733]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1989,1],"end":[1989,112],"bytes":[59226,59337]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1989,1],"end":[1989,112],"bytes":[59226,59337]}}],"return_type":"(*github.com/benbjohnson/litestream/oss.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1992:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig@1992:15","span":{"start":[1992,15],"end":[1992,70],"bytes":[59445,59500]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1994:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig@1994:15","span":{"start":[1994,15],"end":[1994,72],"bytes":[59558,59615]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2002:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig@2002:26","span":{"start":[2002,26],"end":[2002,59],"bytes":[59789,59822]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"},"2012:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig@2012:25","span":{"start":[2012,25],"end":[2012,44],"bytes":[59938,59957]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost"},"2028:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig@2028:15","span":{"start":[2028,15],"end":[2028,60],"bytes":[60239,60284]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2032:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig@2032:12","span":{"start":[2032,12],"end":[2032,34],"bytes":[60326,60348]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient"},"2042:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig@2042:21","span":{"start":[2042,21],"end":[2042,39],"bytes":[60621,60639]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","kind":"function","span":{"start":[1802,1],"end":[1856,2],"bytes":[54186,55646]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1802,1],"end":[1802,114],"bytes":[54186,54299]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1802,1],"end":[1802,114],"bytes":[54186,54299]}}],"return_type":"(*github.com/benbjohnson/litestream/sftp.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"1805:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig@1805:15","span":{"start":[1805,15],"end":[1805,71],"bytes":[54407,54463]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1807:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig@1807:15","span":{"start":[1807,15],"end":[1807,71],"bytes":[54519,54575]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1814:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig@1814:13","span":{"start":[1814,13],"end":[1814,29],"bytes":[54720,54736]},"callee":"can://litestream/litestream/@external/net/url/Parse"},"1824:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig@1824:11","span":{"start":[1824,11],"end":[1824,28],"bytes":[54929,54946]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Username"},"1827:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig@1827:18","span":{"start":[1827,18],"end":[1827,35],"bytes":[55007,55024]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Password"},"1836:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig@1836:15","span":{"start":[1836,15],"end":[1836,59],"bytes":[55141,55185]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1838:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig@1838:15","span":{"start":[1838,15],"end":[1838,59],"bytes":[55224,55268]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1842:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig@1842:12","span":{"start":[1842,12],"end":[1842,35],"bytes":[55303,55326]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","kind":"function","span":{"start":[1859,1],"end":[1910,2],"bytes":[55750,57144]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","parameters":[{"name":"c","type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig","span":{"start":[1859,1],"end":[1859,118],"bytes":[55750,55867]}},{"name":"_","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[1859,1],"end":[1859,118],"bytes":[55750,55867]}}],"return_type":"(*github.com/benbjohnson/litestream/webdav.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1862:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig@1862:15","span":{"start":[1862,15],"end":[1862,73],"bytes":[55975,56033]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1864:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig@1864:15","span":{"start":[1864,15],"end":[1864,79],"bytes":[56094,56158]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1871:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig@1871:13","span":{"start":[1871,13],"end":[1871,29],"bytes":[56333,56349]},"callee":"can://litestream/litestream/@external/net/url/Parse"},"1882:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig@1882:16","span":{"start":[1882,16],"end":[1882,54],"bytes":[56561,56599]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1887:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig@1887:15","span":{"start":[1887,15],"end":[1887,32],"bytes":[56692,56709]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Username"},"1890:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig@1890:18","span":{"start":[1890,18],"end":[1890,35],"bytes":[56770,56787]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Password"},"1899:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig@1899:15","span":{"start":[1899,15],"end":[1899,67],"bytes":[56909,56961]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1903:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig@1903:12","span":{"start":[1903,12],"end":[1903,37],"bytes":[56996,57021]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient"}}},"github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag":{"id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","kind":"function","span":{"start":[2105,1],"end":[2108,2],"bytes":[62065,62268]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","parameters":[{"name":"fs","type":"*flag.FlagSet","span":{"start":[2105,1],"end":[2105,84],"bytes":[62065,62148]}}],"return_type":"(*string, *bool)","metrics":{"cyclomatic":1},"body":{"2106:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag@2106:9","span":{"start":[2106,9],"end":[2106,47],"bytes":[62157,62195]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"2107:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag@2107:3","span":{"start":[2107,3],"end":[2107,70],"bytes":[62199,62266]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"}}}},"content_hash":"51dcf1279e9042b62f269d2b622f9f7fcf39650907d9e2c10f654c2b328a4ff6"},"cmd/litestream/main_notwindows.go":{"id":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,440]},"package":"main","source":"//go:build !windows\n\npackage main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n)\n\nconst defaultConfigPath = \"/etc/litestream.yml\"\n\nfunc isWindowsService() (bool, error) {\n\treturn false, nil\n}\n\nfunc runWindowsService(ctx context.Context) error {\n\tpanic(\"cannot run windows service as unix process\")\n}\n\nfunc signalChan() \u003c-chan os.Signal {\n\tch := make(chan os.Signal, 2)\n\tsignal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)\n\treturn ch\n}\n","imports":[{"name":"context","path":"context","span":{"start":[6,1],"end":[6,11],"bytes":[44,54]}},{"name":"os","path":"os","span":{"start":[7,1],"end":[7,6],"bytes":[55,60]}},{"name":"signal","path":"os/signal","span":{"start":[8,1],"end":[8,13],"bytes":[61,73]}},{"name":"syscall","path":"syscall","span":{"start":[9,1],"end":[9,11],"bytes":[74,84]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.isWindowsService":{"id":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.isWindowsService","kind":"function","span":{"start":[14,1],"end":[16,2],"bytes":[137,197]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.isWindowsService","parameters":[],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.runWindowsService":{"id":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.runWindowsService","kind":"function","span":{"start":[18,1],"end":[20,2],"bytes":[199,305]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.runWindowsService","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[18,1],"end":[18,52],"bytes":[199,250]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"19:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.runWindowsService@19:2","span":{"start":[19,2],"end":[19,53],"bytes":[252,303]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.signalChan":{"id":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan","kind":"function","span":{"start":[22,1],"end":[26,2],"bytes":[307,439]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.signalChan","parameters":[],"return_type":"\u003c-chan os.Signal","metrics":{"cyclomatic":1},"body":{"23:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan@23:8","span":{"start":[23,8],"end":[23,31],"bytes":[351,374]},"callee":null},"24:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan@24:2","span":{"start":[24,2],"end":[24,52],"bytes":[376,426]},"callee":"can://litestream/litestream/@external/os/signal/Notify"}}}},"content_hash":"63ed2fa53604bc509016c51dbc1552a4e4618d1a981a15c1301942a52a501bf3"},"cmd/litestream/mcp.go":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go","kind":"module","span":{"start":[1,1],"end":[347,1],"bytes":[0,12226]},"package":"main","source":"package main\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"os/exec\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/MadAppGang/httplog\"\n\t\"github.com/mark3labs/mcp-go/mcp\"\n\t\"github.com/mark3labs/mcp-go/server\"\n)\n\ntype MCPServer struct {\n\tctx context.Context\n\tmux *http.ServeMux\n\thttpServer *http.Server\n\tconfigPath string\n}\n\nfunc NewMCP(ctx context.Context, configPath string) (*MCPServer, error) {\n\ts := \u0026MCPServer{\n\t\tctx: ctx,\n\t\tconfigPath: configPath,\n\t}\n\n\tmcpServer := server.NewMCPServer(\n\t\t\"Litestream MCP Server\",\n\t\t\"1.0.0\",\n\t\tserver.WithToolCapabilities(false),\n\t\tserver.WithRecovery(),\n\t\tserver.WithLogging(),\n\t)\n\t// Add the tools to the server\n\tmcpServer.AddTool(InfoTool(configPath))\n\tmcpServer.AddTool(DatabasesTool(configPath))\n\tmcpServer.AddTool(RestoreTool(configPath))\n\tmcpServer.AddTool(LTXTool(configPath))\n\tmcpServer.AddTool(VersionTool())\n\tmcpServer.AddTool(StatusTool(configPath))\n\tmcpServer.AddTool(ResetTool(configPath))\n\n\ts.mux = http.NewServeMux()\n\ts.mux.Handle(\"/\", httplog.Logger(server.NewStreamableHTTPServer(mcpServer)))\n\treturn s, nil\n}\n\nfunc (s *MCPServer) Start(addr string) {\n\ts.httpServer = \u0026http.Server{\n\t\tAddr: addr,\n\t\tHandler: s.mux,\n\t\tReadHeaderTimeout: 30 * time.Second,\n\t}\n\tgo func() {\n\t\tslog.Info(\"Starting MCP Streamable HTTP server\", \"addr\", addr)\n\t\tif err := s.httpServer.ListenAndServe(); err != nil {\n\t\t\tslog.Error(\"MCP server error\", \"error\", err)\n\t\t}\n\t}()\n}\n\nfunc (s *MCPServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n\ts.mux.ServeHTTP(w, r)\n}\n\n// Close attempts to gracefully shutdown the server.\nfunc (s *MCPServer) Close() error {\n\tctx, cancel := context.WithTimeout(s.ctx, 10*time.Second)\n\tdefer cancel()\n\treturn s.httpServer.Shutdown(ctx)\n}\n\n// isReplicaURL returns true if the path looks like a replica URL (s3://, gs://, etc.)\n// rather than a local database path. The CLI rejects -config when using replica URLs.\nfunc isReplicaURL(path string) bool {\n\treturn strings.Contains(path, \"://\")\n}\n\nfunc DatabasesTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_databases\",\n\t\tmcp.WithDescription(\"List databases and their replicas as defined in the Litestream config file. The default path is /etc/litestream.yml but is not required.\"),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"databases\"}\n\t\tconfig := configPath\n\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\tconfig = configVal\n\t\t}\n\t\targs = append(args, \"-config\", config)\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc InfoTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_info\",\n\t\tmcp.WithDescription(\"Get a comprehensive summary of Litestream's current status including databases, LTX files, and version information.\"),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\tvar summary strings.Builder\n\t\tsummary.WriteString(\"=== Litestream Status Report ===\\n\\n\")\n\n\t\t// Get version info\n\t\tversionCmd := exec.CommandContext(ctx, \"litestream\", \"version\")\n\t\tversionOutput, err := versionCmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\tslog.Error(\"Failed to get version info\", \"error\", err)\n\t\t\treturn mcp.NewToolResultError(\"Failed to get version info: \" + err.Error()), nil\n\t\t}\n\t\tsummary.WriteString(\"Version Information:\\n\")\n\t\tsummary.WriteString(string(versionOutput))\n\t\tsummary.WriteString(\"\\n\")\n\n\t\t// Get databases info\n\t\targs := []string{\"databases\"}\n\t\tconfig := configPath\n\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\tconfig = configVal\n\t\t}\n\t\tsummary.WriteString(\"Current Config Path:\\n\")\n\t\tsummary.WriteString(config + \"\\n\\n\")\n\n\t\targs = append(args, \"-config\", config)\n\t\tdbCmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\tdbOutput, err := dbCmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\tslog.Error(\"Failed to get databases info\", \"error\", err)\n\t\t\treturn mcp.NewToolResultError(\"Failed to get databases info: \" + err.Error()), nil\n\t\t}\n\n\t\tsummary.WriteString(\"Databases:\\n\")\n\t\tsummary.WriteString(string(dbOutput))\n\t\tsummary.WriteString(\"\\n\")\n\n\t\t// Parse database paths from output\n\t\tscanner := bufio.NewScanner(strings.NewReader(string(dbOutput)))\n\t\t// Skip header line\n\t\tscanner.Scan()\n\t\tvar dbPaths []string\n\t\tfor scanner.Scan() {\n\t\t\tfields := strings.Fields(scanner.Text())\n\t\t\tif len(fields) \u003e 0 {\n\t\t\t\tdbPaths = append(dbPaths, fields[0])\n\t\t\t}\n\t\t}\n\n\t\t// Get LTX files info for each database\n\t\tsummary.WriteString(\"LTX Files:\\n\")\n\t\tfor _, dbPath := range dbPaths {\n\t\t\tltxArgs := []string{\"ltx\"}\n\t\t\tif config != \"\" {\n\t\t\t\tltxArgs = append(ltxArgs, \"-config\", config)\n\t\t\t}\n\t\t\tltxArgs = append(ltxArgs, dbPath)\n\t\t\tltxCmd := exec.CommandContext(ctx, \"litestream\", ltxArgs...)\n\t\t\tltxOutput, err := ltxCmd.CombinedOutput()\n\t\t\tif err != nil {\n\t\t\t\tsummary.WriteString(\"Failed to get LTX files for \" + dbPath + \": \" + err.Error() + \"\\n\")\n\t\t\t\tsummary.WriteString(string(ltxOutput))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsummary.WriteString(\"Database: \" + dbPath + \"\\n\")\n\t\t\tsummary.WriteString(string(ltxOutput))\n\t\t\tsummary.WriteString(\"\\n\")\n\t\t}\n\n\t\treturn mcp.NewToolResultText(summary.String()), nil\n\t}\n}\n\nfunc RestoreTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_restore\",\n\t\tmcp.WithDescription(\"Restore a database from a Litestream replica.\"),\n\t\tmcp.WithString(\"path\", mcp.Required(), mcp.Description(\"Database path or replica URL.\")),\n\t\tmcp.WithString(\"o\", mcp.Description(\"Output path for the restored database. Optional.\")),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t\tmcp.WithString(\"txid\", mcp.Description(\"Restore up to a specific transaction ID. Optional.\")),\n\t\tmcp.WithString(\"timestamp\", mcp.Description(\"Restore to a specific point-in-time (RFC3339). Optional.\")),\n\t\tmcp.WithString(\"parallelism\", mcp.Description(\"Number of WAL files to download in parallel. Optional.\")),\n\t\tmcp.WithBoolean(\"if_db_not_exists\", mcp.Description(\"Return 0 if the database already exists. Optional.\")),\n\t\tmcp.WithBoolean(\"if_replica_exists\", mcp.Description(\"Return 0 if no backups found. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"restore\"}\n\t\tif o, err := req.RequireString(\"o\"); err == nil {\n\t\t\targs = append(args, \"-o\", o)\n\t\t}\n\n\t\t// Get path first to determine if it's a replica URL\n\t\tpath, _ := req.RequireString(\"path\")\n\n\t\t// Only add -config for database paths, not replica URLs\n\t\t// The CLI rejects -config when restoring from a replica URL\n\t\tif !isReplicaURL(path) {\n\t\t\tconfig := configPath\n\t\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\t\tconfig = configVal\n\t\t\t}\n\t\t\tif config != \"\" {\n\t\t\t\targs = append(args, \"-config\", config)\n\t\t\t}\n\t\t}\n\n\t\tif txid, err := req.RequireString(\"txid\"); err == nil {\n\t\t\targs = append(args, \"-txid\", txid)\n\t\t}\n\t\tif timestamp, err := req.RequireString(\"timestamp\"); err == nil {\n\t\t\targs = append(args, \"-timestamp\", timestamp)\n\t\t}\n\t\tif parallelism, err := req.RequireString(\"parallelism\"); err == nil {\n\t\t\targs = append(args, \"-parallelism\", parallelism)\n\t\t}\n\t\tif ifDBNotExists, err := req.RequireBool(\"if_db_not_exists\"); err == nil {\n\t\t\targs = append(args, \"-if-db-not-exists\", strconv.FormatBool(ifDBNotExists))\n\t\t}\n\t\tif ifReplicaExists, err := req.RequireBool(\"if_replica_exists\"); err == nil {\n\t\t\targs = append(args, \"-if-replica-exists\", strconv.FormatBool(ifReplicaExists))\n\t\t}\n\t\tif path != \"\" {\n\t\t\targs = append(args, path)\n\t\t}\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc VersionTool() (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_version\",\n\t\tmcp.WithDescription(\"Print the Litestream binary version.\"),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", \"version\")\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc LTXTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_ltx\",\n\t\tmcp.WithDescription(\"List all LTX files for a database or replica URL.\"),\n\t\tmcp.WithString(\"path\", mcp.Required(), mcp.Description(\"Database path or replica URL.\")),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional, ignored for replica URLs.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"ltx\"}\n\n\t\t// Get path first to determine if it's a replica URL\n\t\tpath, _ := req.RequireString(\"path\")\n\n\t\t// Only add -config for database paths, not replica URLs\n\t\t// The CLI rejects -config when using a replica URL\n\t\tif !isReplicaURL(path) {\n\t\t\tconfig := configPath\n\t\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\t\tconfig = configVal\n\t\t\t}\n\t\t\tif config != \"\" {\n\t\t\t\targs = append(args, \"-config\", config)\n\t\t\t}\n\t\t}\n\n\t\tif path != \"\" {\n\t\t\targs = append(args, path)\n\t\t}\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc StatusTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_status\",\n\t\tmcp.WithDescription(\"Display replication status including database path, status, local transaction ID, and WAL size.\"),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t\tmcp.WithString(\"path\", mcp.Description(\"Filter to a specific database path. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"status\"}\n\t\tconfig := configPath\n\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\tconfig = configVal\n\t\t}\n\t\targs = append(args, \"-config\", config)\n\t\tif path, err := req.RequireString(\"path\"); err == nil {\n\t\t\targs = append(args, path)\n\t\t}\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n\nfunc ResetTool(configPath string) (mcp.Tool, server.ToolHandlerFunc) {\n\ttool := mcp.NewTool(\"litestream_reset\",\n\t\tmcp.WithDescription(\"Clear local Litestream state for a database. Removes local LTX files, forcing fresh snapshot on next sync. Database file is not modified.\"),\n\t\tmcp.WithString(\"path\", mcp.Required(), mcp.Description(\"Database path to reset.\")),\n\t\tmcp.WithString(\"config\", mcp.Description(\"Path to the Litestream config file. Optional.\")),\n\t)\n\n\treturn tool, func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n\t\targs := []string{\"reset\"}\n\t\tconfig := configPath\n\t\tif configVal, err := req.RequireString(\"config\"); err == nil {\n\t\t\tconfig = configVal\n\t\t}\n\t\targs = append(args, \"-config\", config)\n\t\tif path, err := req.RequireString(\"path\"); err == nil {\n\t\t\targs = append(args, path)\n\t\t}\n\t\tcmd := exec.CommandContext(ctx, \"litestream\", args...)\n\t\toutput, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\treturn mcp.NewToolResultError(strings.TrimSpace(string(output)) + \": \" + err.Error()), nil\n\t\t}\n\t\treturn mcp.NewToolResultText(string(output)), nil\n\t}\n}\n","imports":[{"name":"bufio","path":"bufio","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"slog","path":"log/slog","span":{"start":[6,1],"end":[6,12],"bytes":[43,54]}},{"name":"http","path":"net/http","span":{"start":[7,1],"end":[7,12],"bytes":[55,66]}},{"name":"exec","path":"os/exec","span":{"start":[8,1],"end":[8,11],"bytes":[67,77]}},{"name":"strconv","path":"strconv","span":{"start":[9,1],"end":[9,11],"bytes":[78,88]}},{"name":"strings","path":"strings","span":{"start":[10,1],"end":[10,11],"bytes":[89,99]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[100,107]}},{"name":"httplog","path":"github.com/MadAppGang/httplog","span":{"start":[13,1],"end":[13,33],"bytes":[109,141]}},{"name":"mcp","path":"github.com/mark3labs/mcp-go/mcp","span":{"start":[14,1],"end":[14,35],"bytes":[142,176]}},{"name":"server","path":"github.com/mark3labs/mcp-go/server","span":{"start":[15,1],"end":[15,38],"bytes":[177,214]}}],"types":{"MCPServer":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer","kind":"struct","span":{"start":[18,1],"end":[23,2],"bytes":[218,342]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close","kind":"method","span":{"start":[71,1],"end":[75,2],"bytes":[1608,1755]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"72:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close@72:17","span":{"start":[72,17],"end":[72,59],"bytes":[1660,1702]},"callee":"can://litestream/litestream/@external/context/WithTimeout"},"73:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close@73:8","span":{"start":[73,8],"end":[73,16],"bytes":[1710,1718]},"callee":null,"is_deferred":true},"74:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close@74:9","span":{"start":[74,9],"end":[74,35],"bytes":[1727,1753]},"callee":"can://litestream/litestream/@external/net/http/Server.Shutdown"}}},"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.ServeHTTP":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.ServeHTTP","kind":"method","span":{"start":[66,1],"end":[68,2],"bytes":[1457,1553]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.ServeHTTP","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[66,1],"end":[66,72],"bytes":[1457,1528]}},{"name":"r","type":"*net/http.Request","span":{"start":[66,1],"end":[66,72],"bytes":[1457,1528]}}],"metrics":{"cyclomatic":1},"body":{"67:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.ServeHTTP@67:2","span":{"start":[67,2],"end":[67,23],"bytes":[1530,1551]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.ServeHTTP"}}},"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start","kind":"method","span":{"start":[52,1],"end":[64,2],"bytes":[1095,1455]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start","parameters":[{"name":"addr","type":"string","span":{"start":[52,1],"end":[52,41],"bytes":[1095,1135]}}],"metrics":{"cyclomatic":2},"body":{"58:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start@58:5","span":{"start":[58,5],"end":[63,5],"bytes":[1267,1453]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1","kind":"function","span":{"start":[58,1],"end":[63,5],"bytes":[1263,1453]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1","parameters":[],"body":{"59:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1@59:3","span":{"start":[59,3],"end":[59,65],"bytes":[1278,1340]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"60:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1@60:13","span":{"start":[60,13],"end":[60,42],"bytes":[1353,1382]},"callee":"can://litestream/litestream/@external/net/http/Server.ListenAndServe"},"61:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1@61:4","span":{"start":[61,4],"end":[61,48],"bytes":[1400,1444]},"callee":"can://litestream/litestream/@external/log/slog/Error"}}}}}},"fields":{"configPath":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/configPath","kind":"field","type":"string","span":{"start":[22,1],"end":[22,19],"bytes":[322,340]}},"ctx":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/ctx","kind":"field","type":"context.Context","span":{"start":[19,1],"end":[19,28],"bytes":[242,269]}},"httpServer":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/httpServer","kind":"field","type":"*net/http.Server","span":{"start":[21,1],"end":[21,25],"bytes":[297,321]}},"mux":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/mux","kind":"field","type":"*net/http.ServeMux","span":{"start":[20,1],"end":[20,27],"bytes":[270,296]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool","kind":"function","span":{"start":[83,1],"end":[103,2],"bytes":[2010,2941]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool","parameters":[{"name":"configPath","type":"string","span":{"start":[83,1],"end":[83,75],"bytes":[2010,2084]}}],"return_type":"(invalid type, invalid type)","metrics":{"cyclomatic":3},"body":{"84:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool@84:10","span":{"start":[84,10],"end":[87,3],"bytes":[2094,2389]},"callee":null},"85:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool@85:3","span":{"start":[85,3],"end":[85,162],"bytes":[2132,2291]},"callee":null},"86:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool@86:28","span":{"start":[86,28],"end":[86,92],"bytes":[2320,2384]},"callee":null},"86:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool@86:3","span":{"start":[86,3],"end":[86,93],"bytes":[2295,2385]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1","kind":"function","span":{"start":[89,1],"end":[102,3],"bytes":[2391,2939]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[89,1],"end":[89,96],"bytes":[2391,2486]}},{"name":"req","type":"invalid type","span":{"start":[89,1],"end":[89,96],"bytes":[2391,2486]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"101:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@101:10","span":{"start":[101,10],"end":[101,47],"bytes":[2894,2931]},"callee":null},"101:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@101:32","span":{"start":[101,32],"end":[101,46],"bytes":[2916,2930]},"callee":null},"92:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@92:24","span":{"start":[92,24],"end":[92,51],"bytes":[2565,2592]},"callee":null},"95:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@95:10","span":{"start":[95,10],"end":[95,41],"bytes":[2642,2673]},"callee":null},"96:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@96:10","span":{"start":[96,10],"end":[96,57],"bytes":[2683,2730]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"97:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@97:18","span":{"start":[97,18],"end":[97,38],"bytes":[2748,2768]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"99:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@99:11","span":{"start":[99,11],"end":[99,89],"bytes":[2797,2875]},"callee":null},"99:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@99:34","span":{"start":[99,34],"end":[99,67],"bytes":[2820,2853]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"99:52":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@99:52","span":{"start":[99,52],"end":[99,66],"bytes":[2838,2852]},"callee":null},"99:77":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1@99:77","span":{"start":[99,77],"end":[99,88],"bytes":[2863,2874]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.InfoTool":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool","kind":"function","span":{"start":[105,1],"end":[181,2],"bytes":[2943,5619]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoTool","parameters":[{"name":"configPath","type":"string","span":{"start":[105,1],"end":[105,70],"bytes":[2943,3012]}}],"return_type":"(invalid type, invalid type)","metrics":{"cyclomatic":9},"body":{"106:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool@106:10","span":{"start":[106,10],"end":[109,3],"bytes":[3022,3291]},"callee":null},"107:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool@107:3","span":{"start":[107,3],"end":[107,141],"bytes":[3055,3193]},"callee":null},"108:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool@108:28","span":{"start":[108,28],"end":[108,92],"bytes":[3222,3286]},"callee":null},"108:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool@108:3","span":{"start":[108,3],"end":[108,93],"bytes":[3197,3287]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","kind":"function","span":{"start":[111,1],"end":[180,3],"bytes":[3293,5617]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[111,1],"end":[111,96],"bytes":[3293,3388]}},{"name":"req","type":"invalid type","span":{"start":[111,1],"end":[111,96],"bytes":[3293,3388]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"113:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@113:3","span":{"start":[113,3],"end":[113,62],"bytes":[3421,3480]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"116:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@116:17","span":{"start":[116,17],"end":[116,66],"bytes":[3520,3569]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"117:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@117:25","span":{"start":[117,25],"end":[117,52],"bytes":[3594,3621]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"119:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@119:4","span":{"start":[119,4],"end":[119,58],"bytes":[3643,3697]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"120:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@120:11","span":{"start":[120,11],"end":[120,79],"bytes":[3708,3776]},"callee":null},"120:67":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@120:67","span":{"start":[120,67],"end":[120,78],"bytes":[3764,3775]},"callee":null},"122:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@122:3","span":{"start":[122,3],"end":[122,48],"bytes":[3788,3833]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"123:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@123:23","span":{"start":[123,23],"end":[123,44],"bytes":[3856,3877]},"callee":null},"123:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@123:3","span":{"start":[123,3],"end":[123,45],"bytes":[3836,3878]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"124:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@124:3","span":{"start":[124,3],"end":[124,28],"bytes":[3881,3906]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"129:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@129:24","span":{"start":[129,24],"end":[129,51],"bytes":[4010,4037]},"callee":null},"132:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@132:3","span":{"start":[132,3],"end":[132,48],"bytes":[4080,4125]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"133:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@133:3","span":{"start":[133,3],"end":[133,39],"bytes":[4128,4164]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"135:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@135:10","span":{"start":[135,10],"end":[135,41],"bytes":[4175,4206]},"callee":null},"136:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@136:12","span":{"start":[136,12],"end":[136,59],"bytes":[4218,4265]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"137:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@137:20","span":{"start":[137,20],"end":[137,42],"bytes":[4285,4307]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"139:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@139:4","span":{"start":[139,4],"end":[139,60],"bytes":[4329,4385]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"140:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@140:11","span":{"start":[140,11],"end":[140,81],"bytes":[4396,4466]},"callee":null},"140:69":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@140:69","span":{"start":[140,69],"end":[140,80],"bytes":[4454,4465]},"callee":null},"143:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@143:3","span":{"start":[143,3],"end":[143,38],"bytes":[4479,4514]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"144:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@144:23","span":{"start":[144,23],"end":[144,39],"bytes":[4537,4553]},"callee":null},"144:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@144:3","span":{"start":[144,3],"end":[144,40],"bytes":[4517,4554]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"145:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@145:3","span":{"start":[145,3],"end":[145,28],"bytes":[4557,4582]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"148:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@148:14","span":{"start":[148,14],"end":[148,67],"bytes":[4635,4688]},"callee":"can://litestream/litestream/@external/bufio/NewScanner"},"148:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@148:31","span":{"start":[148,31],"end":[148,66],"bytes":[4652,4687]},"callee":"can://litestream/litestream/@external/strings/NewReader"},"148:49":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@148:49","span":{"start":[148,49],"end":[148,65],"bytes":[4670,4686]},"callee":null},"150:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@150:3","span":{"start":[150,3],"end":[150,17],"bytes":[4713,4727]},"callee":"can://litestream/litestream/@external/bufio/Scanner.Scan"},"152:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@152:7","span":{"start":[152,7],"end":[152,21],"bytes":[4757,4771]},"callee":"can://litestream/litestream/@external/bufio/Scanner.Scan"},"153:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@153:14","span":{"start":[153,14],"end":[153,44],"bytes":[4787,4817]},"callee":"can://litestream/litestream/@external/strings/Fields"},"153:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@153:29","span":{"start":[153,29],"end":[153,43],"bytes":[4802,4816]},"callee":"can://litestream/litestream/@external/bufio/Scanner.Text"},"154:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@154:7","span":{"start":[154,7],"end":[154,18],"bytes":[4824,4835]},"callee":null},"155:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@155:15","span":{"start":[155,15],"end":[155,41],"bytes":[4856,4882]},"callee":null},"160:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@160:3","span":{"start":[160,3],"end":[160,38],"bytes":[4937,4972]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"164:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@164:15","span":{"start":[164,15],"end":[164,49],"bytes":[5073,5107]},"callee":null},"166:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@166:14","span":{"start":[166,14],"end":[166,37],"bytes":[5126,5149]},"callee":null},"167:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@167:14","span":{"start":[167,14],"end":[167,64],"bytes":[5163,5213]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"168:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@168:22","span":{"start":[168,22],"end":[168,45],"bytes":[5235,5258]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"170:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@170:5","span":{"start":[170,5],"end":[170,93],"bytes":[5282,5370]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"170:74":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@170:74","span":{"start":[170,74],"end":[170,85],"bytes":[5351,5362]},"callee":null},"171:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@171:25","span":{"start":[171,25],"end":[171,42],"bytes":[5395,5412]},"callee":null},"171:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@171:5","span":{"start":[171,5],"end":[171,43],"bytes":[5375,5413]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"174:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@174:4","span":{"start":[174,4],"end":[174,53],"bytes":[5435,5484]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"175:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@175:24","span":{"start":[175,24],"end":[175,41],"bytes":[5508,5525]},"callee":null},"175:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@175:4","span":{"start":[175,4],"end":[175,42],"bytes":[5488,5526]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"176:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@176:4","span":{"start":[176,4],"end":[176,29],"bytes":[5530,5555]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"179:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@179:10","span":{"start":[179,10],"end":[179,49],"bytes":[5570,5609]},"callee":null},"179:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1@179:32","span":{"start":[179,32],"end":[179,48],"bytes":[5592,5608]},"callee":"can://litestream/litestream/@external/strings/Builder.String"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.LTXTool":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool","kind":"function","span":{"start":[259,1],"end":[294,2],"bytes":[8792,10060]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.LTXTool","parameters":[{"name":"configPath","type":"string","span":{"start":[259,1],"end":[259,69],"bytes":[8792,8860]}}],"return_type":"(invalid type, invalid type)","metrics":{"cyclomatic":6},"body":{"260:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool@260:10","span":{"start":[260,10],"end":[264,3],"bytes":[8870,9190]},"callee":null},"261:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool@261:3","span":{"start":[261,3],"end":[261,75],"bytes":[8902,8974]},"callee":null},"262:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool@262:26","span":{"start":[262,26],"end":[262,40],"bytes":[9001,9015]},"callee":null},"262:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool@262:3","span":{"start":[262,3],"end":[262,91],"bytes":[8978,9066]},"callee":null},"262:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool@262:42","span":{"start":[262,42],"end":[262,90],"bytes":[9017,9065]},"callee":null},"263:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool@263:28","span":{"start":[263,28],"end":[263,118],"bytes":[9095,9185]},"callee":null},"263:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool@263:3","span":{"start":[263,3],"end":[263,119],"bytes":[9070,9186]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1","kind":"function","span":{"start":[266,1],"end":[293,3],"bytes":[9192,10058]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[266,1],"end":[266,96],"bytes":[9192,9287]}},{"name":"req","type":"invalid type","span":{"start":[266,1],"end":[266,96],"bytes":[9192,9287]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"270:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@270:14","span":{"start":[270,14],"end":[270,39],"bytes":[9383,9408]},"callee":null},"274:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@274:7","span":{"start":[274,7],"end":[274,25],"bytes":[9529,9547]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL"},"276:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@276:25","span":{"start":[276,25],"end":[276,52],"bytes":[9598,9625]},"callee":null},"280:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@280:12","span":{"start":[280,12],"end":[280,43],"bytes":[9700,9731]},"callee":null},"285:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@285:11","span":{"start":[285,11],"end":[285,29],"bytes":[9770,9788]},"callee":null},"287:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@287:10","span":{"start":[287,10],"end":[287,57],"bytes":[9802,9849]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"288:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@288:18","span":{"start":[288,18],"end":[288,38],"bytes":[9867,9887]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"290:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@290:11","span":{"start":[290,11],"end":[290,89],"bytes":[9916,9994]},"callee":null},"290:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@290:34","span":{"start":[290,34],"end":[290,67],"bytes":[9939,9972]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"290:52":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@290:52","span":{"start":[290,52],"end":[290,66],"bytes":[9957,9971]},"callee":null},"290:77":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@290:77","span":{"start":[290,77],"end":[290,88],"bytes":[9982,9993]},"callee":null},"292:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@292:10","span":{"start":[292,10],"end":[292,47],"bytes":[10013,10050]},"callee":null},"292:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1@292:32","span":{"start":[292,32],"end":[292,46],"bytes":[10035,10049]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.NewMCP":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","kind":"function","span":{"start":[25,1],"end":[50,2],"bytes":[344,1093]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewMCP","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[25,1],"end":[25,74],"bytes":[344,417]}},{"name":"configPath","type":"string","span":{"start":[25,1],"end":[25,74],"bytes":[344,417]}}],"return_type":"(*github.com/benbjohnson/litestream/cmd/litestream.MCPServer, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"31:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@31:15","span":{"start":[31,15],"end":[37,3],"bytes":[499,647]},"callee":null},"34:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@34:3","span":{"start":[34,3],"end":[34,37],"bytes":[560,594]},"callee":null},"35:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@35:3","span":{"start":[35,3],"end":[35,24],"bytes":[598,619]},"callee":null},"36:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@36:3","span":{"start":[36,3],"end":[36,23],"bytes":[623,643]},"callee":null},"39:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@39:2","span":{"start":[39,2],"end":[39,41],"bytes":[681,720]},"callee":null},"39:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@39:20","span":{"start":[39,20],"end":[39,40],"bytes":[699,719]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool"},"40:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@40:2","span":{"start":[40,2],"end":[40,46],"bytes":[722,766]},"callee":null},"40:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@40:20","span":{"start":[40,20],"end":[40,45],"bytes":[740,765]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool"},"41:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@41:2","span":{"start":[41,2],"end":[41,44],"bytes":[768,810]},"callee":null},"41:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@41:20","span":{"start":[41,20],"end":[41,43],"bytes":[786,809]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool"},"42:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@42:2","span":{"start":[42,2],"end":[42,40],"bytes":[812,850]},"callee":null},"42:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@42:20","span":{"start":[42,20],"end":[42,39],"bytes":[830,849]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool"},"43:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@43:2","span":{"start":[43,2],"end":[43,34],"bytes":[852,884]},"callee":null},"43:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@43:20","span":{"start":[43,20],"end":[43,33],"bytes":[870,883]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool"},"44:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@44:2","span":{"start":[44,2],"end":[44,43],"bytes":[886,927]},"callee":null},"44:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@44:20","span":{"start":[44,20],"end":[44,42],"bytes":[904,926]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool"},"45:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@45:2","span":{"start":[45,2],"end":[45,42],"bytes":[929,969]},"callee":null},"45:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@45:20","span":{"start":[45,20],"end":[45,41],"bytes":[947,968]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool"},"47:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@47:10","span":{"start":[47,10],"end":[47,28],"bytes":[980,998]},"callee":"can://litestream/litestream/@external/net/http/NewServeMux"},"48:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@48:2","span":{"start":[48,2],"end":[48,78],"bytes":[1000,1076]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.Handle"},"48:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@48:20","span":{"start":[48,20],"end":[48,77],"bytes":[1018,1075]},"callee":null},"48:35":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP@48:35","span":{"start":[48,35],"end":[48,76],"bytes":[1033,1074]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.ResetTool":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool","kind":"function","span":{"start":[322,1],"end":[346,2],"bytes":[11128,12225]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ResetTool","parameters":[{"name":"configPath","type":"string","span":{"start":[322,1],"end":[322,71],"bytes":[11128,11198]}}],"return_type":"(invalid type, invalid type)","metrics":{"cyclomatic":4},"body":{"323:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool@323:10","span":{"start":[323,10],"end":[327,3],"bytes":[11208,11586]},"callee":null},"324:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool@324:3","span":{"start":[324,3],"end":[324,163],"bytes":[11242,11402]},"callee":null},"325:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool@325:26","span":{"start":[325,26],"end":[325,40],"bytes":[11429,11443]},"callee":null},"325:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool@325:3","span":{"start":[325,3],"end":[325,85],"bytes":[11406,11488]},"callee":null},"325:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool@325:42","span":{"start":[325,42],"end":[325,84],"bytes":[11445,11487]},"callee":null},"326:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool@326:28","span":{"start":[326,28],"end":[326,92],"bytes":[11517,11581]},"callee":null},"326:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool@326:3","span":{"start":[326,3],"end":[326,93],"bytes":[11492,11582]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1","kind":"function","span":{"start":[329,1],"end":[345,3],"bytes":[11588,12223]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[329,1],"end":[329,96],"bytes":[11588,11683]}},{"name":"req","type":"invalid type","span":{"start":[329,1],"end":[329,96],"bytes":[11588,11683]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"332:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@332:24","span":{"start":[332,24],"end":[332,51],"bytes":[11758,11785]},"callee":null},"335:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@335:10","span":{"start":[335,10],"end":[335,41],"bytes":[11835,11866]},"callee":null},"336:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@336:19","span":{"start":[336,19],"end":[336,44],"bytes":[11885,11910]},"callee":null},"337:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@337:11","span":{"start":[337,11],"end":[337,29],"bytes":[11935,11953]},"callee":null},"339:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@339:10","span":{"start":[339,10],"end":[339,57],"bytes":[11967,12014]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"340:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@340:18","span":{"start":[340,18],"end":[340,38],"bytes":[12032,12052]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"342:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@342:11","span":{"start":[342,11],"end":[342,89],"bytes":[12081,12159]},"callee":null},"342:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@342:34","span":{"start":[342,34],"end":[342,67],"bytes":[12104,12137]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"342:52":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@342:52","span":{"start":[342,52],"end":[342,66],"bytes":[12122,12136]},"callee":null},"342:77":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@342:77","span":{"start":[342,77],"end":[342,88],"bytes":[12147,12158]},"callee":null},"344:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@344:10","span":{"start":[344,10],"end":[344,47],"bytes":[12178,12215]},"callee":null},"344:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1@344:32","span":{"start":[344,32],"end":[344,46],"bytes":[12200,12214]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreTool":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool","kind":"function","span":{"start":[183,1],"end":[242,2],"bytes":[5621,8257]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreTool","parameters":[{"name":"configPath","type":"string","span":{"start":[183,1],"end":[183,73],"bytes":[5621,5693]}}],"return_type":"(invalid type, invalid type)","metrics":{"cyclomatic":12},"body":{"184:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@184:10","span":{"start":[184,10],"end":[194,3],"bytes":[5703,6612]},"callee":null},"185:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@185:3","span":{"start":[185,3],"end":[185,71],"bytes":[5739,5807]},"callee":null},"186:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@186:26","span":{"start":[186,26],"end":[186,40],"bytes":[5834,5848]},"callee":null},"186:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@186:3","span":{"start":[186,3],"end":[186,91],"bytes":[5811,5899]},"callee":null},"186:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@186:42","span":{"start":[186,42],"end":[186,90],"bytes":[5850,5898]},"callee":null},"187:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@187:23","span":{"start":[187,23],"end":[187,90],"bytes":[5923,5990]},"callee":null},"187:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@187:3","span":{"start":[187,3],"end":[187,91],"bytes":[5903,5991]},"callee":null},"188:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@188:28","span":{"start":[188,28],"end":[188,92],"bytes":[6020,6084]},"callee":null},"188:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@188:3","span":{"start":[188,3],"end":[188,93],"bytes":[5995,6085]},"callee":null},"189:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@189:26","span":{"start":[189,26],"end":[189,95],"bytes":[6112,6181]},"callee":null},"189:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@189:3","span":{"start":[189,3],"end":[189,96],"bytes":[6089,6182]},"callee":null},"190:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@190:3","span":{"start":[190,3],"end":[190,107],"bytes":[6186,6290]},"callee":null},"190:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@190:31","span":{"start":[190,31],"end":[190,106],"bytes":[6214,6289]},"callee":null},"191:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@191:3","span":{"start":[191,3],"end":[191,107],"bytes":[6294,6398]},"callee":null},"191:33":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@191:33","span":{"start":[191,33],"end":[191,106],"bytes":[6324,6397]},"callee":null},"192:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@192:3","span":{"start":[192,3],"end":[192,109],"bytes":[6402,6508]},"callee":null},"192:39":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@192:39","span":{"start":[192,39],"end":[192,108],"bytes":[6438,6507]},"callee":null},"193:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@193:3","span":{"start":[193,3],"end":[193,99],"bytes":[6512,6608]},"callee":null},"193:40":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool@193:40","span":{"start":[193,40],"end":[193,98],"bytes":[6549,6607]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","kind":"function","span":{"start":[196,1],"end":[241,3],"bytes":[6614,8255]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[196,1],"end":[196,96],"bytes":[6614,6709]}},{"name":"req","type":"invalid type","span":{"start":[196,1],"end":[196,96],"bytes":[6614,6709]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"198:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@198:16","span":{"start":[198,16],"end":[198,38],"bytes":[6755,6777]},"callee":null},"199:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@199:11","span":{"start":[199,11],"end":[199,32],"bytes":[6802,6823]},"callee":null},"203:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@203:14","span":{"start":[203,14],"end":[203,39],"bytes":[6897,6922]},"callee":null},"207:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@207:7","span":{"start":[207,7],"end":[207,25],"bytes":[7052,7070]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL"},"209:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@209:25","span":{"start":[209,25],"end":[209,52],"bytes":[7121,7148]},"callee":null},"213:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@213:12","span":{"start":[213,12],"end":[213,43],"bytes":[7223,7254]},"callee":null},"217:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@217:19","span":{"start":[217,19],"end":[217,44],"bytes":[7283,7308]},"callee":null},"218:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@218:11","span":{"start":[218,11],"end":[218,38],"bytes":[7333,7360]},"callee":null},"220:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@220:24","span":{"start":[220,24],"end":[220,54],"bytes":[7388,7418]},"callee":null},"221:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@221:11","span":{"start":[221,11],"end":[221,48],"bytes":[7443,7480]},"callee":null},"223:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@223:26","span":{"start":[223,26],"end":[223,58],"bytes":[7510,7542]},"callee":null},"224:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@224:11","span":{"start":[224,11],"end":[224,52],"bytes":[7567,7608]},"callee":null},"226:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@226:28","span":{"start":[226,28],"end":[226,63],"bytes":[7640,7675]},"callee":null},"227:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@227:11","span":{"start":[227,11],"end":[227,79],"bytes":[7700,7768]},"callee":null},"227:45":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@227:45","span":{"start":[227,45],"end":[227,78],"bytes":[7734,7767]},"callee":"can://litestream/litestream/@external/strconv/FormatBool"},"229:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@229:30","span":{"start":[229,30],"end":[229,66],"bytes":[7802,7838]},"callee":null},"230:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@230:11","span":{"start":[230,11],"end":[230,82],"bytes":[7863,7934]},"callee":null},"230:46":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@230:46","span":{"start":[230,46],"end":[230,81],"bytes":[7898,7933]},"callee":"can://litestream/litestream/@external/strconv/FormatBool"},"233:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@233:11","span":{"start":[233,11],"end":[233,29],"bytes":[7967,7985]},"callee":null},"235:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@235:10","span":{"start":[235,10],"end":[235,57],"bytes":[7999,8046]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"236:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@236:18","span":{"start":[236,18],"end":[236,38],"bytes":[8064,8084]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"238:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@238:11","span":{"start":[238,11],"end":[238,89],"bytes":[8113,8191]},"callee":null},"238:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@238:34","span":{"start":[238,34],"end":[238,67],"bytes":[8136,8169]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"238:52":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@238:52","span":{"start":[238,52],"end":[238,66],"bytes":[8154,8168]},"callee":null},"238:77":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@238:77","span":{"start":[238,77],"end":[238,88],"bytes":[8179,8190]},"callee":null},"240:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@240:10","span":{"start":[240,10],"end":[240,47],"bytes":[8210,8247]},"callee":null},"240:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1@240:32","span":{"start":[240,32],"end":[240,46],"bytes":[8232,8246]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.StatusTool":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool","kind":"function","span":{"start":[296,1],"end":[320,2],"bytes":[10062,11126]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusTool","parameters":[{"name":"configPath","type":"string","span":{"start":[296,1],"end":[296,72],"bytes":[10062,10133]}}],"return_type":"(invalid type, invalid type)","metrics":{"cyclomatic":4},"body":{"297:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool@297:10","span":{"start":[297,10],"end":[301,3],"bytes":[10143,10486]},"callee":null},"298:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool@298:3","span":{"start":[298,3],"end":[298,121],"bytes":[10178,10296]},"callee":null},"299:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool@299:28","span":{"start":[299,28],"end":[299,92],"bytes":[10325,10389]},"callee":null},"299:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool@299:3","span":{"start":[299,3],"end":[299,93],"bytes":[10300,10390]},"callee":null},"300:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool@300:26","span":{"start":[300,26],"end":[300,90],"bytes":[10417,10481]},"callee":null},"300:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool@300:3","span":{"start":[300,3],"end":[300,91],"bytes":[10394,10482]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1","kind":"function","span":{"start":[303,1],"end":[319,3],"bytes":[10488,11124]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[303,1],"end":[303,96],"bytes":[10488,10583]}},{"name":"req","type":"invalid type","span":{"start":[303,1],"end":[303,96],"bytes":[10488,10583]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"306:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@306:24","span":{"start":[306,24],"end":[306,51],"bytes":[10659,10686]},"callee":null},"309:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@309:10","span":{"start":[309,10],"end":[309,41],"bytes":[10736,10767]},"callee":null},"310:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@310:19","span":{"start":[310,19],"end":[310,44],"bytes":[10786,10811]},"callee":null},"311:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@311:11","span":{"start":[311,11],"end":[311,29],"bytes":[10836,10854]},"callee":null},"313:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@313:10","span":{"start":[313,10],"end":[313,57],"bytes":[10868,10915]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"314:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@314:18","span":{"start":[314,18],"end":[314,38],"bytes":[10933,10953]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"316:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@316:11","span":{"start":[316,11],"end":[316,89],"bytes":[10982,11060]},"callee":null},"316:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@316:34","span":{"start":[316,34],"end":[316,67],"bytes":[11005,11038]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"316:52":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@316:52","span":{"start":[316,52],"end":[316,66],"bytes":[11023,11037]},"callee":null},"316:77":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@316:77","span":{"start":[316,77],"end":[316,88],"bytes":[11048,11059]},"callee":null},"318:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@318:10","span":{"start":[318,10],"end":[318,47],"bytes":[11079,11116]},"callee":null},"318:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1@318:32","span":{"start":[318,32],"end":[318,46],"bytes":[11101,11115]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.VersionTool":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool","kind":"function","span":{"start":[244,1],"end":[257,2],"bytes":[8259,8790]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.VersionTool","parameters":[],"return_type":"(invalid type, invalid type)","metrics":{"cyclomatic":2},"body":{"245:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool@245:10","span":{"start":[245,10],"end":[247,3],"bytes":[8324,8423]},"callee":null},"246:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool@246:3","span":{"start":[246,3],"end":[246,62],"bytes":[8360,8419]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1","kind":"function","span":{"start":[249,1],"end":[256,3],"bytes":[8425,8788]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[249,1],"end":[249,96],"bytes":[8425,8520]}},{"name":"req","type":"invalid type","span":{"start":[249,1],"end":[249,96],"bytes":[8425,8520]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"250:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1@250:10","span":{"start":[250,10],"end":[250,59],"bytes":[8530,8579]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"251:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1@251:18","span":{"start":[251,18],"end":[251,38],"bytes":[8597,8617]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput"},"253:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1@253:11","span":{"start":[253,11],"end":[253,89],"bytes":[8646,8724]},"callee":null},"253:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1@253:34","span":{"start":[253,34],"end":[253,67],"bytes":[8669,8702]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"253:52":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1@253:52","span":{"start":[253,52],"end":[253,66],"bytes":[8687,8701]},"callee":null},"253:77":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1@253:77","span":{"start":[253,77],"end":[253,88],"bytes":[8712,8723]},"callee":null},"255:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1@255:10","span":{"start":[255,10],"end":[255,47],"bytes":[8743,8780]},"callee":null},"255:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1@255:32","span":{"start":[255,32],"end":[255,46],"bytes":[8765,8779]},"callee":null}}}}},"github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL":{"id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL","kind":"function","span":{"start":[79,1],"end":[81,2],"bytes":[1931,2008]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL","parameters":[{"name":"path","type":"string","span":{"start":[79,1],"end":[79,38],"bytes":[1931,1968]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"80:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL@80:9","span":{"start":[80,9],"end":[80,38],"bytes":[1977,2006]},"callee":"can://litestream/litestream/@external/strings/Contains"}}}},"content_hash":"8cec3283fc0c78fde1799fdc8062ab78364af351093c2e6f302fa2bc67bb60a7"},"cmd/litestream/register.go":{"id":"can://litestream/litestream/go/cmd/litestream/register.go","kind":"module","span":{"start":[1,1],"end":[170,1],"bytes":[0,4462]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\ntype RegisterCommand struct{}\n\nfunc (c *RegisterCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-register\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\treplicaFlag := fs.String(\"replica\", \"\", \"replica URL (e.g., s3://bucket/prefix, file:///backup/path)\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream register -replica s3://bucket/prefix /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\tif *replicaFlag == \"\" {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"-replica is required\",\n\t\t\thint: \"litestream register -replica s3://bucket/prefix /path/to/db\",\n\t\t}\n\t}\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\treplicaURL := *replicaFlag\n\n\t// Create HTTP client that connects via Unix socket with timeout.\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.RegisterDatabaseRequest{\n\t\tPath: dbPath,\n\t\tReplicaURL: replicaURL,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tresp, err := client.Post(\"http://localhost/register\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"register failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"register failed: %s\", string(body))\n\t}\n\n\tvar result litestream.RegisterDatabaseResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := RegisterResult{\n\t\tStatus: result.Status,\n\t\tDBPath: result.Path,\n\t\tReplica: replicaURL,\n\t\tSocket: *socketPath,\n\t}\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(confirmation, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"status: %s\\n\", registerDisplayStatus(confirmation.Status))\n\tfmt.Printf(\"db_path: %s\\n\", confirmation.DBPath)\n\tfmt.Printf(\"replica: %s\\n\", confirmation.Replica)\n\tfmt.Printf(\"socket: %s\\n\", confirmation.Socket)\n\n\treturn nil\n}\n\ntype RegisterResult struct {\n\tStatus string `json:\"status\"`\n\tDBPath string `json:\"db_path\"`\n\tReplica string `json:\"replica\"`\n\tSocket string `json:\"socket\"`\n}\n\nfunc registerDisplayStatus(status string) string {\n\tif status == \"already_registered\" {\n\t\treturn \"already registered\"\n\t}\n\treturn status\n}\n\nfunc (c *RegisterCommand) Usage() {\n\tfmt.Println(`\nusage: litestream register [OPTIONS] DB_PATH\n\nRegister a database for replication.\n\nArguments:\n DB_PATH Path to the SQLite database file.\n\nOptions:\n -replica URL\n Replica destination URL (e.g., s3://bucket/prefix, file:///backup/path).\n Required.\n\n -timeout SECONDS\n Maximum time to wait in seconds (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n # Register a database with an S3 replica.\n $ litestream register -replica s3://mybucket/db /path/to/db\n\n # Register a database with a file replica.\n $ litestream register -replica file:///backup/path /path/to/db\n\n # Register using a non-default control socket.\n $ litestream register -socket /tmp/litestream.sock -replica s3://mybucket/db /path/to/db\n\n # Register and emit a JSON confirmation.\n $ litestream register -json -replica s3://mybucket/db /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"RegisterCommand":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand","kind":"struct","span":{"start":[17,1],"end":[17,30],"bytes":[149,178]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","kind":"method","span":{"start":[19,1],"end":[117,2],"bytes":[180,3136]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[19,1],"end":[19,74],"bytes":[180,253]}},{"name":"args","type":"[]string","span":{"start":[19,1],"end":[19,74],"bytes":[180,253]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":14},"body":{"103:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@103:18","span":{"start":[103,18],"end":[103,60],"bytes":[2729,2771]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"105:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@105:11","span":{"start":[105,11],"end":[105,59],"bytes":[2800,2848]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"107:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@107:15","span":{"start":[107,15],"end":[107,29],"bytes":[2867,2881]},"callee":null},"107:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@107:3","span":{"start":[107,3],"end":[107,30],"bytes":[2855,2882]},"callee":"can://litestream/litestream/@external/fmt/Println"},"111:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@111:2","span":{"start":[111,2],"end":[111,72],"bytes":[2901,2971]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"111:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@111:29","span":{"start":[111,29],"end":[111,71],"bytes":[2928,2970]},"callee":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus"},"112:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@112:2","span":{"start":[112,2],"end":[112,50],"bytes":[2973,3021]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"113:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@113:2","span":{"start":[113,2],"end":[113,51],"bytes":[3023,3072]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"114:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@114:2","span":{"start":[114,2],"end":[114,49],"bytes":[3074,3121]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"20:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@20:8","span":{"start":[20,8],"end":[20,68],"bytes":[261,321]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"21:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@21:13","span":{"start":[21,13],"end":[21,56],"bytes":[334,377]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Int"},"22:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@22:16","span":{"start":[22,16],"end":[22,86],"bytes":[393,463]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"23:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@23:17","span":{"start":[23,17],"end":[23,104],"bytes":[480,567]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"24:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@24:16","span":{"start":[24,16],"end":[24,57],"bytes":[583,624]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"26:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@26:12","span":{"start":[26,12],"end":[26,26],"bytes":[656,670]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"30:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@30:5","span":{"start":[30,5],"end":[30,14],"bytes":[706,715]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"36:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@36:5","span":{"start":[36,5],"end":[36,14],"bytes":[869,878]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"37:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@37:10","span":{"start":[37,10],"end":[37,42],"bytes":[894,926]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"46:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@46:10","span":{"start":[46,10],"end":[46,54],"bytes":[1124,1168]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"49:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@49:12","span":{"start":[49,12],"end":[49,21],"bytes":[1184,1193]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"53:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@53:19","span":{"start":[53,19],"end":[53,42],"bytes":[1308,1331]},"callee":null},"67:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@67:18","span":{"start":[67,18],"end":[67,35],"bytes":[1690,1707]},"callee":"can://litestream/litestream/@external/encoding/json/Marshal"},"69:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@69:10","span":{"start":[69,10],"end":[69,58],"bytes":[1734,1782]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"72:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@72:15","span":{"start":[72,15],"end":[72,101],"bytes":[1801,1887]},"callee":"can://litestream/litestream/@external/net/http/Client.Post"},"72:76":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@72:76","span":{"start":[72,76],"end":[72,100],"bytes":[1862,1886]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"74:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@74:10","span":{"start":[74,10],"end":[74,68],"bytes":[1914,1972]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"76:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@76:8","span":{"start":[76,8],"end":[76,25],"bytes":[1983,2000]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"78:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@78:15","span":{"start":[78,15],"end":[78,36],"bytes":[2016,2037]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"80:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@80:10","span":{"start":[80,10],"end":[80,56],"bytes":[2064,2110]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"85:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@85:13","span":{"start":[85,13],"end":[85,43],"bytes":[2205,2235]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"86:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@86:11","span":{"start":[86,11],"end":[86,59],"bytes":[2283,2331]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"88:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@88:10","span":{"start":[88,10],"end":[88,57],"bytes":[2345,2392]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"88:44":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@88:44","span":{"start":[88,44],"end":[88,56],"bytes":[2379,2391]},"callee":null},"92:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@92:12","span":{"start":[92,12],"end":[92,41],"bytes":[2456,2485]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"93:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run@93:10","span":{"start":[93,10],"end":[93,57],"bytes":[2509,2556]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run.closure_1","kind":"function","span":{"start":[57,1],"end":[59,6],"bytes":[1427,1568]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[57,1],"end":[57,73],"bytes":[1427,1499]}},{"name":"_","type":"string","span":{"start":[57,1],"end":[57,73],"bytes":[1427,1499]}},{"name":"_","type":"string","span":{"start":[57,1],"end":[57,73],"bytes":[1427,1499]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"58:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run.closure_1@58:12","span":{"start":[58,12],"end":[58,63],"bytes":[1511,1562]},"callee":"can://litestream/litestream/@external/net/DialTimeout"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage","kind":"method","span":{"start":[133,1],"end":[169,2],"bytes":[3439,4461]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"134:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage@134:2","span":{"start":[134,2],"end":[168,7],"bytes":[3476,4459]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}},"RegisterResult":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult","kind":"struct","span":{"start":[119,1],"end":[124,2],"bytes":[3138,3298]},"callables":{},"fields":{"DBPath":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult/DBPath","kind":"field","type":"string","span":{"start":[121,1],"end":[121,33],"bytes":[3199,3231]}},"Replica":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult/Replica","kind":"field","type":"string","span":{"start":[122,1],"end":[122,33],"bytes":[3232,3264]}},"Socket":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult/Socket","kind":"field","type":"string","span":{"start":[123,1],"end":[123,32],"bytes":[3265,3296]}},"Status":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterResult/Status","kind":"field","type":"string","span":{"start":[120,1],"end":[120,32],"bytes":[3167,3198]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus":{"id":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus","kind":"function","span":{"start":[126,1],"end":[131,2],"bytes":[3300,3437]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus","parameters":[{"name":"status","type":"string","span":{"start":[126,1],"end":[126,51],"bytes":[3300,3350]}}],"return_type":"string","metrics":{"cyclomatic":2},"body":{}}},"content_hash":"bf7bcf0236ce1cfa7d72cbccf088d6c7625953264d19f1ec781e8b562b17b80e"},"cmd/litestream/replicate.go":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go","kind":"module","span":{"start":[1,1],"end":[576,1],"bytes":[0,18077]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t_ \"net/http/pprof\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\n\t\"github.com/mattn/go-shellwords\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/abs\"\n\t\"github.com/benbjohnson/litestream/file\"\n\t\"github.com/benbjohnson/litestream/gs\"\n\t\"github.com/benbjohnson/litestream/internal\"\n\t\"github.com/benbjohnson/litestream/nats\"\n\t\"github.com/benbjohnson/litestream/oss\"\n\t\"github.com/benbjohnson/litestream/s3\"\n\t\"github.com/benbjohnson/litestream/sftp\"\n)\n\n// ReplicateCommand represents a command that continuously replicates SQLite databases.\ntype ReplicateCommand struct {\n\tcmd *exec.Cmd // subcommand\n\texecCh chan error // subcommand error channel\n\n\t// One-shot replication flags\n\tonce bool // replicate once and exit\n\tforceSnapshot bool // force snapshot to all replicas\n\tenforceRetention bool // enforce retention of old snapshots\n\n\tConfig Config\n\n\t// MCP server\n\tMCP *MCPServer\n\n\t// Server for IPC control commands.\n\tServer *litestream.Server\n\n\t// Manages the set of databases \u0026 compaction levels.\n\tStore *litestream.Store\n\n\t// Directory monitors for dynamic database discovery.\n\tdirectoryMonitors []*DirectoryMonitor\n\n\t// Done channel for interrupt handling during shutdown. When closed,\n\t// the shutdown sync retry loop exits and any in-flight sync is cancelled.\n\tdone \u003c-chan struct{}\n}\n\nfunc NewReplicateCommand() *ReplicateCommand {\n\treturn \u0026ReplicateCommand{\n\t\texecCh: make(chan error),\n\t}\n}\n\n// ParseFlags parses the CLI flags and loads the configuration file.\nfunc (c *ReplicateCommand) ParseFlags(_ context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-replicate\", flag.ContinueOnError)\n\texecFlag := fs.String(\"exec\", \"\", \"execute subcommand\")\n\tlogLevelFlag := fs.String(\"log-level\", \"\", \"log level (trace, debug, info, warn, error)\")\n\trestoreIfDBNotExists := fs.Bool(\"restore-if-db-not-exists\", false, \"restore from replica if database doesn't exist\")\n\tonceFlag := fs.Bool(\"once\", false, \"replicate once and exit\")\n\tforceSnapshotFlag := fs.Bool(\"force-snapshot\", false, \"force snapshot when replicating once\")\n\tenforceRetentionFlag := fs.Bool(\"enforce-retention\", false, \"enforce retention of old snapshots when replicating once\")\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\t// Load configuration or use CLI args to build db/replica.\n\tswitch fs.NArg() {\n\tcase 0:\n\t\t// No arguments provided, use config file\n\t\tif *configPath == \"\" {\n\t\t\t*configPath = DefaultConfigPath()\n\t\t}\n\t\tif c.Config, err = ReadConfigFile(*configPath, !*noExpandEnv); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Override log level if CLI flag provided (takes precedence over env var)\n\t\tif *logLevelFlag != \"\" {\n\t\t\tc.Config.Logging.Level = *logLevelFlag\n\t\t\t// Set env var so initLog sees CLI flag as highest priority\n\t\t\tos.Setenv(\"LOG_LEVEL\", *logLevelFlag)\n\t\t\tlogOutput := os.Stdout\n\t\t\tif c.Config.Logging.Stderr {\n\t\t\t\tlogOutput = os.Stderr\n\t\t\t}\n\t\t\tinternal.InitLog(logOutput, c.Config.Logging.Level, c.Config.Logging.Type, c.Config.Logging.Source)\n\t\t}\n\n\tcase 1:\n\t\t// Only database path provided, missing replica URL\n\t\treturn fmt.Errorf(\"must specify at least one replica URL for %s\", fs.Arg(0))\n\n\tdefault:\n\t\t// Database path and replica URLs provided via CLI\n\t\tif *configPath != \"\" {\n\t\t\treturn fmt.Errorf(\"cannot specify a replica URL and the -config flag\")\n\t\t}\n\n\t\t// Initialize config with defaults when using command-line arguments\n\t\tc.Config = DefaultConfig()\n\t\tlogLevel := \"INFO\"\n\t\tif *logLevelFlag != \"\" {\n\t\t\tlogLevel = *logLevelFlag\n\t\t\t// Set env var so initLog sees CLI flag as highest priority\n\t\t\tos.Setenv(\"LOG_LEVEL\", *logLevelFlag)\n\t\t}\n\t\tc.Config.Logging.Level = logLevel\n\t\tinternal.InitLog(os.Stdout, logLevel, \"text\", false)\n\n\t\tdbConfig := \u0026DBConfig{\n\t\t\tPath: fs.Arg(0),\n\t\t\tRestoreIfDBNotExists: *restoreIfDBNotExists,\n\t\t}\n\t\tfor _, u := range fs.Args()[1:] {\n\t\t\t// Check if this looks like a flag that was placed after positional arguments\n\t\t\tif strings.HasPrefix(u, \"-\") {\n\t\t\t\treturn fmt.Errorf(\"flag %q must be positioned before DB_PATH and REPLICA_URL arguments\", u)\n\t\t\t}\n\t\t\tsyncInterval := litestream.DefaultSyncInterval\n\t\t\tdbConfig.Replicas = append(dbConfig.Replicas, \u0026ReplicaConfig{\n\t\t\t\tURL: u,\n\t\t\t\tReplicaSettings: ReplicaSettings{\n\t\t\t\t\tSyncInterval: \u0026syncInterval,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tc.Config.DBs = []*DBConfig{dbConfig}\n\t}\n\n\tc.Config.ConfigPath = *configPath\n\n\t// Override config exec command, if specified.\n\tif *execFlag != \"\" {\n\t\tc.Config.Exec = *execFlag\n\t}\n\n\t// Apply restore-if-db-not-exists flag to all databases if specified.\n\t// This allows the CLI flag to work with config files.\n\tif *restoreIfDBNotExists {\n\t\tfor _, dbConfig := range c.Config.DBs {\n\t\t\tdbConfig.RestoreIfDBNotExists = true\n\t\t}\n\t}\n\n\t// Set one-shot replication flags and validate their usage.\n\tc.once = *onceFlag\n\tc.forceSnapshot = *forceSnapshotFlag\n\tc.enforceRetention = *enforceRetentionFlag\n\n\t// Validate flag combinations.\n\tif c.once \u0026\u0026 c.Config.Exec != \"\" {\n\t\treturn fmt.Errorf(\"cannot specify -once flag with -exec\")\n\t}\n\tif c.forceSnapshot \u0026\u0026 !c.once {\n\t\treturn fmt.Errorf(\"cannot specify -force-snapshot flag without -once\")\n\t}\n\tif c.enforceRetention \u0026\u0026 !c.once {\n\t\treturn fmt.Errorf(\"cannot specify -enforce-retention flag without -once\")\n\t}\n\n\treturn nil\n}\n\n// Run loads all databases specified in the configuration.\nfunc (c *ReplicateCommand) Run(ctx context.Context) (err error) {\n\t// Display version information.\n\tslog.Info(\"litestream\", \"version\", Version, \"level\", c.Config.Logging.Level)\n\n\t// Start MCP server if enabled\n\tif c.Config.MCPAddr != \"\" {\n\t\tc.MCP, err = NewMCP(ctx, c.Config.ConfigPath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tgo c.MCP.Start(c.Config.MCPAddr)\n\t}\n\n\t// Setup databases.\n\tif len(c.Config.DBs) == 0 {\n\t\tslog.Error(\"no databases specified in configuration\")\n\t}\n\n\t// Attempt restore for databases that need it (before creating DB objects)\n\tfor _, dbConfig := range c.Config.DBs {\n\t\tif dbConfig.RestoreIfDBNotExists \u0026\u0026 dbConfig.Path != \"\" {\n\t\t\tif err := c.restoreIfNeeded(ctx, dbConfig); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\tvar dbs []*litestream.DB\n\tvar watchables []struct {\n\t\tconfig *DBConfig\n\t\tdbs []*litestream.DB\n\t}\n\tfor _, dbConfig := range c.Config.DBs {\n\t\t// Handle directory configuration\n\t\tif dbConfig.Dir != \"\" {\n\t\t\tdirDbs, err := NewDBsFromDirectoryConfig(dbConfig)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdbs = append(dbs, dirDbs...)\n\t\t\tslog.Info(\"found databases in directory\", \"dir\", dbConfig.Dir, \"count\", len(dirDbs), \"watch\", dbConfig.Watch)\n\t\t\tif dbConfig.Watch {\n\t\t\t\twatchables = append(watchables, struct {\n\t\t\t\t\tconfig *DBConfig\n\t\t\t\t\tdbs []*litestream.DB\n\t\t\t\t}{config: dbConfig, dbs: dirDbs})\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle single database configuration\n\t\t\tdb, err := NewDBFromConfig(dbConfig)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdbs = append(dbs, db)\n\t\t}\n\t}\n\n\tlevels := c.Config.CompactionLevels()\n\tc.Store = litestream.NewStore(dbs, levels)\n\n\t// Only override default snapshot interval if explicitly set in config\n\tif c.Config.Snapshot.Interval != nil {\n\t\tc.Store.SnapshotInterval = *c.Config.Snapshot.Interval\n\t}\n\t// Only override default snapshot retention if explicitly set in config\n\tif c.Config.Snapshot.Retention != nil {\n\t\tc.Store.SnapshotRetention = *c.Config.Snapshot.Retention\n\t}\n\tif c.Config.L0Retention != nil {\n\t\tc.Store.SetL0Retention(*c.Config.L0Retention)\n\t}\n\tif c.Config.L0RetentionCheckInterval != nil {\n\t\tc.Store.L0RetentionCheckInterval = *c.Config.L0RetentionCheckInterval\n\t}\n\tif c.Config.ShutdownSyncTimeout != nil {\n\t\tc.Store.SetShutdownSyncTimeout(*c.Config.ShutdownSyncTimeout)\n\t}\n\tif c.Config.ShutdownSyncInterval != nil {\n\t\tc.Store.SetShutdownSyncInterval(*c.Config.ShutdownSyncInterval)\n\t}\n\tif c.Config.VerifyCompaction {\n\t\tc.Store.SetVerifyCompaction(true)\n\t}\n\tif c.Config.Retention.Enabled != nil \u0026\u0026 !*c.Config.Retention.Enabled {\n\t\tc.Store.SetRetentionEnabled(false)\n\t}\n\tif c.Config.Validation.Interval != nil {\n\t\tc.Store.ValidationInterval = *c.Config.Validation.Interval\n\t}\n\tif c.done != nil {\n\t\tc.Store.SetDone(c.done)\n\t}\n\tif c.Config.HeartbeatURL != \"\" {\n\t\tinterval := litestream.DefaultHeartbeatInterval\n\t\tif c.Config.HeartbeatInterval != nil {\n\t\t\tinterval = *c.Config.HeartbeatInterval\n\t\t}\n\t\tc.Store.Heartbeat = litestream.NewHeartbeatClient(c.Config.HeartbeatURL, interval)\n\t}\n\n\t// Disable all background monitors when running once.\n\t// This must be done after config settings are applied.\n\tif c.once {\n\t\tc.Store.CompactionMonitorEnabled = false\n\t\tc.Store.L0RetentionCheckInterval = 0\n\t\tfor _, db := range dbs {\n\t\t\tdb.MonitorInterval = 0\n\t\t\tif db.Replica != nil {\n\t\t\t\tdb.Replica.MonitorEnabled = false\n\t\t\t}\n\t\t}\n\t}\n\n\tif err := c.Store.Open(ctx); err != nil {\n\t\treturn fmt.Errorf(\"cannot open store: %w\", err)\n\t}\n\n\tif !c.Store.RetentionEnabled {\n\t\tslog.Warn(\"retention disabled; cloud provider lifecycle policies must handle retention\",\n\t\t\t\"hint\", \"idle databases that stop receiving writes will not generate new snapshots and may lose backup coverage if cloud retention expires\")\n\t}\n\n\t// Start control server if socket is enabled\n\tif c.Config.Socket.Enabled {\n\t\tc.Server = litestream.NewServer(c.Store)\n\t\tc.Server.SocketPath = c.Config.Socket.Path\n\t\tc.Server.SocketPerms = c.Config.Socket.Permissions\n\t\tc.Server.PathExpander = expand\n\t\tc.Server.Version = Version\n\t\tif err := c.Server.Start(); err != nil {\n\t\t\tslog.Warn(\"failed to start control server\", \"error\", err)\n\t\t}\n\t}\n\n\tfor _, entry := range watchables {\n\t\tmonitor, err := NewDirectoryMonitor(ctx, c.Store, entry.config, entry.dbs)\n\t\tif err != nil {\n\t\t\tfor _, m := range c.directoryMonitors {\n\t\t\t\tm.Close()\n\t\t\t}\n\t\t\tif closeErr := c.Store.Close(ctx); closeErr != nil {\n\t\t\t\tslog.Error(\"failed to close store after monitor failure\", \"error\", closeErr)\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"start directory monitor for %s: %w\", entry.config.Dir, err)\n\t\t}\n\t\tc.directoryMonitors = append(c.directoryMonitors, monitor)\n\t}\n\n\t// Notify user that initialization is done.\n\tfor _, db := range c.Store.DBs() {\n\t\tr := db.Replica\n\t\tslog.Info(\"initialized db\", \"path\", db.Path())\n\t\tslogWith := slog.With(\"type\", r.Client.Type(), \"sync-interval\", r.SyncInterval)\n\t\tswitch client := r.Client.(type) {\n\t\tcase *file.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"path\", client.Path())\n\t\tcase *s3.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.Bucket, \"path\", client.Path, \"region\", client.Region, \"endpoint\", client.Endpoint)\n\t\tcase *gs.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.Bucket, \"path\", client.Path)\n\t\tcase *abs.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.Bucket, \"path\", client.Path, \"endpoint\", client.Endpoint)\n\t\tcase *sftp.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"host\", client.Host, \"user\", client.User, \"path\", client.Path)\n\t\tcase *nats.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.BucketName, \"url\", client.URL)\n\t\tcase *oss.ReplicaClient:\n\t\t\tslogWith.Info(\"replicating to\", \"bucket\", client.Bucket, \"path\", client.Path, \"region\", client.Region)\n\t\tdefault:\n\t\t\tslogWith.Info(\"replicating to\")\n\t\t}\n\t}\n\n\t// Serve metrics over HTTP if enabled.\n\tif c.Config.Addr != \"\" {\n\t\thostport := c.Config.Addr\n\t\tif host, port, _ := net.SplitHostPort(c.Config.Addr); port == \"\" {\n\t\t\treturn fmt.Errorf(\"must specify port for bind address: %q\", c.Config.Addr)\n\t\t} else if host == \"\" {\n\t\t\thostport = net.JoinHostPort(\"localhost\", port)\n\t\t}\n\n\t\tslog.Info(\"serving metrics on\", \"url\", fmt.Sprintf(\"http://%s/metrics\", hostport))\n\t\tgo func() {\n\t\t\thttp.Handle(\"/metrics\", promhttp.Handler())\n\t\t\tif err := http.ListenAndServe(c.Config.Addr, nil); err != nil {\n\t\t\t\tslog.Error(\"cannot start metrics server\", \"error\", err)\n\t\t\t}\n\t\t}()\n\t}\n\n\t// Parse exec commands args \u0026 start subprocess.\n\tif c.Config.Exec != \"\" {\n\t\texecArgs, err := shellwords.Parse(c.Config.Exec)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"cannot parse exec command: %w\", err)\n\t\t}\n\n\t\tc.cmd = exec.CommandContext(ctx, execArgs[0], execArgs[1:]...)\n\t\tc.cmd.Env = os.Environ()\n\t\tc.cmd.Stdout = os.Stdout\n\t\tc.cmd.Stderr = os.Stderr\n\t\tif err := c.cmd.Start(); err != nil {\n\t\t\treturn fmt.Errorf(\"cannot start exec command: %w\", err)\n\t\t}\n\t\tgo func() { c.execCh \u003c- c.cmd.Wait() }()\n\t} else if c.once {\n\t\t// Run one-shot replication in a goroutine so the caller can wait on execCh.\n\t\tgo c.runOnce(ctx)\n\t}\n\n\treturn nil\n}\n\n// runOnce performs one-shot replication for all databases.\n// It syncs all databases, optionally takes snapshots, and enforces retention.\nfunc (c *ReplicateCommand) runOnce(ctx context.Context) {\n\tvar err error\n\tdefer func() { c.execCh \u003c- err }()\n\n\tfor _, db := range c.Store.DBs() {\n\t\tslog.Info(\"syncing database\", \"path\", db.Path())\n\n\t\t// Sync the database to process any pending WAL changes.\n\t\tif err = db.Sync(ctx); err != nil {\n\t\t\terr = fmt.Errorf(\"sync database %s: %w\", db.Path(), err)\n\t\t\treturn\n\t\t}\n\n\t\t// Sync the replica to upload any pending LTX files.\n\t\tif err = db.Replica.Sync(ctx); err != nil {\n\t\t\terr = fmt.Errorf(\"sync replica for %s: %w\", db.Path(), err)\n\t\t\treturn\n\t\t}\n\n\t\t// Force a snapshot if requested.\n\t\tif c.forceSnapshot {\n\t\t\tslog.Info(\"taking snapshot\", \"path\", db.Path())\n\t\t\tif _, err = db.Snapshot(ctx); err != nil {\n\t\t\t\terr = fmt.Errorf(\"snapshot %s: %w\", db.Path(), err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Enforce retention if requested.\n\t\tif c.enforceRetention {\n\t\t\tslog.Info(\"enforcing retention\", \"path\", db.Path())\n\t\t\tif err = c.Store.EnforceSnapshotRetention(ctx, db); err != nil {\n\t\t\t\terr = fmt.Errorf(\"enforce retention for %s: %w\", db.Path(), err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tslog.Info(\"one-shot replication complete\")\n}\n\n// Close closes all open databases.\nfunc (c *ReplicateCommand) Close(ctx context.Context) error {\n\tfor _, monitor := range c.directoryMonitors {\n\t\tmonitor.Close()\n\t}\n\tc.directoryMonitors = nil\n\n\tif c.Server != nil {\n\t\tif err := c.Server.Close(); err != nil {\n\t\t\tslog.Error(\"error closing control server\", \"error\", err)\n\t\t}\n\t}\n\tif c.Store != nil {\n\t\tif err := c.Store.Close(ctx); err != nil {\n\t\t\tif errors.Is(err, litestream.ErrShutdownInterrupted) {\n\t\t\t\tslog.Warn(\"shutdown sync skipped by user interrupt\", \"error\", err)\n\t\t\t} else {\n\t\t\t\tslog.Error(\"failed to close database\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\tif c.Config.MCPAddr != \"\" \u0026\u0026 c.MCP != nil {\n\t\tif err := c.MCP.Close(); err != nil {\n\t\t\tslog.Error(\"error closing MCP server\", \"error\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetDone sets the done channel used for interrupt handling during shutdown.\n// When the channel is closed, the shutdown sync retry loop exits.\nfunc (c *ReplicateCommand) SetDone(done \u003c-chan struct{}) {\n\tc.done = done\n}\n\n// restoreIfNeeded restores a database from its replica if the database doesn't\n// exist and the RestoreIfDBNotExists option is enabled. If no backup exists\n// (first start scenario), it returns nil to allow fresh replication to begin.\nfunc (c *ReplicateCommand) restoreIfNeeded(ctx context.Context, dbConfig *DBConfig) error {\n\tdbPath, err := expand(dbConfig.Path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Skip if database already exists\n\tif _, err := os.Stat(dbPath); !os.IsNotExist(err) {\n\t\tslog.Info(\"database exists, skipping restore\", \"path\", dbPath)\n\t\treturn nil\n\t}\n\n\t// Get replica config (handles both Replica and Replicas fields)\n\tvar rc *ReplicaConfig\n\tif dbConfig.Replica != nil {\n\t\trc = dbConfig.Replica\n\t} else if len(dbConfig.Replicas) \u003e 0 {\n\t\trc = dbConfig.Replicas[0]\n\t} else {\n\t\treturn fmt.Errorf(\"no replica configured for database: %s\", dbPath)\n\t}\n\n\t// Create replica from config (nil db since we're just restoring)\n\tr, err := NewReplicaFromConfig(rc, nil)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot create replica for restore: %w\", err)\n\t}\n\n\t// Attempt restore\n\topt := litestream.NewRestoreOptions()\n\topt.OutputPath = dbPath\n\n\tslog.Info(\"attempting restore before replication\", \"path\", dbPath)\n\tif err := r.Restore(ctx, opt); errors.Is(err, litestream.ErrTxNotAvailable) {\n\t\t// No backup exists yet (first start) - this is OK\n\t\tslog.Info(\"no backup found, starting fresh\", \"path\", dbPath)\n\t\treturn nil\n\t} else if err != nil {\n\t\treturn fmt.Errorf(\"restore failed: %w\", err)\n\t}\n\n\tslog.Info(\"restore completed\", \"path\", dbPath)\n\treturn nil\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *ReplicateCommand) Usage() {\n\tfmt.Printf(`\nThe replicate command starts a server to monitor \u0026 replicate databases.\nYou can specify your database \u0026 replicas in a configuration file or you can\nreplicate a single database file by specifying its path and its replicas in the\ncommand line arguments.\n\nUsage:\n\n\tlitestream replicate [arguments]\n\n\tlitestream replicate [arguments] DB_PATH REPLICA_URL\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-exec CMD\n\t Executes a subcommand. Litestream will exit when the child\n\t process exits. Useful for simple process management.\n\n\t-once\n\t Replicate once and exit. This performs a single sync of all\n\t databases and their replicas, then exits. Cannot be used with -exec.\n\n\t-force-snapshot\n\t Force a snapshot to be taken for all databases. Requires -once.\n\t This is useful for creating a complete backup before maintenance\n\t or when migrating databases between hosts.\n\n\t-enforce-retention\n\t Enforce retention policies for old snapshots. Requires -once.\n\t This removes snapshots that are older than the configured\n\t snapshot retention period.\n\n\t-log-level LEVEL\n\t Sets the log level. Overrides the config file setting.\n\t Valid values: trace, debug, info, warn, error\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\n\t-restore-if-db-not-exists\n\t Restores the database from the replica if it doesn't exist.\n\t On first start with no backup, proceeds normally.\n\nRuntime control commands require the daemon control socket. This includes\nstart, stop, sync, register, unregister, info, and list. Enable it in the config:\n\n\tsocket:\n\t enabled: true\n\t path: /tmp/litestream.sock\n\n`[1:], DefaultConfigPath())\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[34,43]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[44,51]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[52,58]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[59,70]}},{"name":"net","path":"net","span":{"start":[9,1],"end":[9,7],"bytes":[71,77]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[78,89]}},{"name":"pprof","path":"net/http/pprof","alias":"_","span":{"start":[11,1],"end":[11,20],"bytes":[90,109]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[110,115]}},{"name":"exec","path":"os/exec","span":{"start":[13,1],"end":[13,11],"bytes":[116,126]}},{"name":"strings","path":"strings","span":{"start":[14,1],"end":[14,11],"bytes":[127,137]}},{"name":"go-shellwords","path":"github.com/mattn/go-shellwords","span":{"start":[16,1],"end":[16,34],"bytes":[139,172]}},{"name":"promhttp","path":"github.com/prometheus/client_golang/prometheus/promhttp","span":{"start":[17,1],"end":[17,59],"bytes":[173,231]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[19,1],"end":[19,37],"bytes":[233,269]}},{"name":"abs","path":"github.com/benbjohnson/litestream/abs","span":{"start":[20,1],"end":[20,41],"bytes":[270,310]}},{"name":"file","path":"github.com/benbjohnson/litestream/file","span":{"start":[21,1],"end":[21,42],"bytes":[311,352]}},{"name":"gs","path":"github.com/benbjohnson/litestream/gs","span":{"start":[22,1],"end":[22,40],"bytes":[353,392]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[23,1],"end":[23,46],"bytes":[393,438]}},{"name":"nats","path":"github.com/benbjohnson/litestream/nats","span":{"start":[24,1],"end":[24,42],"bytes":[439,480]}},{"name":"oss","path":"github.com/benbjohnson/litestream/oss","span":{"start":[25,1],"end":[25,41],"bytes":[481,521]}},{"name":"s3","path":"github.com/benbjohnson/litestream/s3","span":{"start":[26,1],"end":[26,40],"bytes":[522,561]}},{"name":"sftp","path":"github.com/benbjohnson/litestream/sftp","span":{"start":[27,1],"end":[27,42],"bytes":[562,603]}}],"types":{"ReplicateCommand":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand","kind":"struct","span":{"start":[31,1],"end":[57,2],"bytes":[695,1464]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","kind":"method","span":{"start":[436,1],"end":[462,2],"bytes":[13759,14486]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[436,1],"end":[436,62],"bytes":[13759,13820]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"438:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@438:3","span":{"start":[438,3],"end":[438,18],"bytes":[13870,13885]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close"},"443:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@443:13","span":{"start":[443,13],"end":[443,29],"bytes":[13951,13967]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close"},"444:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@444:4","span":{"start":[444,4],"end":[444,60],"bytes":[13985,14041]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"448:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@448:13","span":{"start":[448,13],"end":[448,31],"bytes":[14082,14100]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close"},"449:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@449:7","span":{"start":[449,7],"end":[449,56],"bytes":[14121,14170]},"callee":"can://litestream/litestream/@external/errors/Is"},"450:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@450:5","span":{"start":[450,5],"end":[450,71],"bytes":[14177,14243]},"callee":"can://litestream/litestream/@external/log/slog/Warn"},"452:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@452:5","span":{"start":[452,5],"end":[452,57],"bytes":[14260,14312]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"457:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@457:13","span":{"start":[457,13],"end":[457,26],"bytes":[14382,14395]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close"},"458:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close@458:4","span":{"start":[458,4],"end":[458,56],"bytes":[14413,14465]},"callee":"can://litestream/litestream/@external/log/slog/Error"}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","kind":"method","span":{"start":[66,1],"end":[175,2],"bytes":[1643,5439]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","parameters":[{"name":"_","type":"context.Context","span":{"start":[66,1],"end":[66,86],"bytes":[1643,1728]}},{"name":"args","type":"[]string","span":{"start":[66,1],"end":[66,86],"bytes":[1643,1728]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":20},"body":{"104:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@104:10","span":{"start":[104,10],"end":[104,79],"bytes":[3285,3354]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"104:69":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@104:69","span":{"start":[104,69],"end":[104,78],"bytes":[3344,3353]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"109:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@109:11","span":{"start":[109,11],"end":[109,74],"bytes":[3454,3517]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"113:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@113:14","span":{"start":[113,14],"end":[113,29],"bytes":[3607,3622]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig"},"118:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@118:4","span":{"start":[118,4],"end":[118,41],"bytes":[3765,3802]},"callee":"can://litestream/litestream/@external/os/Setenv"},"121:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@121:3","span":{"start":[121,3],"end":[121,55],"bytes":[3845,3897]},"callee":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"124:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@124:26","span":{"start":[124,26],"end":[124,35],"bytes":[3949,3958]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"127:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@127:21","span":{"start":[127,21],"end":[127,30],"bytes":[4032,4041]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Args"},"129:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@129:7","span":{"start":[129,7],"end":[129,32],"bytes":[4135,4160]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"130:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@130:12","span":{"start":[130,12],"end":[130,96],"bytes":[4174,4258]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"133:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@133:24","span":{"start":[133,24],"end":[138,6],"bytes":[4337,4475]},"callee":null},"165:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@165:10","span":{"start":[165,10],"end":[165,60],"bytes":[5147,5197]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"168:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@168:10","span":{"start":[168,10],"end":[168,73],"bytes":[5243,5306]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"171:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@171:10","span":{"start":[171,10],"end":[171,76],"bytes":[5355,5421]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"67:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@67:8","span":{"start":[67,8],"end":[67,69],"bytes":[1736,1797]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"68:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@68:14","span":{"start":[68,14],"end":[68,57],"bytes":[1811,1854]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"69:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@69:18","span":{"start":[69,18],"end":[69,91],"bytes":[1872,1945]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"70:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@70:26","span":{"start":[70,26],"end":[70,118],"bytes":[1971,2063]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"71:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@71:14","span":{"start":[71,14],"end":[71,63],"bytes":[2077,2126]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"72:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@72:23","span":{"start":[72,23],"end":[72,95],"bytes":[2149,2221]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"73:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@73:26","span":{"start":[73,26],"end":[73,121],"bytes":[2247,2342]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"74:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@74:29","span":{"start":[74,29],"end":[74,51],"bytes":[2371,2393]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"76:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@76:12","span":{"start":[76,12],"end":[76,26],"bytes":[2425,2439]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"81:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@81:9","span":{"start":[81,9],"end":[81,18],"bytes":[2539,2548]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"85:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@85:18","span":{"start":[85,18],"end":[85,37],"bytes":[2646,2665]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"87:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@87:22","span":{"start":[87,22],"end":[87,64],"bytes":[2691,2733]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"94:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@94:4","span":{"start":[94,4],"end":[94,41],"bytes":[2978,3015]},"callee":"can://litestream/litestream/@external/os/Setenv"},"99:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags@99:4","span":{"start":[99,4],"end":[99,103],"bytes":[3108,3207]},"callee":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","kind":"method","span":{"start":[178,1],"end":[390,2],"bytes":[5500,12474]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[178,1],"end":[178,66],"bytes":[5500,5565]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":53},"body":{"180:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@180:2","span":{"start":[180,2],"end":[180,78],"bytes":[5600,5676]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"184:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@184:16","span":{"start":[184,16],"end":[184,48],"bytes":[5754,5786]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP"},"188:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@188:6","span":{"start":[188,6],"end":[188,35],"bytes":[5828,5857]},"callee":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start","is_goroutine":true},"192:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@192:5","span":{"start":[192,5],"end":[192,22],"bytes":[5887,5904]},"callee":null},"193:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@193:3","span":{"start":[193,3],"end":[193,56],"bytes":[5914,5967]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"199:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@199:14","span":{"start":[199,14],"end":[199,46],"bytes":[6162,6194]},"callee":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded"},"213:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@213:19","span":{"start":[213,19],"end":[213,54],"bytes":[6459,6494]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig"},"217:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@217:10","span":{"start":[217,10],"end":[217,32],"bytes":[6543,6565]},"callee":null},"218:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@218:4","span":{"start":[218,4],"end":[218,113],"bytes":[6569,6678]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"218:76":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@218:76","span":{"start":[218,76],"end":[218,87],"bytes":[6641,6652]},"callee":null},"220:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@220:18","span":{"start":[220,18],"end":[223,38],"bytes":[6719,6835]},"callee":null},"227:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@227:15","span":{"start":[227,15],"end":[227,40],"bytes":[6909,6934]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"231:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@231:10","span":{"start":[231,10],"end":[231,25],"bytes":[6983,6998]},"callee":null},"235:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@235:12","span":{"start":[235,12],"end":[235,39],"bytes":[7018,7045]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels"},"236:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@236:12","span":{"start":[236,12],"end":[236,44],"bytes":[7057,7089]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore"},"247:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@247:3","span":{"start":[247,3],"end":[247,48],"bytes":[7475,7520]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention"},"253:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@253:3","span":{"start":[253,3],"end":[253,64],"bytes":[7690,7751]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout"},"256:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@256:3","span":{"start":[256,3],"end":[256,66],"bytes":[7800,7863]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval"},"259:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@259:3","span":{"start":[259,3],"end":[259,36],"bytes":[7901,7934]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction"},"262:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@262:3","span":{"start":[262,3],"end":[262,37],"bytes":[8012,8046]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetRetentionEnabled"},"268:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@268:3","span":{"start":[268,3],"end":[268,26],"bytes":[8178,8201]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone"},"275:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@275:23","span":{"start":[275,23],"end":[275,85],"bytes":[8398,8460]},"callee":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.NewHeartbeatClient"},"291:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@291:12","span":{"start":[291,12],"end":[291,29],"bytes":[8813,8830]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open"},"292:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@292:10","span":{"start":[292,10],"end":[292,50],"bytes":[8854,8894]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"296:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@296:3","span":{"start":[296,3],"end":[297,144],"bytes":[8933,9165]},"callee":"can://litestream/litestream/@external/log/slog/Warn"},"302:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@302:14","span":{"start":[302,14],"end":[302,43],"bytes":[9259,9288]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer"},"307:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@307:13","span":{"start":[307,13],"end":[307,29],"bytes":[9461,9477]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start"},"308:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@308:4","span":{"start":[308,4],"end":[308,61],"bytes":[9495,9552]},"callee":"can://litestream/litestream/@external/log/slog/Warn"},"313:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@313:19","span":{"start":[313,19],"end":[313,77],"bytes":[9615,9673]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor"},"316:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@316:5","span":{"start":[316,5],"end":[316,14],"bytes":[9739,9748]},"callee":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close"},"318:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@318:19","span":{"start":[318,19],"end":[318,37],"bytes":[9772,9790]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close"},"319:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@319:5","span":{"start":[319,5],"end":[319,81],"bytes":[9814,9890]},"callee":"can://litestream/litestream/@external/log/slog/Error"},"321:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@321:11","span":{"start":[321,11],"end":[321,82],"bytes":[9906,9977]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"323:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@323:25","span":{"start":[323,25],"end":[323,61],"bytes":[10006,10042]},"callee":null},"327:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@327:21","span":{"start":[327,21],"end":[327,34],"bytes":[10112,10125]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"329:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@329:3","span":{"start":[329,3],"end":[329,49],"bytes":[10148,10194]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"329:39":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@329:39","span":{"start":[329,39],"end":[329,48],"bytes":[10184,10193]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"330:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@330:15","span":{"start":[330,15],"end":[330,82],"bytes":[10209,10276]},"callee":"can://litestream/litestream/@external/log/slog/With"},"330:33":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@330:33","span":{"start":[330,33],"end":[330,48],"bytes":[10227,10242]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"333:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@333:4","span":{"start":[333,4],"end":[333,58],"bytes":[10345,10399]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"333:44":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@333:44","span":{"start":[333,44],"end":[333,57],"bytes":[10385,10398]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Path"},"335:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@335:4","span":{"start":[335,4],"end":[335,135],"bytes":[10429,10560]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"337:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@337:4","span":{"start":[337,4],"end":[337,81],"bytes":[10590,10667]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"339:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@339:4","span":{"start":[339,4],"end":[339,110],"bytes":[10698,10804]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"341:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@341:4","span":{"start":[341,4],"end":[341,98],"bytes":[10836,10930]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"343:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@343:4","span":{"start":[343,4],"end":[343,83],"bytes":[10962,11041]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"345:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@345:4","span":{"start":[345,4],"end":[345,106],"bytes":[11072,11174]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"347:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@347:4","span":{"start":[347,4],"end":[347,35],"bytes":[11189,11220]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"354:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@354:23","span":{"start":[354,23],"end":[354,55],"bytes":[11345,11377]},"callee":"can://litestream/litestream/@external/net/SplitHostPort"},"355:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@355:11","span":{"start":[355,11],"end":[355,78],"bytes":[11402,11469]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"357:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@357:15","span":{"start":[357,15],"end":[357,50],"bytes":[11509,11544]},"callee":"can://litestream/litestream/@external/net/JoinHostPort"},"360:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@360:3","span":{"start":[360,3],"end":[360,85],"bytes":[11552,11634]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"360:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@360:42","span":{"start":[360,42],"end":[360,84],"bytes":[11591,11633]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"361:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@361:6","span":{"start":[361,6],"end":[366,6],"bytes":[11640,11833]},"callee":null,"is_goroutine":true},"371:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@371:20","span":{"start":[371,20],"end":[371,51],"bytes":[11932,11963]},"callee":null},"373:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@373:11","span":{"start":[373,11],"end":[373,59],"bytes":[11992,12040]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"376:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@376:11","span":{"start":[376,11],"end":[376,65],"bytes":[12056,12110]},"callee":"can://litestream/litestream/@external/os/exec/CommandContext"},"377:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@377:15","span":{"start":[377,15],"end":[377,27],"bytes":[12125,12137]},"callee":"can://litestream/litestream/@external/os/Environ"},"380:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@380:13","span":{"start":[380,13],"end":[380,26],"bytes":[12204,12217]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.Start"},"381:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@381:11","span":{"start":[381,11],"end":[381,59],"bytes":[12242,12290]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"383:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@383:6","span":{"start":[383,6],"end":[383,43],"bytes":[12300,12337]},"callee":null,"is_goroutine":true},"386:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run@386:6","span":{"start":[386,6],"end":[386,20],"bytes":[12442,12456]},"callee":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1","kind":"function","span":{"start":[361,1],"end":[366,6],"bytes":[11635,11833]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1","parameters":[],"body":{"362:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1@362:28","span":{"start":[362,28],"end":[362,46],"bytes":[11676,11694]},"callee":null},"362:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1@362:4","span":{"start":[362,4],"end":[362,47],"bytes":[11652,11695]},"callee":"can://litestream/litestream/@external/net/http/Handle"},"363:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1@363:14","span":{"start":[363,14],"end":[363,53],"bytes":[11709,11748]},"callee":"can://litestream/litestream/@external/net/http/ListenAndServe"},"364:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1@364:5","span":{"start":[364,5],"end":[364,60],"bytes":[11767,11822]},"callee":"can://litestream/litestream/@external/log/slog/Error"}}},"closure_2":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_2","kind":"function","span":{"start":[383,1],"end":[383,43],"bytes":[12295,12337]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_2","parameters":[],"body":{"383:27":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_2@383:27","span":{"start":[383,27],"end":[383,39],"bytes":[12321,12333]},"callee":"can://litestream/litestream/@external/os/exec/Cmd.Wait"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone","kind":"method","span":{"start":[466,1],"end":[468,2],"bytes":[14633,14708]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone","parameters":[{"name":"done","type":"\u003c-chan struct{}","span":{"start":[466,1],"end":[466,59],"bytes":[14633,14691]}}],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage","kind":"method","span":{"start":[519,1],"end":[575,2],"bytes":[16313,18076]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"520:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage@520:2","span":{"start":[520,2],"end":[574,28],"bytes":[16351,18074]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"574:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage@574:8","span":{"start":[574,8],"end":[574,27],"bytes":[18054,18073]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","kind":"method","span":{"start":[473,1],"end":[516,2],"bytes":[14946,16268]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[473,1],"end":[473,92],"bytes":[14946,15037]}},{"name":"dbConfig","type":"*github.com/benbjohnson/litestream/cmd/litestream.DBConfig","span":{"start":[473,1],"end":[473,92],"bytes":[14946,15037]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"474:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@474:17","span":{"start":[474,17],"end":[474,38],"bytes":[15054,15075]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"480:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@480:15","span":{"start":[480,15],"end":[480,30],"bytes":[15160,15175]},"callee":"can://litestream/litestream/@external/os/Stat"},"480:33":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@480:33","span":{"start":[480,33],"end":[480,51],"bytes":[15178,15196]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"481:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@481:3","span":{"start":[481,3],"end":[481,65],"bytes":[15201,15263]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"489:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@489:12","span":{"start":[489,12],"end":[489,34],"bytes":[15435,15457]},"callee":null},"492:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@492:10","span":{"start":[492,10],"end":[492,70],"bytes":[15511,15571]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"496:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@496:12","span":{"start":[496,12],"end":[496,41],"bytes":[15654,15683]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"},"498:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@498:10","span":{"start":[498,10],"end":[498,66],"bytes":[15710,15766]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"502:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@502:9","span":{"start":[502,9],"end":[502,39],"bytes":[15799,15829]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewRestoreOptions"},"505:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@505:2","span":{"start":[505,2],"end":[505,68],"bytes":[15857,15923]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"506:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@506:12","span":{"start":[506,12],"end":[506,31],"bytes":[15935,15954]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore"},"506:33":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@506:33","span":{"start":[506,33],"end":[506,77],"bytes":[15956,16000]},"callee":"can://litestream/litestream/@external/errors/Is"},"508:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@508:3","span":{"start":[508,3],"end":[508,63],"bytes":[16058,16118]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"511:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@511:10","span":{"start":[511,10],"end":[511,47],"bytes":[16165,16202]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"514:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded@514:2","span":{"start":[514,2],"end":[514,48],"bytes":[16208,16254]},"callee":"can://litestream/litestream/@external/log/slog/Info"}}},"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","kind":"method","span":{"start":[394,1],"end":[433,2],"bytes":[12615,13721]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[394,1],"end":[394,58],"bytes":[12615,12672]}}],"metrics":{"cyclomatic":8},"body":{"396:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@396:8","span":{"start":[396,8],"end":[396,36],"bytes":[12695,12723]},"callee":null,"is_deferred":true},"398:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@398:21","span":{"start":[398,21],"end":[398,34],"bytes":[12745,12758]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"399:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@399:3","span":{"start":[399,3],"end":[399,51],"bytes":[12763,12811]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"399:41":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@399:41","span":{"start":[399,41],"end":[399,50],"bytes":[12801,12810]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"402:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@402:12","span":{"start":[402,12],"end":[402,24],"bytes":[12883,12895]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync"},"403:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@403:10","span":{"start":[403,10],"end":[403,60],"bytes":[12919,12969]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"403:45":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@403:45","span":{"start":[403,45],"end":[403,54],"bytes":[12954,12963]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"408:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@408:12","span":{"start":[408,12],"end":[408,32],"bytes":[13051,13071]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync"},"409:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@409:10","span":{"start":[409,10],"end":[409,63],"bytes":[13095,13148]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"409:48":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@409:48","span":{"start":[409,48],"end":[409,57],"bytes":[13133,13142]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"415:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@415:4","span":{"start":[415,4],"end":[415,51],"bytes":[13226,13273]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"415:41":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@415:41","span":{"start":[415,41],"end":[415,50],"bytes":[13263,13272]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"416:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@416:16","span":{"start":[416,16],"end":[416,32],"bytes":[13289,13305]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot"},"417:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@417:11","span":{"start":[417,11],"end":[417,56],"bytes":[13330,13375]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"417:41":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@417:41","span":{"start":[417,41],"end":[417,50],"bytes":[13360,13369]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"424:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@424:4","span":{"start":[424,4],"end":[424,55],"bytes":[13463,13514]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"424:45":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@424:45","span":{"start":[424,45],"end":[424,54],"bytes":[13504,13513]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"425:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@425:13","span":{"start":[425,13],"end":[425,54],"bytes":[13527,13568]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention"},"426:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@426:11","span":{"start":[426,11],"end":[426,69],"bytes":[13593,13651]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"426:54":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@426:54","span":{"start":[426,54],"end":[426,63],"bytes":[13636,13645]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"432:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce@432:2","span":{"start":[432,2],"end":[432,44],"bytes":[13677,13719]},"callee":"can://litestream/litestream/@external/log/slog/Info"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce.closure_1","kind":"function","span":{"start":[396,1],"end":[396,36],"bytes":[12688,12723]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce.closure_1","parameters":[],"body":{}}}}},"fields":{"Config":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/Config","kind":"field","type":"github.com/benbjohnson/litestream/cmd/litestream.Config","span":{"start":[40,1],"end":[40,15],"bytes":[1007,1021]}},"MCP":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/MCP","kind":"field","type":"*github.com/benbjohnson/litestream/cmd/litestream.MCPServer","span":{"start":[43,1],"end":[43,16],"bytes":[1038,1053]}},"Server":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/Server","kind":"field","type":"*github.com/benbjohnson/litestream.Server","span":{"start":[46,1],"end":[46,27],"bytes":[1092,1118]}},"Store":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/Store","kind":"field","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[49,1],"end":[49,25],"bytes":[1174,1198]}},"cmd":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/cmd","kind":"field","type":"*os/exec.Cmd","span":{"start":[32,1],"end":[32,33],"bytes":[726,758]}},"directoryMonitors":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/directoryMonitors","kind":"field","type":"[]*github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor","span":{"start":[52,1],"end":[52,39],"bytes":[1255,1293]}},"done":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/done","kind":"field","type":"\u003c-chan struct{}","span":{"start":[56,1],"end":[56,22],"bytes":[1441,1462]}},"enforceRetention":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/enforceRetention","kind":"field","type":"bool","span":{"start":[38,1],"end":[38,61],"bytes":[945,1005]}},"execCh":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/execCh","kind":"field","type":"chan error","span":{"start":[33,1],"end":[33,47],"bytes":[759,805]}},"forceSnapshot":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/forceSnapshot","kind":"field","type":"bool","span":{"start":[37,1],"end":[37,57],"bytes":[888,944]}},"once":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/once","kind":"field","type":"bool","span":{"start":[36,1],"end":[36,50],"bytes":[838,887]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand":{"id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand","kind":"function","span":{"start":[59,1],"end":[63,2],"bytes":[1466,1572]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand","parameters":[],"return_type":"*github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand","metrics":{"cyclomatic":1},"body":{"61:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand@61:11","span":{"start":[61,11],"end":[61,27],"bytes":[1550,1566]},"callee":null}}}},"content_hash":"aaa1236d303151b5f8390be24542cffb535b6a3842d7b2142b724ffe9b9f4991"},"cmd/litestream/reset.go":{"id":"can://litestream/litestream/go/cmd/litestream/reset.go","kind":"module","span":{"start":[1,1],"end":[190,1],"bytes":[0,4629]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// ResetCommand is a command for resetting local Litestream state for a database.\ntype ResetCommand struct{}\n\n// Run executes the command.\nfunc (c *ResetCommand) Run(ctx context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-reset\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tdryRun := fs.Bool(\"dry-run\", false, \"print local state that would be removed without deleting\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\t// Validate arguments - need exactly one database path\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream reset /path/to/db\",\n\t\t}\n\t} else if fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\t// Make absolute if needed\n\tif !filepath.IsAbs(dbPath) {\n\t\tif dbPath, err = filepath.Abs(dbPath); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Load configuration to find the database (if config exists)\n\tvar dbConfig *DBConfig\n\tif *configPath != \"\" {\n\t\tconfig, configErr := ReadConfigFile(*configPath, !*noExpandEnv)\n\t\tif configErr != nil {\n\t\t\treturn fmt.Errorf(\"cannot read config: %w\", configErr)\n\t\t}\n\n\t\t// Find database config\n\t\tfor _, dbc := range config.DBs {\n\t\t\texpandedPath := dbc.Path\n\t\t\tif !filepath.IsAbs(expandedPath) {\n\t\t\t\texpandedPath, _ = filepath.Abs(expandedPath)\n\t\t\t}\n\t\t\tif expandedPath == dbPath {\n\t\t\t\tdbConfig = dbc\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// If no config found, check if database file exists\n\tif _, err := os.Stat(dbPath); os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"database does not exist: %s\", dbPath)\n\t} else if err != nil {\n\t\treturn fmt.Errorf(\"cannot access database: %w\", err)\n\t}\n\n\t// Create DB instance\n\tvar db *litestream.DB\n\tif dbConfig != nil {\n\t\tdb, err = NewDBFromConfig(dbConfig)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"cannot create database from config: %w\", err)\n\t\t}\n\t} else {\n\t\tdb = litestream.NewDB(dbPath)\n\t}\n\n\t// Check if meta path exists\n\tmetaPath := db.MetaPath()\n\tif _, err := os.Stat(metaPath); os.IsNotExist(err) {\n\t\tfmt.Printf(\"No local state to reset for %s\\n\", dbPath)\n\t\tfmt.Printf(\"Meta directory does not exist: %s\\n\", metaPath)\n\t\treturn nil\n\t}\n\n\tif *dryRun {\n\t\tfiles, err := localLTXFiles(db.LTXDir())\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"dry run failed: %w\", err)\n\t\t}\n\n\t\tfmt.Printf(\"Dry run: local Litestream state would be reset for: %s\\n\", dbPath)\n\t\tfmt.Printf(\"Would remove: %s\\n\", db.LTXDir())\n\t\tif len(files) == 0 {\n\t\t\tfmt.Println(\"No local LTX files would be removed.\")\n\t\t\treturn nil\n\t\t}\n\n\t\tfmt.Println(\"Files that would be removed:\")\n\t\tfor _, file := range files {\n\t\t\tfmt.Printf(\" %s\\n\", file)\n\t\t}\n\t\tfmt.Println(\"No files were removed.\")\n\t\treturn nil\n\t}\n\n\t// Perform the reset\n\tfmt.Printf(\"Resetting local Litestream state for: %s\\n\", dbPath)\n\tfmt.Printf(\"Removing: %s\\n\", db.LTXDir())\n\n\tif err := db.ResetLocalState(ctx); err != nil {\n\t\treturn fmt.Errorf(\"reset failed: %w\", err)\n\t}\n\n\tfmt.Println(\"Reset complete. Next replication sync will create a fresh snapshot.\")\n\treturn nil\n}\n\nfunc localLTXFiles(root string) ([]string, error) {\n\tif _, err := os.Stat(root); os.IsNotExist(err) {\n\t\treturn nil, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar files []string\n\tif err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif d.IsDir() {\n\t\t\treturn nil\n\t\t}\n\t\tfiles = append(files, path)\n\t\treturn nil\n\t}); err != nil {\n\t\treturn nil, err\n\t}\n\treturn files, nil\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *ResetCommand) Usage() {\n\tfmt.Printf(`\nThe reset command clears local Litestream state for a database.\n\nThis is useful for recovering from corrupted or missing LTX files. The reset\nremoves local LTX files from the metadata directory, forcing Litestream to\ncreate a fresh snapshot on the next sync. The database file itself is not\nmodified.\n\nUsage:\n\n\tlitestream reset [arguments] \u003cpath\u003e\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\n\t-dry-run\n\t Print the local LTX files that would be removed without deleting them.\n\nExamples:\n\n\t# Reset local state for a specific database\n\tlitestream reset /path/to/database.db\n\n\t# Preview local files that would be removed\n\tlitestream reset -dry-run /path/to/database.db\n\n\t# Reset using a specific configuration file\n\tlitestream reset -config /etc/litestream.yml /path/to/database.db\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"flag","path":"flag","span":{"start":[5,1],"end":[5,8],"bytes":[34,41]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[42,48]}},{"name":"fs","path":"io/fs","span":{"start":[7,1],"end":[7,9],"bytes":[49,57]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[58,63]}},{"name":"filepath","path":"path/filepath","span":{"start":[9,1],"end":[9,17],"bytes":[64,80]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[11,1],"end":[11,37],"bytes":[82,118]}}],"types":{"ResetCommand":{"id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand","kind":"struct","span":{"start":[15,1],"end":[15,27],"bytes":[204,230]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","kind":"method","span":{"start":[18,1],"end":[124,2],"bytes":[261,3146]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[18,1],"end":[18,77],"bytes":[261,337]}},{"name":"args","type":"[]string","span":{"start":[18,1],"end":[18,77],"bytes":[261,337]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":21},"body":{"100:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@100:3","span":{"start":[100,3],"end":[100,48],"bytes":[2508,2553]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"100:36":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@100:36","span":{"start":[100,36],"end":[100,47],"bytes":[2541,2552]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"101:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@101:6","span":{"start":[101,6],"end":[101,16],"bytes":[2559,2569]},"callee":null},"102:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@102:4","span":{"start":[102,4],"end":[102,55],"bytes":[2580,2631]},"callee":"can://litestream/litestream/@external/fmt/Println"},"106:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@106:3","span":{"start":[106,3],"end":[106,46],"bytes":[2653,2696]},"callee":"can://litestream/litestream/@external/fmt/Println"},"108:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@108:4","span":{"start":[108,4],"end":[108,30],"bytes":[2731,2757]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"110:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@110:3","span":{"start":[110,3],"end":[110,40],"bytes":[2764,2801]},"callee":"can://litestream/litestream/@external/fmt/Println"},"115:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@115:2","span":{"start":[115,2],"end":[115,66],"bytes":[2842,2906]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"116:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@116:2","span":{"start":[116,2],"end":[116,43],"bytes":[2908,2949]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"116:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@116:31","span":{"start":[116,31],"end":[116,42],"bytes":[2937,2948]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"118:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@118:12","span":{"start":[118,12],"end":[118,35],"bytes":[2962,2985]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState"},"119:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@119:10","span":{"start":[119,10],"end":[119,45],"bytes":[3009,3044]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"122:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@122:2","span":{"start":[122,2],"end":[122,84],"bytes":[3050,3132]},"callee":"can://litestream/litestream/@external/fmt/Println"},"19:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@19:8","span":{"start":[19,8],"end":[19,65],"bytes":[345,402]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"20:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@20:29","span":{"start":[20,29],"end":[20,51],"bytes":[431,453]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"21:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@21:12","span":{"start":[21,12],"end":[21,97],"bytes":[465,550]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"23:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@23:12","span":{"start":[23,12],"end":[23,26],"bytes":[582,596]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"28:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@28:5","span":{"start":[28,5],"end":[28,14],"bytes":[688,697]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"33:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@33:12","span":{"start":[33,12],"end":[33,21],"bytes":[824,833]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"34:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@34:10","span":{"start":[34,10],"end":[34,42],"bytes":[849,881]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"37:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@37:12","span":{"start":[37,12],"end":[37,21],"bytes":[897,906]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"40:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@40:6","span":{"start":[40,6],"end":[40,28],"bytes":[941,963]},"callee":"can://litestream/litestream/@external/path/filepath/IsAbs"},"41:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@41:20","span":{"start":[41,20],"end":[41,40],"bytes":[985,1005]},"callee":"can://litestream/litestream/@external/path/filepath/Abs"},"49:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@49:24","span":{"start":[49,24],"end":[49,66],"bytes":[1176,1218]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"51:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@51:11","span":{"start":[51,11],"end":[51,58],"bytes":[1253,1300]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"57:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@57:8","span":{"start":[57,8],"end":[57,36],"bytes":[1402,1430]},"callee":"can://litestream/litestream/@external/path/filepath/IsAbs"},"58:23":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@58:23","span":{"start":[58,23],"end":[58,49],"bytes":[1455,1481]},"callee":"can://litestream/litestream/@external/path/filepath/Abs"},"68:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@68:15","span":{"start":[68,15],"end":[68,30],"bytes":[1628,1643]},"callee":"can://litestream/litestream/@external/os/Stat"},"68:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@68:32","span":{"start":[68,32],"end":[68,50],"bytes":[1645,1663]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"69:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@69:10","span":{"start":[69,10],"end":[69,59],"bytes":[1675,1724]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"71:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@71:10","span":{"start":[71,10],"end":[71,55],"bytes":[1758,1803]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"77:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@77:13","span":{"start":[77,13],"end":[77,38],"bytes":[1888,1913]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"79:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@79:11","span":{"start":[79,11],"end":[79,68],"bytes":[1942,1999]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"82:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@82:8","span":{"start":[82,8],"end":[82,32],"bytes":[2021,2045]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB"},"86:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@86:14","span":{"start":[86,14],"end":[86,27],"bytes":[2093,2106]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath"},"87:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@87:15","span":{"start":[87,15],"end":[87,32],"bytes":[2121,2138]},"callee":"can://litestream/litestream/@external/os/Stat"},"87:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@87:34","span":{"start":[87,34],"end":[87,52],"bytes":[2140,2158]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"88:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@88:3","span":{"start":[88,3],"end":[88,57],"bytes":[2163,2217]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"89:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@89:3","span":{"start":[89,3],"end":[89,62],"bytes":[2220,2279]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"94:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@94:17","span":{"start":[94,17],"end":[94,43],"bytes":[2327,2353]},"callee":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles"},"94:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@94:31","span":{"start":[94,31],"end":[94,42],"bytes":[2341,2352]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"96:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@96:11","span":{"start":[96,11],"end":[96,48],"bytes":[2382,2419]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"99:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run@99:3","span":{"start":[99,3],"end":[99,81],"bytes":[2427,2505]},"callee":"can://litestream/litestream/@external/fmt/Printf"}}},"github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage","kind":"method","span":{"start":[150,1],"end":[189,2],"bytes":[3638,4628]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"151:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage@151:2","span":{"start":[151,2],"end":[188,3],"bytes":[3672,4626]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"187:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage@187:3","span":{"start":[187,3],"end":[187,22],"bytes":[4603,4622]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles":{"id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","kind":"function","span":{"start":[126,1],"end":[147,2],"bytes":[3148,3593]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","parameters":[{"name":"root","type":"string","span":{"start":[126,1],"end":[126,52],"bytes":[3148,3199]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"127:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles@127:15","span":{"start":[127,15],"end":[127,28],"bytes":[3214,3227]},"callee":"can://litestream/litestream/@external/os/Stat"},"127:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles@127:30","span":{"start":[127,30],"end":[127,48],"bytes":[3229,3247]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"134:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles@134:12","span":{"start":[134,12],"end":[143,4],"bytes":[3345,3537]},"callee":"can://litestream/litestream/@external/path/filepath/WalkDir"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles.closure_1","kind":"function","span":{"start":[134,1],"end":[143,18],"bytes":[3334,3551]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[134,1],"end":[134,86],"bytes":[3334,3419]}},{"name":"d","type":"io/fs.DirEntry","span":{"start":[134,1],"end":[134,86],"bytes":[3334,3419]}},{"name":"err","type":"error","span":{"start":[134,1],"end":[134,86],"bytes":[3334,3419]}}],"return_type":"error","error_channel":["error"],"body":{"138:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles.closure_1@138:6","span":{"start":[138,6],"end":[138,15],"bytes":[3461,3470]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir"},"141:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles.closure_1@141:11","span":{"start":[141,11],"end":[141,30],"bytes":[3501,3520]},"callee":null}}}}}},"content_hash":"a57b2135a633a6531841eb509f9588a256f6a738aaaaf94ed221c80e70b17ec4"},"cmd/litestream/restore.go":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go","kind":"module","span":{"start":[1,1],"end":[454,1],"bytes":[0,13339]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"strconv\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// RestoreCommand represents a command to restore a database from a backup.\ntype RestoreCommand struct{}\n\n// Run executes the command.\nfunc (c *RestoreCommand) Run(ctx context.Context, args []string) (err error) {\n\topt := litestream.NewRestoreOptions()\n\n\tfs := flag.NewFlagSet(\"litestream-restore\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tfs.StringVar(\u0026opt.OutputPath, \"o\", \"\", \"output path\")\n\tfs.Var((*txidVar)(\u0026opt.TXID), \"txid\", \"transaction ID\")\n\tfs.IntVar(\u0026opt.Parallelism, \"parallelism\", opt.Parallelism, \"parallelism\")\n\tifDBNotExists := fs.Bool(\"if-db-not-exists\", false, \"\")\n\tifReplicaExists := fs.Bool(\"if-replica-exists\", false, \"\")\n\ttimestampStr := fs.String(\"timestamp\", \"\", \"timestamp\")\n\tdryRun := fs.Bool(\"dry-run\", false, \"print restore plan without writing\")\n\tforce := fs.Bool(\"force\", false, \"overwrite existing output database\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.BoolVar(\u0026opt.Follow, \"f\", false, \"follow mode\")\n\tfs.DurationVar(\u0026opt.FollowInterval, \"follow-interval\", opt.FollowInterval, \"polling interval for follow mode\")\n\tintegrityCheck := fs.String(\"integrity-check\", \"none\", \"post-restore integrity check: none, quick, or full\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t} else if fs.NArg() == 0 || fs.Arg(0) == \"\" {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path or replica URL required\",\n\t\t\thint: \"litestream restore -o /path/to/db s3://bucket/prefix\",\n\t\t}\n\t} else if fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tlogOutput := os.Stdout\n\tif *jsonOutput {\n\t\tlogOutput = os.Stderr\n\t}\n\tinternal.InitLog(logOutput, \"INFO\", \"text\", false)\n\n\t// When follow mode is enabled, set up signal handling so Ctrl+C stops\n\t// the follow loop cleanly.\n\tif opt.Follow {\n\t\tch := signalChan()\n\t\tcancelCtx, cancel := context.WithCancel(ctx)\n\t\tgo func() {\n\t\t\tselect {\n\t\t\tcase \u003c-ch:\n\t\t\t\tcancel()\n\t\t\tcase \u003c-cancelCtx.Done():\n\t\t\t}\n\t\t}()\n\t\tctx = cancelCtx\n\t\tdefer cancel()\n\t}\n\n\tswitch *integrityCheck {\n\tcase \"none\":\n\t\topt.IntegrityCheck = litestream.IntegrityCheckNone\n\tcase \"quick\":\n\t\topt.IntegrityCheck = litestream.IntegrityCheckQuick\n\tcase \"full\":\n\t\topt.IntegrityCheck = litestream.IntegrityCheckFull\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid -integrity-check value: %s\", *integrityCheck)\n\t}\n\n\t// Parse timestamp, if specified.\n\tif *timestampStr != \"\" {\n\t\tif opt.Timestamp, err = time.Parse(time.RFC3339, *timestampStr); err != nil {\n\t\t\treturn errors.New(\"invalid -timestamp, must specify in ISO 8601 format (e.g. 2000-01-01T00:00:00Z)\")\n\t\t}\n\t}\n\n\t// Determine replica to restore from.\n\tvar r *litestream.Replica\n\tif litestream.IsURL(fs.Arg(0)) {\n\t\tif *configPath != \"\" {\n\t\t\treturn fmt.Errorf(\"cannot specify a replica URL and the -config flag\")\n\t\t}\n\t\tif r, err = c.loadFromURL(ctx, fs.Arg(0), *ifDBNotExists, \u0026opt); errors.Is(err, errSkipDBExists) {\n\t\t\tslog.Info(\"database already exists, skipping\")\n\t\t\treturn nil\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif *configPath == \"\" {\n\t\t\t*configPath = DefaultConfigPath()\n\t\t}\n\t\tif r, err = c.loadFromConfig(ctx, fs.Arg(0), *configPath, !*noExpandEnv, *ifDBNotExists, \u0026opt); errors.Is(err, errSkipDBExists) {\n\t\t\tslog.Info(\"database already exists, skipping\")\n\t\t\treturn nil\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif *dryRun {\n\t\tplan, err := c.dryRunPlan(ctx, fs.Arg(0), r, opt)\n\t\tif errors.Is(err, litestream.ErrTxNotAvailable) {\n\t\t\treturn fmt.Errorf(\"no matching backup files available\")\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif *jsonOutput {\n\t\t\toutput, err := json.MarshalIndent(plan, \"\", \" \")\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t\t}\n\t\t\tfmt.Println(string(output))\n\t\t\treturn nil\n\t\t}\n\t\tc.printDryRunPlan(plan)\n\t\treturn nil\n\t}\n\n\tif !opt.Follow {\n\t\tif err := c.prepareOutputPath(opt.OutputPath, *force); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\ttxid := c.restoreTXID(ctx, r, opt)\n\tstart := time.Now()\n\tif err := r.Restore(ctx, opt); errors.Is(err, litestream.ErrTxNotAvailable) {\n\t\tif *ifReplicaExists {\n\t\t\tslog.Info(\"no matching backups found\")\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"no matching backup files available\")\n\t} else if err != nil {\n\t\treturn err\n\t}\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(RestoreResult{\n\t\t\tDBPath: opt.OutputPath,\n\t\t\tReplica: r.Client.Type(),\n\t\t\tTXID: txid,\n\t\t\tDurationMS: time.Since(start).Milliseconds(),\n\t\t\tIntegrityCheck: *integrityCheck,\n\t\t}, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t}\n\treturn nil\n}\n\ntype RestorePlan struct {\n\tSource string `json:\"source\"`\n\tTargetPath string `json:\"target_path\"`\n\tReplica string `json:\"replica\"`\n\tMinTXID string `json:\"min_txid\"`\n\tMaxTXID string `json:\"max_txid\"`\n\tFiles []RestorePlanFile `json:\"files\"`\n}\n\ntype RestorePlanFile struct {\n\tLevel int `json:\"level\"`\n\tName string `json:\"name\"`\n\tMinTXID string `json:\"min_txid\"`\n\tMaxTXID string `json:\"max_txid\"`\n\tSize int64 `json:\"size\"`\n\tTimestamp string `json:\"timestamp\"`\n}\n\ntype RestoreResult struct {\n\tDBPath string `json:\"db_path\"`\n\tReplica string `json:\"replica\"`\n\tTXID string `json:\"txid\"`\n\tDurationMS int64 `json:\"duration_ms\"`\n\tIntegrityCheck string `json:\"integrity_check\"`\n}\n\nfunc (c *RestoreCommand) dryRunPlan(ctx context.Context, source string, r *litestream.Replica, opt litestream.RestoreOptions) (RestorePlan, error) {\n\tif opt.Follow {\n\t\treturn RestorePlan{}, fmt.Errorf(\"cannot use -dry-run with -f\")\n\t}\n\n\tinfos, err := litestream.CalcRestorePlan(ctx, r.Client, opt.TXID, opt.Timestamp, r.Logger())\n\tif err != nil {\n\t\treturn RestorePlan{}, err\n\t}\n\tif len(infos) == 0 {\n\t\treturn RestorePlan{}, litestream.ErrTxNotAvailable\n\t}\n\n\tplan := RestorePlan{\n\t\tSource: source,\n\t\tTargetPath: opt.OutputPath,\n\t\tReplica: r.Client.Type(),\n\t\tMinTXID: infos[0].MinTXID.String(),\n\t\tMaxTXID: infos[len(infos)-1].MaxTXID.String(),\n\t\tFiles: make([]RestorePlanFile, 0, len(infos)),\n\t}\n\tfor _, info := range infos {\n\t\tplan.Files = append(plan.Files, RestorePlanFile{\n\t\t\tLevel: info.Level,\n\t\t\tName: ltx.FormatFilename(info.MinTXID, info.MaxTXID),\n\t\t\tMinTXID: info.MinTXID.String(),\n\t\t\tMaxTXID: info.MaxTXID.String(),\n\t\t\tSize: info.Size,\n\t\t\tTimestamp: info.CreatedAt.Format(time.RFC3339),\n\t\t})\n\t}\n\treturn plan, nil\n}\n\nfunc (c *RestoreCommand) printDryRunPlan(plan RestorePlan) {\n\tfmt.Println(\"Restore plan:\")\n\tfmt.Printf(\" source: %s\\n\", plan.Source)\n\tfmt.Printf(\" target: %s\\n\", plan.TargetPath)\n\tfmt.Printf(\" replica: %s\\n\", plan.Replica)\n\tfmt.Printf(\" txid range: %s - %s\\n\", plan.MinTXID, plan.MaxTXID)\n\tfmt.Println()\n\tfmt.Println(\"Files to fetch:\")\n\n\tw := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)\n\tdefer w.Flush()\n\tfmt.Fprintln(w, \"level\\tfile\\tmin_txid\\tmax_txid\\tsize\\ttimestamp\")\n\tfor _, file := range plan.Files {\n\t\tfmt.Fprintf(w, \"%d\\t%s\\t%s\\t%s\\t%d\\t%s\\n\",\n\t\t\tfile.Level,\n\t\t\tfile.Name,\n\t\t\tfile.MinTXID,\n\t\t\tfile.MaxTXID,\n\t\t\tfile.Size,\n\t\t\tfile.Timestamp,\n\t\t)\n\t}\n}\n\nfunc (c *RestoreCommand) restoreTXID(ctx context.Context, r *litestream.Replica, opt litestream.RestoreOptions) string {\n\tif opt.TXID != 0 {\n\t\treturn opt.TXID.String()\n\t}\n\tif opt.Follow {\n\t\treturn \"\"\n\t}\n\tinfos, err := litestream.CalcRestorePlan(ctx, r.Client, opt.TXID, opt.Timestamp, r.Logger())\n\tif err != nil || len(infos) == 0 {\n\t\treturn \"\"\n\t}\n\treturn infos[len(infos)-1].MaxTXID.String()\n}\n\nfunc (c *RestoreCommand) prepareOutputPath(path string, force bool) error {\n\tinfo, err := os.Stat(path)\n\tif os.IsNotExist(err) {\n\t\treturn nil\n\t} else if err != nil {\n\t\treturn fmt.Errorf(\"cannot access output path: %w\", err)\n\t}\n\tif info.IsDir() {\n\t\treturn fmt.Errorf(\"cannot restore, output path is a directory: %s\", path)\n\t}\n\n\tif info.Size() \u003e 0 \u0026\u0026 !force {\n\t\treturn fmt.Errorf(\"cannot restore, output path already exists and is not empty: %s. Use -force to overwrite\", path)\n\t}\n\n\tfor _, sidecarPath := range []string{path + \"-wal\", path + \"-shm\", path + \"-journal\"} {\n\t\tif _, err := os.Stat(sidecarPath); err == nil \u0026\u0026 !force {\n\t\t\treturn fmt.Errorf(\"cannot restore, SQLite sidecar path already exists: %s. Use -force to overwrite\", sidecarPath)\n\t\t} else if err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"cannot access SQLite sidecar path: %w\", err)\n\t\t}\n\t}\n\n\tfor _, removePath := range []string{path, path + \"-wal\", path + \"-shm\", path + \"-journal\"} {\n\t\tif err := os.Remove(removePath); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"remove existing output path: %w\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// loadFromURL creates a replica \u0026 updates the restore options from a replica URL.\nfunc (c *RestoreCommand) loadFromURL(ctx context.Context, replicaURL string, ifDBNotExists bool, opt *litestream.RestoreOptions) (*litestream.Replica, error) {\n\tif opt.OutputPath == \"\" {\n\t\treturn nil, \u0026usageError{\n\t\t\tmessage: \"-o is required when restoring from a replica URL\",\n\t\t\thint: fmt.Sprintf(\"litestream restore -o /path/to/db %s\", replicaURL),\n\t\t}\n\t}\n\n\t// Exit successfully if the output file already exists.\n\tif _, err := os.Stat(opt.OutputPath); !os.IsNotExist(err) \u0026\u0026 ifDBNotExists {\n\t\treturn nil, errSkipDBExists\n\t}\n\n\tsyncInterval := litestream.DefaultSyncInterval\n\tr, err := NewReplicaFromConfig(\u0026ReplicaConfig{\n\t\tURL: replicaURL,\n\t\tReplicaSettings: ReplicaSettings{\n\t\t\tSyncInterval: \u0026syncInterval,\n\t\t},\n\t}, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t_, err = r.CalcRestoreTarget(ctx, *opt)\n\treturn r, err\n}\n\n// loadFromConfig returns a replica \u0026 updates the restore options from a DB reference.\nfunc (c *RestoreCommand) loadFromConfig(_ context.Context, dbPath, configPath string, expandEnv, ifDBNotExists bool, opt *litestream.RestoreOptions) (*litestream.Replica, error) {\n\t// Load configuration.\n\tconfig, err := ReadConfigFile(configPath, expandEnv)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Lookup database from configuration file by path.\n\tif dbPath, err = expand(dbPath); err != nil {\n\t\treturn nil, err\n\t}\n\tdbConfig := config.DBConfig(dbPath)\n\tif dbConfig == nil {\n\t\treturn nil, fmt.Errorf(\"database not found in config: %s\", dbPath)\n\t}\n\tdb, err := NewDBFromConfig(dbConfig)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Restore into original database path if not specified.\n\tif opt.OutputPath == \"\" {\n\t\topt.OutputPath = dbPath\n\t}\n\n\t// Exit successfully if the output file already exists.\n\tif _, err := os.Stat(opt.OutputPath); !os.IsNotExist(err) \u0026\u0026 ifDBNotExists {\n\t\treturn nil, errSkipDBExists\n\t}\n\n\treturn db.Replica, nil\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *RestoreCommand) Usage() {\n\tfmt.Printf(`\nThe restore command recovers a database from a previous snapshot and WAL.\n\nUsage:\n\n\tlitestream restore [arguments] DB_PATH\n\n\tlitestream restore [arguments] REPLICA_URL\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\n\t-txid TXID\n\t Restore up to a specific hex-encoded transaction ID (inclusive).\n\t Defaults to use the highest available transaction.\n\n\t-timestamp TIMESTAMP\n\t Restore to a specific point-in-time.\n\t Defaults to use the latest available backup.\n\n\t-o PATH\n\t Output path of the restored database.\n\t Defaults to original DB path.\n\n\t-if-db-not-exists\n\t Returns exit code of 0 if the database already exists.\n\n\t-if-replica-exists\n\t Returns exit code of 0 if no backups found.\n\n\t-dry-run\n\t Print the restore plan and exit without writing a database.\n\n\t-force\n\t Overwrite an existing output database and SQLite sidecar files.\n\n\t-json\n\t Output raw JSON summary on successful restore.\n\n\t-f\n\t Follow mode. After restoring, continuously poll for and apply\n\t new changes. Similar to tail -f. The restored database should\n\t only be opened in read-only mode by consumers.\n\t Cannot be used with -txid or -timestamp.\n\n\t-follow-interval DURATION\n\t Polling interval for follow mode.\n\t Defaults to 1s.\n\n\t-parallelism NUM\n\t Determines the number of WAL files downloaded in parallel.\n\t Defaults to `+strconv.Itoa(litestream.DefaultRestoreParallelism)+`.\n\n\t-integrity-check MODE\n\t Run a post-restore integrity check on the database.\n\t MODE is one of: none, quick, full.\n\t Defaults to none.\n\n\nExamples:\n\n\t# Restore latest replica for database to original location.\n\t$ litestream restore /path/to/db\n\n\t# Restore replica for database to a given point in time.\n\t$ litestream restore -timestamp 2020-01-01T00:00:00Z /path/to/db\n\n\t# Restore latest replica for database to new /tmp directory\n\t$ litestream restore -o /tmp/db /path/to/db\n\n\t# Restore database from S3 replica URL.\n\t$ litestream restore -o /tmp/db s3://mybucket/db\n\n\t# Preview restore plan without writing a database.\n\t$ litestream restore -dry-run -o /tmp/db s3://mybucket/db\n\n\t# Continuously restore (follow) a database from a replica.\n\t$ litestream restore -f -o /tmp/read-replica.db s3://mybucket/db\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n\nvar errSkipDBExists = errors.New(\"database already exists, skipping\")\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[51,60]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[61,68]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[69,75]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[76,87]}},{"name":"os","path":"os","span":{"start":[10,1],"end":[10,6],"bytes":[88,93]}},{"name":"strconv","path":"strconv","span":{"start":[11,1],"end":[11,11],"bytes":[94,104]}},{"name":"tabwriter","path":"text/tabwriter","span":{"start":[12,1],"end":[12,18],"bytes":[105,122]}},{"name":"time","path":"time","span":{"start":[13,1],"end":[13,8],"bytes":[123,130]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[15,1],"end":[15,27],"bytes":[132,158]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[17,1],"end":[17,37],"bytes":[160,196]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[18,1],"end":[18,46],"bytes":[197,242]}}],"types":{"RestoreCommand":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand","kind":"struct","span":{"start":[22,1],"end":[22,29],"bytes":[322,350]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","kind":"method","span":{"start":[25,1],"end":[168,2],"bytes":[381,4831]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[25,1],"end":[25,79],"bytes":[381,459]}},{"name":"args","type":"[]string","span":{"start":[25,1],"end":[25,79],"bytes":[381,459]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":35},"body":{"100:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@100:15","span":{"start":[100,15],"end":[100,66],"bytes":[3026,3077]},"callee":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL"},"100:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@100:34","span":{"start":[100,34],"end":[100,43],"bytes":[3045,3054]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"100:68":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@100:68","span":{"start":[100,68],"end":[100,99],"bytes":[3079,3110]},"callee":"can://litestream/litestream/@external/errors/Is"},"101:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@101:4","span":{"start":[101,4],"end":[101,50],"bytes":[3116,3162]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"108:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@108:18","span":{"start":[108,18],"end":[108,37],"bytes":[3272,3291]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"110:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@110:15","span":{"start":[110,15],"end":[110,97],"bytes":[3310,3392]},"callee":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig"},"110:37":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@110:37","span":{"start":[110,37],"end":[110,46],"bytes":[3332,3341]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"110:99":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@110:99","span":{"start":[110,99],"end":[110,130],"bytes":[3394,3425]},"callee":"can://litestream/litestream/@external/errors/Is"},"111:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@111:4","span":{"start":[111,4],"end":[111,50],"bytes":[3431,3477]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"119:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@119:16","span":{"start":[119,16],"end":[119,52],"bytes":[3568,3604]},"callee":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan"},"119:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@119:34","span":{"start":[119,34],"end":[119,43],"bytes":[3586,3595]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"120:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@120:6","span":{"start":[120,6],"end":[120,50],"bytes":[3610,3654]},"callee":"can://litestream/litestream/@external/errors/Is"},"121:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@121:11","span":{"start":[121,11],"end":[121,59],"bytes":[3667,3715]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"126:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@126:19","span":{"start":[126,19],"end":[126,53],"bytes":[3796,3830]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"128:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@128:12","span":{"start":[128,12],"end":[128,60],"bytes":[3861,3909]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"130:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@130:16","span":{"start":[130,16],"end":[130,30],"bytes":[3930,3944]},"callee":null},"130:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@130:4","span":{"start":[130,4],"end":[130,31],"bytes":[3918,3945]},"callee":"can://litestream/litestream/@external/fmt/Println"},"133:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@133:3","span":{"start":[133,3],"end":[133,26],"bytes":[3966,3989]},"callee":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan"},"138:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@138:13","span":{"start":[138,13],"end":[138,56],"bytes":[4037,4080]},"callee":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath"},"143:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@143:10","span":{"start":[143,10],"end":[143,36],"bytes":[4126,4152]},"callee":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID"},"144:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@144:11","span":{"start":[144,11],"end":[144,21],"bytes":[4163,4173]},"callee":"can://litestream/litestream/@external/time/Now"},"145:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@145:12","span":{"start":[145,12],"end":[145,31],"bytes":[4185,4204]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore"},"145:33":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@145:33","span":{"start":[145,33],"end":[145,77],"bytes":[4206,4250]},"callee":"can://litestream/litestream/@external/errors/Is"},"147:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@147:4","span":{"start":[147,4],"end":[147,42],"bytes":[4280,4318]},"callee":"can://litestream/litestream/@external/log/slog/Info"},"150:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@150:10","span":{"start":[150,10],"end":[150,58],"bytes":[4346,4394]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"155:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@155:18","span":{"start":[155,18],"end":[161,15],"bytes":[4470,4703]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"157:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@157:20","span":{"start":[157,20],"end":[157,35],"bytes":[4558,4573]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"159:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@159:20","span":{"start":[159,20],"end":[159,52],"bytes":[4619,4651]},"callee":"can://litestream/litestream/@external/time/Duration.Milliseconds"},"159:20/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@159:20/2","span":{"start":[159,20],"end":[159,37],"bytes":[4619,4636]},"callee":"can://litestream/litestream/@external/time/Since"},"163:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@163:11","span":{"start":[163,11],"end":[163,59],"bytes":[4732,4780]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"165:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@165:15","span":{"start":[165,15],"end":[165,29],"bytes":[4799,4813]},"callee":null},"165:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@165:3","span":{"start":[165,3],"end":[165,30],"bytes":[4787,4814]},"callee":"can://litestream/litestream/@external/fmt/Println"},"26:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@26:9","span":{"start":[26,9],"end":[26,39],"bytes":[468,498]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewRestoreOptions"},"28:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@28:8","span":{"start":[28,8],"end":[28,67],"bytes":[507,566]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"29:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@29:29","span":{"start":[29,29],"end":[29,51],"bytes":[595,617]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"30:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@30:2","span":{"start":[30,2],"end":[30,55],"bytes":[619,672]},"callee":"can://litestream/litestream/@external/flag/FlagSet.StringVar"},"31:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@31:2","span":{"start":[31,2],"end":[31,57],"bytes":[674,729]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Var"},"31:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@31:9","span":{"start":[31,9],"end":[31,30],"bytes":[681,702]},"callee":null},"32:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@32:2","span":{"start":[32,2],"end":[32,76],"bytes":[731,805]},"callee":"can://litestream/litestream/@external/flag/FlagSet.IntVar"},"33:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@33:19","span":{"start":[33,19],"end":[33,57],"bytes":[824,862]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"34:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@34:21","span":{"start":[34,21],"end":[34,60],"bytes":[883,922]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"35:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@35:18","span":{"start":[35,18],"end":[35,57],"bytes":[940,979]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"36:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@36:12","span":{"start":[36,12],"end":[36,75],"bytes":[991,1054]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"37:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@37:11","span":{"start":[37,11],"end":[37,72],"bytes":[1065,1126]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"38:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@38:16","span":{"start":[38,16],"end":[38,57],"bytes":[1142,1183]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"39:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@39:2","span":{"start":[39,2],"end":[39,52],"bytes":[1185,1235]},"callee":"can://litestream/litestream/@external/flag/FlagSet.BoolVar"},"40:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@40:2","span":{"start":[40,2],"end":[40,112],"bytes":[1237,1347]},"callee":"can://litestream/litestream/@external/flag/FlagSet.DurationVar"},"41:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@41:20","span":{"start":[41,20],"end":[41,110],"bytes":[1367,1457]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"43:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@43:12","span":{"start":[43,12],"end":[43,26],"bytes":[1489,1503]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"45:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@45:12","span":{"start":[45,12],"end":[45,21],"bytes":[1542,1551]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"45:30":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@45:30","span":{"start":[45,30],"end":[45,39],"bytes":[1560,1569]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"50:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@50:12","span":{"start":[50,12],"end":[50,21],"bytes":[1736,1745]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"51:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@51:10","span":{"start":[51,10],"end":[51,42],"bytes":[1761,1793]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"58:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@58:2","span":{"start":[58,2],"end":[58,52],"bytes":[1868,1918]},"callee":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog"},"63:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@63:9","span":{"start":[63,9],"end":[63,21],"bytes":[2046,2058]},"callee":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan"},"64:24":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@64:24","span":{"start":[64,24],"end":[64,47],"bytes":[2082,2105]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"65:6":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@65:6","span":{"start":[65,6],"end":[71,6],"bytes":[2111,2197]},"callee":null,"is_goroutine":true},"73:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@73:9","span":{"start":[73,9],"end":[73,17],"bytes":[2224,2232]},"callee":null,"is_deferred":true},"84:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@84:10","span":{"start":[84,10],"end":[84,75],"bytes":[2485,2550]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"89:27":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@89:27","span":{"start":[89,27],"end":[89,66],"bytes":[2642,2681]},"callee":"can://litestream/litestream/@external/time/Parse"},"90:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@90:11","span":{"start":[90,11],"end":[90,105],"bytes":[2706,2800]},"callee":"can://litestream/litestream/@external/errors/New"},"96:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@96:22","span":{"start":[96,22],"end":[96,31],"bytes":[2896,2905]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"96:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@96:5","span":{"start":[96,5],"end":[96,32],"bytes":[2879,2906]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL"},"98:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run@98:11","span":{"start":[98,11],"end":[98,74],"bytes":[2944,3007]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run.closure_1","kind":"function","span":{"start":[65,1],"end":[71,6],"bytes":[2106,2197]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run.closure_1","parameters":[],"body":{"68:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run.closure_1@68:5","span":{"start":[68,5],"end":[68,13],"bytes":[2150,2158]},"callee":null},"69:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run.closure_1@69:11","span":{"start":[69,11],"end":[69,27],"bytes":[2169,2185]},"callee":"can://litestream/litestream/@external/context/Context.Done"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage","kind":"method","span":{"start":[362,1],"end":[451,2],"bytes":[10842,13267]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"363:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage@363:2","span":{"start":[363,2],"end":[450,3],"bytes":[10878,13265]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"420:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage@420:20","span":{"start":[420,20],"end":[420,70],"bytes":[12363,12413]},"callee":"can://litestream/litestream/@external/strconv/Itoa"},"449:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage@449:3","span":{"start":[449,3],"end":[449,22],"bytes":[13242,13261]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","kind":"method","span":{"start":[196,1],"end":[228,2],"bytes":[5626,6684]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[196,1],"end":[196,149],"bytes":[5626,5774]}},{"name":"source","type":"string","span":{"start":[196,1],"end":[196,149],"bytes":[5626,5774]}},{"name":"r","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[196,1],"end":[196,149],"bytes":[5626,5774]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[196,1],"end":[196,149],"bytes":[5626,5774]}}],"return_type":"(github.com/benbjohnson/litestream/cmd/litestream.RestorePlan, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"198:25":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@198:25","span":{"start":[198,25],"end":[198,66],"bytes":[5816,5857]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"201:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@201:16","span":{"start":[201,16],"end":[201,94],"bytes":[5877,5955]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan"},"201:83":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@201:83","span":{"start":[201,83],"end":[201,93],"bytes":[5944,5954]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"205:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@205:5","span":{"start":[205,5],"end":[205,15],"bytes":[6008,6018]},"callee":null},"212:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@212:15","span":{"start":[212,15],"end":[212,30],"bytes":[6171,6186]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"213:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@213:15","span":{"start":[213,15],"end":[213,40],"bytes":[6202,6227]},"callee":null},"214:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@214:15","span":{"start":[214,15],"end":[214,51],"bytes":[6243,6279]},"callee":null},"214:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@214:21","span":{"start":[214,21],"end":[214,31],"bytes":[6249,6259]},"callee":null},"215:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@215:15","span":{"start":[215,15],"end":[215,53],"bytes":[6295,6333]},"callee":null},"215:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@215:42","span":{"start":[215,42],"end":[215,52],"bytes":[6322,6332]},"callee":null},"218:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@218:16","span":{"start":[218,16],"end":[225,5],"bytes":[6383,6661]},"callee":null},"220:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@220:15","span":{"start":[220,15],"end":[220,61],"bytes":[6459,6505]},"callee":null},"221:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@221:15","span":{"start":[221,15],"end":[221,36],"bytes":[6521,6542]},"callee":null},"222:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@222:15","span":{"start":[222,15],"end":[222,36],"bytes":[6558,6579]},"callee":null},"224:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan@224:15","span":{"start":[224,15],"end":[224,50],"bytes":[6620,6655]},"callee":null}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","kind":"method","span":{"start":[328,1],"end":[359,2],"bytes":[9862,10797]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","parameters":[{"name":"_","type":"context.Context","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"dbPath","type":"string","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"configPath","type":"string","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"expandEnv","type":"bool","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"ifDBNotExists","type":"bool","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}},{"name":"opt","type":"*github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[328,1],"end":[328,180],"bytes":[9862,10041]}}],"return_type":"(*github.com/benbjohnson/litestream.Replica, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"330:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig@330:17","span":{"start":[330,17],"end":[330,54],"bytes":[10082,10119]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"336:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig@336:19","span":{"start":[336,19],"end":[336,33],"bytes":[10230,10244]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand"},"339:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig@339:14","span":{"start":[339,14],"end":[339,37],"bytes":[10293,10316]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig"},"341:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig@341:15","span":{"start":[341,15],"end":[341,69],"bytes":[10353,10407]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"343:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig@343:13","span":{"start":[343,13],"end":[343,38],"bytes":[10423,10448]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"354:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig@354:15","span":{"start":[354,15],"end":[354,38],"bytes":[10674,10697]},"callee":"can://litestream/litestream/@external/os/Stat"},"354:41":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig@354:41","span":{"start":[354,41],"end":[354,59],"bytes":[10700,10718]},"callee":"can://litestream/litestream/@external/os/IsNotExist"}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","kind":"method","span":{"start":[300,1],"end":[325,2],"bytes":[8949,9773]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[300,1],"end":[300,160],"bytes":[8949,9108]}},{"name":"replicaURL","type":"string","span":{"start":[300,1],"end":[300,160],"bytes":[8949,9108]}},{"name":"ifDBNotExists","type":"bool","span":{"start":[300,1],"end":[300,160],"bytes":[8949,9108]}},{"name":"opt","type":"*github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[300,1],"end":[300,160],"bytes":[8949,9108]}}],"return_type":"(*github.com/benbjohnson/litestream.Replica, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"304:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL@304:13","span":{"start":[304,13],"end":[304,76],"bytes":[9239,9302]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"309:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL@309:15","span":{"start":[309,15],"end":[309,38],"bytes":[9383,9406]},"callee":"can://litestream/litestream/@external/os/Stat"},"309:41":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL@309:41","span":{"start":[309,41],"end":[309,59],"bytes":[9409,9427]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"314:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL@314:12","span":{"start":[314,12],"end":[319,9],"bytes":[9540,9677]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig"},"323:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL@323:11","span":{"start":[323,11],"end":[323,41],"bytes":[9726,9756]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget"}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","kind":"method","span":{"start":[268,1],"end":[297,2],"bytes":[7749,8864]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","parameters":[{"name":"path","type":"string","span":{"start":[268,1],"end":[268,76],"bytes":[7749,7824]}},{"name":"force","type":"bool","span":{"start":[268,1],"end":[268,76],"bytes":[7749,7824]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"269:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@269:15","span":{"start":[269,15],"end":[269,28],"bytes":[7839,7852]},"callee":"can://litestream/litestream/@external/os/Stat"},"270:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@270:5","span":{"start":[270,5],"end":[270,23],"bytes":[7857,7875]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"273:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@273:10","span":{"start":[273,10],"end":[273,58],"bytes":[7924,7972]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"275:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@275:5","span":{"start":[275,5],"end":[275,17],"bytes":[7980,7992]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir"},"276:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@276:10","span":{"start":[276,10],"end":[276,76],"bytes":[8004,8070]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"279:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@279:5","span":{"start":[279,5],"end":[279,16],"bytes":[8079,8090]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"280:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@280:10","span":{"start":[280,10],"end":[280,118],"bytes":[8116,8224]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"284:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@284:16","span":{"start":[284,16],"end":[284,36],"bytes":[8333,8353]},"callee":"can://litestream/litestream/@external/os/Stat"},"285:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@285:11","span":{"start":[285,11],"end":[285,117],"bytes":[8388,8494]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"286:28":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@286:28","span":{"start":[286,28],"end":[286,46],"bytes":[8522,8540]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"287:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@287:11","span":{"start":[287,11],"end":[287,67],"bytes":[8553,8609]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"292:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@292:13","span":{"start":[292,13],"end":[292,34],"bytes":[8724,8745]},"callee":"can://litestream/litestream/@external/os/Remove"},"292:51":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@292:51","span":{"start":[292,51],"end":[292,69],"bytes":[8762,8780]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"293:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath@293:11","span":{"start":[293,11],"end":[293,61],"bytes":[8793,8843]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","kind":"method","span":{"start":[230,1],"end":[252,2],"bytes":[6686,7351]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","parameters":[{"name":"plan","type":"github.com/benbjohnson/litestream/cmd/litestream.RestorePlan","span":{"start":[230,1],"end":[230,61],"bytes":[6686,6746]}}],"metrics":{"cyclomatic":2},"body":{"231:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@231:2","span":{"start":[231,2],"end":[231,30],"bytes":[6748,6776]},"callee":"can://litestream/litestream/@external/fmt/Println"},"232:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@232:2","span":{"start":[232,2],"end":[232,43],"bytes":[6778,6819]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"233:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@233:2","span":{"start":[233,2],"end":[233,47],"bytes":[6821,6866]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"234:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@234:2","span":{"start":[234,2],"end":[234,45],"bytes":[6868,6911]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"235:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@235:2","span":{"start":[235,2],"end":[235,67],"bytes":[6913,6978]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"236:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@236:2","span":{"start":[236,2],"end":[236,15],"bytes":[6980,6993]},"callee":"can://litestream/litestream/@external/fmt/Println"},"237:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@237:2","span":{"start":[237,2],"end":[237,32],"bytes":[6995,7025]},"callee":"can://litestream/litestream/@external/fmt/Println"},"239:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@239:7","span":{"start":[239,7],"end":[239,54],"bytes":[7033,7080]},"callee":"can://litestream/litestream/@external/text/tabwriter/NewWriter"},"240:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@240:8","span":{"start":[240,8],"end":[240,17],"bytes":[7088,7097]},"callee":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","is_deferred":true},"241:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@241:2","span":{"start":[241,2],"end":[241,69],"bytes":[7099,7166]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"},"243:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan@243:3","span":{"start":[243,3],"end":[250,4],"bytes":[7204,7346]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"}}},"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","kind":"method","span":{"start":[254,1],"end":[266,2],"bytes":[7353,7747]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[254,1],"end":[254,121],"bytes":[7353,7473]}},{"name":"r","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[254,1],"end":[254,121],"bytes":[7353,7473]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[254,1],"end":[254,121],"bytes":[7353,7473]}}],"return_type":"string","metrics":{"cyclomatic":4},"body":{"256:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID@256:10","span":{"start":[256,10],"end":[256,27],"bytes":[7503,7520]},"callee":null},"261:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID@261:16","span":{"start":[261,16],"end":[261,94],"bytes":[7571,7649]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan"},"261:83":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID@261:83","span":{"start":[261,83],"end":[261,93],"bytes":[7638,7648]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"262:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID@262:19","span":{"start":[262,19],"end":[262,29],"bytes":[7668,7678]},"callee":null},"265:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID@265:15","span":{"start":[265,15],"end":[265,25],"bytes":[7715,7725]},"callee":null},"265:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID@265:9","span":{"start":[265,9],"end":[265,45],"bytes":[7709,7745]},"callee":null}}}}},"RestorePlan":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan","kind":"struct","span":{"start":[170,1],"end":[177,2],"bytes":[4833,5145]},"callables":{},"fields":{"Files":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/Files","kind":"field","type":"[]github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile","span":{"start":[176,1],"end":[176,45],"bytes":[5099,5143]}},"MaxTXID":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/MaxTXID","kind":"field","type":"string","span":{"start":[175,1],"end":[175,48],"bytes":[5051,5098]}},"MinTXID":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/MinTXID","kind":"field","type":"string","span":{"start":[174,1],"end":[174,48],"bytes":[5003,5050]}},"Replica":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/Replica","kind":"field","type":"string","span":{"start":[173,1],"end":[173,47],"bytes":[4956,5002]}},"Source":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/Source","kind":"field","type":"string","span":{"start":[171,1],"end":[171,46],"bytes":[4859,4904]}},"TargetPath":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlan/TargetPath","kind":"field","type":"string","span":{"start":[172,1],"end":[172,51],"bytes":[4905,4955]}}}},"RestorePlanFile":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile","kind":"struct","span":{"start":[179,1],"end":[186,2],"bytes":[5147,5384]},"callables":{},"fields":{"Level":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/Level","kind":"field","type":"int","span":{"start":[180,1],"end":[180,33],"bytes":[5177,5209]}},"MaxTXID":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/MaxTXID","kind":"field","type":"string","span":{"start":[183,1],"end":[183,36],"bytes":[5278,5313]}},"MinTXID":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/MinTXID","kind":"field","type":"string","span":{"start":[182,1],"end":[182,36],"bytes":[5242,5277]}},"Name":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/Name","kind":"field","type":"string","span":{"start":[181,1],"end":[181,32],"bytes":[5210,5241]}},"Size":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/Size","kind":"field","type":"int64","span":{"start":[184,1],"end":[184,32],"bytes":[5314,5345]}},"Timestamp":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestorePlanFile/Timestamp","kind":"field","type":"string","span":{"start":[185,1],"end":[185,37],"bytes":[5346,5382]}}}},"RestoreResult":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult","kind":"struct","span":{"start":[188,1],"end":[194,2],"bytes":[5386,5624]},"callables":{},"fields":{"DBPath":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/DBPath","kind":"field","type":"string","span":{"start":[189,1],"end":[189,40],"bytes":[5414,5453]}},"DurationMS":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/DurationMS","kind":"field","type":"int64","span":{"start":[192,1],"end":[192,44],"bytes":[5531,5574]}},"IntegrityCheck":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/IntegrityCheck","kind":"field","type":"string","span":{"start":[193,1],"end":[193,48],"bytes":[5575,5622]}},"Replica":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/Replica","kind":"field","type":"string","span":{"start":[190,1],"end":[190,40],"bytes":[5454,5493]}},"TXID":{"id":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreResult/TXID","kind":"field","type":"string","span":{"start":[191,1],"end":[191,37],"bytes":[5494,5530]}}}}},"functions":{},"content_hash":"86e46d8df1604840766b9f0392d007410769da6c8459a88d3b534e8a312e4373"},"cmd/litestream/start.go":{"id":"can://litestream/litestream/go/cmd/litestream/start.go","kind":"module","span":{"start":[1,1],"end":[159,1],"bytes":[0,4011]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// StartCommand represents the command to start replication for a database.\ntype StartCommand struct{}\n\n// Run executes the start command.\nfunc (c *StartCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-start\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream start /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\t// Create HTTP client that connects via Unix socket with timeout\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.StartRequest{\n\t\tPath: dbPath,\n\t\tTimeout: *timeout,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tresp, err := client.Post(\"http://localhost/start\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"start failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"start failed: %s\", string(body))\n\t}\n\n\tvar result litestream.StartResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := StartStopResult{\n\t\tStatus: result.Status,\n\t\tDBPath: result.Path,\n\t\tState: \"running\",\n\t\tTXID: result.TXID,\n\t\tSocket: *socketPath,\n\t}\n\tif err := printStartStopResult(confirmation, *jsonOutput); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype StartStopResult struct {\n\tStatus string `json:\"status\"`\n\tDBPath string `json:\"db_path\"`\n\tState string `json:\"state\"`\n\tTXID uint64 `json:\"txid\"`\n\tSocket string `json:\"socket\"`\n}\n\nfunc printStartStopResult(result StartStopResult, jsonOutput bool) error {\n\tif jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"status: %s\\n\", result.Status)\n\tfmt.Printf(\"db_path: %s\\n\", result.DBPath)\n\tfmt.Printf(\"state: %s\\n\", result.State)\n\tfmt.Printf(\"txid: %d\\n\", result.TXID)\n\tfmt.Printf(\"socket: %s\\n\", result.Socket)\n\n\treturn nil\n}\n\n// Usage prints the help text for the start command.\nfunc (c *StartCommand) Usage() {\n\tfmt.Println(`\nusage: litestream start [OPTIONS] DB_PATH\n\nStart replication for a database.\n\nOptions:\n -timeout SECONDS\n Maximum time to wait in seconds (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n # Start replication for a database on the running daemon.\n $ litestream start /path/to/db\n\n # Start replication and emit a JSON confirmation.\n $ litestream start -json /path/to/db\n\n # Start replication using a non-default control socket.\n $ litestream start -socket /tmp/litestream.sock /path/to/db\n\n # Start replication and wait up to 10 seconds for the daemon response.\n $ litestream start -timeout 10 /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"StartCommand":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand","kind":"struct","span":{"start":[18,1],"end":[18,27],"bytes":[225,251]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","kind":"method","span":{"start":[21,1],"end":[99,2],"bytes":[288,2473]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[21,1],"end":[21,71],"bytes":[288,358]}},{"name":"args","type":"[]string","span":{"start":[21,1],"end":[21,71],"bytes":[288,358]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"22:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@22:8","span":{"start":[22,8],"end":[22,65],"bytes":[366,423]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"23:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@23:13","span":{"start":[23,13],"end":[23,56],"bytes":[436,479]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Int"},"24:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@24:16","span":{"start":[24,16],"end":[24,86],"bytes":[495,565]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"25:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@25:16","span":{"start":[25,16],"end":[25,57],"bytes":[581,622]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"27:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@27:12","span":{"start":[27,12],"end":[27,26],"bytes":[654,668]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"31:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@31:5","span":{"start":[31,5],"end":[31,14],"bytes":[704,713]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"37:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@37:5","span":{"start":[37,5],"end":[37,14],"bytes":[836,845]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"38:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@38:10","span":{"start":[38,10],"end":[38,42],"bytes":[861,893]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"41:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@41:12","span":{"start":[41,12],"end":[41,21],"bytes":[909,918]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"44:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@44:19","span":{"start":[44,19],"end":[44,42],"bytes":[1004,1027]},"callee":null},"58:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@58:18","span":{"start":[58,18],"end":[58,35],"bytes":[1367,1384]},"callee":"can://litestream/litestream/@external/encoding/json/Marshal"},"60:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@60:10","span":{"start":[60,10],"end":[60,58],"bytes":[1411,1459]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"63:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@63:15","span":{"start":[63,15],"end":[63,98],"bytes":[1478,1561]},"callee":"can://litestream/litestream/@external/net/http/Client.Post"},"63:73":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@63:73","span":{"start":[63,73],"end":[63,97],"bytes":[1536,1560]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"65:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@65:10","span":{"start":[65,10],"end":[65,68],"bytes":[1588,1646]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"67:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@67:8","span":{"start":[67,8],"end":[67,25],"bytes":[1657,1674]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"69:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@69:15","span":{"start":[69,15],"end":[69,36],"bytes":[1690,1711]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"71:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@71:10","span":{"start":[71,10],"end":[71,56],"bytes":[1738,1784]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"76:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@76:13","span":{"start":[76,13],"end":[76,43],"bytes":[1879,1909]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"77:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@77:11","span":{"start":[77,11],"end":[77,56],"bytes":[1957,2002]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"79:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@79:10","span":{"start":[79,10],"end":[79,54],"bytes":[2016,2060]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"79:41":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@79:41","span":{"start":[79,41],"end":[79,53],"bytes":[2047,2059]},"callee":null},"83:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@83:12","span":{"start":[83,12],"end":[83,41],"bytes":[2113,2142]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"84:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@84:10","span":{"start":[84,10],"end":[84,57],"bytes":[2166,2213]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"94:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run@94:12","span":{"start":[94,12],"end":[94,59],"bytes":[2381,2428]},"callee":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run.closure_1","kind":"function","span":{"start":[48,1],"end":[50,6],"bytes":[1123,1264]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[48,1],"end":[48,73],"bytes":[1123,1195]}},{"name":"_","type":"string","span":{"start":[48,1],"end":[48,73],"bytes":[1123,1195]}},{"name":"_","type":"string","span":{"start":[48,1],"end":[48,73],"bytes":[1123,1195]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"49:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run.closure_1@49:12","span":{"start":[49,12],"end":[49,63],"bytes":[1207,1258]},"callee":"can://litestream/litestream/@external/net/DialTimeout"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Usage","kind":"method","span":{"start":[129,1],"end":[158,2],"bytes":[3214,4010]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"130:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Usage@130:2","span":{"start":[130,2],"end":[157,7],"bytes":[3248,4008]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}},"StartStopResult":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult","kind":"struct","span":{"start":[101,1],"end":[107,2],"bytes":[2475,2659]},"callables":{},"fields":{"DBPath":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/DBPath","kind":"field","type":"string","span":{"start":[103,1],"end":[103,32],"bytes":[2536,2567]}},"Socket":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/Socket","kind":"field","type":"string","span":{"start":[106,1],"end":[106,31],"bytes":[2627,2657]}},"State":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/State","kind":"field","type":"string","span":{"start":[104,1],"end":[104,30],"bytes":[2568,2597]}},"Status":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/Status","kind":"field","type":"string","span":{"start":[102,1],"end":[102,31],"bytes":[2505,2535]}},"TXID":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartStopResult/TXID","kind":"field","type":"uint64","span":{"start":[105,1],"end":[105,29],"bytes":[2598,2626]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult":{"id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","kind":"function","span":{"start":[109,1],"end":[126,2],"bytes":[2661,3159]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","parameters":[{"name":"result","type":"github.com/benbjohnson/litestream/cmd/litestream.StartStopResult","span":{"start":[109,1],"end":[109,75],"bytes":[2661,2735]}},{"name":"jsonOutput","type":"bool","span":{"start":[109,1],"end":[109,75],"bytes":[2661,2735]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"111:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@111:18","span":{"start":[111,18],"end":[111,54],"bytes":[2770,2806]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"113:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@113:11","span":{"start":[113,11],"end":[113,59],"bytes":[2835,2883]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"115:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@115:15","span":{"start":[115,15],"end":[115,29],"bytes":[2902,2916]},"callee":null},"115:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@115:3","span":{"start":[115,3],"end":[115,30],"bytes":[2890,2917]},"callee":"can://litestream/litestream/@external/fmt/Println"},"119:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@119:2","span":{"start":[119,2],"end":[119,43],"bytes":[2936,2977]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"120:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@120:2","span":{"start":[120,2],"end":[120,44],"bytes":[2979,3021]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"121:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@121:2","span":{"start":[121,2],"end":[121,41],"bytes":[3023,3062]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"122:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@122:2","span":{"start":[122,2],"end":[122,39],"bytes":[3064,3101]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"123:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult@123:2","span":{"start":[123,2],"end":[123,43],"bytes":[3103,3144]},"callee":"can://litestream/litestream/@external/fmt/Printf"}}}},"content_hash":"84e42db46c78b62cc29bf708a9610b4ddb39e2e2ce292b681993a6b1316102d6"},"cmd/litestream/status.go":{"id":"can://litestream/litestream/go/cmd/litestream/status.go","kind":"module","span":{"start":[1,1],"end":[174,1],"bytes":[0,3920]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"text/tabwriter\"\n\n\t\"github.com/dustin/go-humanize\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// StatusCommand is a command for displaying replication status.\ntype StatusCommand struct{}\n\n// Run executes the command.\nfunc (c *StatusCommand) Run(ctx context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-status\", flag.ContinueOnError)\n\tconfigPath, noExpandEnv := registerConfigFlag(fs)\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\t// Load configuration.\n\tif *configPath == \"\" {\n\t\t*configPath = DefaultConfigPath()\n\t}\n\tconfig, err := ReadConfigFile(*configPath, !*noExpandEnv)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// If a specific database path is provided, filter to just that one.\n\tvar filterPath string\n\tif fs.NArg() \u003e 0 {\n\t\tfilterPath = fs.Arg(0)\n\t}\n\n\tstatuses := make([]DBStatus, 0, len(config.DBs))\n\n\tfor _, dbConfig := range config.DBs {\n\t\tdb, err := NewDBFromConfig(dbConfig)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Filter if path specified.\n\t\tif filterPath != \"\" \u0026\u0026 db.Path() != filterPath {\n\t\t\tcontinue\n\t\t}\n\n\t\tstatuses = append(statuses, c.getDBStatus(db))\n\t}\n\n\tif *jsonOutput {\n\t\toutput, err := json.MarshalIndent(statuses, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tw := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)\n\tdefer w.Flush()\n\n\tfmt.Fprintln(w, \"database\\tstatus\\tlocal txid\\twal size\")\n\tfor _, status := range statuses {\n\t\tfmt.Fprintf(w, \"%s\\t%s\\t%s\\t%s\\n\",\n\t\t\tstatus.Database,\n\t\t\tstatus.Status,\n\t\t\tstatus.LocalTXID,\n\t\t\tstatus.WALSize,\n\t\t)\n\t}\n\n\treturn nil\n}\n\n// DBStatus holds the status information for a single database.\ntype DBStatus struct {\n\tDatabase string `json:\"database\"`\n\tStatus string `json:\"status\"`\n\tLocalTXID string `json:\"local_txid\"`\n\tWALSize string `json:\"wal_size\"`\n}\n\n// getDBStatus gathers status information for a database.\nfunc (c *StatusCommand) getDBStatus(db *litestream.DB) DBStatus {\n\tstatus := DBStatus{\n\t\tDatabase: db.Path(),\n\t\tStatus: \"unknown\",\n\t\tLocalTXID: \"-\",\n\t\tWALSize: \"-\",\n\t}\n\n\t// Check if database file exists.\n\tdbPath := db.Path()\n\tif _, err := os.Stat(dbPath); os.IsNotExist(err) {\n\t\tstatus.Status = \"no database\"\n\t\treturn status\n\t}\n\n\t// Get WAL file size.\n\twalPath := db.WALPath()\n\tif walInfo, err := os.Stat(walPath); err == nil {\n\t\tstatus.WALSize = humanize.Bytes(uint64(walInfo.Size()))\n\t} else if os.IsNotExist(err) {\n\t\tstatus.WALSize = \"0 B\"\n\t}\n\n\t// Get local TXID from L0 directory.\n\t_, maxTXID, err := db.MaxLTX()\n\tif err == nil \u0026\u0026 maxTXID \u003e 0 {\n\t\tstatus.LocalTXID = maxTXID.String()\n\t\tstatus.Status = \"ok\"\n\t} else if err == nil {\n\t\tstatus.Status = \"not initialized\"\n\t} else {\n\t\tstatus.Status = \"error\"\n\t}\n\n\treturn status\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *StatusCommand) Usage() {\n\tfmt.Printf(`\nThe status command displays the replication status of databases.\n\nUsage:\n\n\tlitestream status [arguments] [database path]\n\nArguments:\n\n\t-config PATH\n\t Specifies the configuration file.\n\t Defaults to %s\n\n\t-json\n\t Output raw JSON instead of human-readable text.\n\n\t-no-expand-env\n\t Disables environment variable expansion in configuration file.\n\nIf a database path is provided, only that database's status is shown.\nOtherwise, all configured databases are displayed.\n\nOutput columns:\n database Path to the SQLite database\n status Current status (ok, not initialized, no database, error)\n local txid Latest local transaction ID\n wal size Current WAL file size\n\nNote: To see replica TXID and sync status, inspect daemon diagnostics or logs\nwhile the replication daemon is running.\n\nExamples:\n\n\t$ litestream status\n\t$ litestream status /path/to/db\n\t$ litestream status -json\n\n`[1:],\n\t\tDefaultConfigPath(),\n\t)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[34,50]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[51,58]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[59,65]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[66,71]}},{"name":"tabwriter","path":"text/tabwriter","span":{"start":[9,1],"end":[9,18],"bytes":[72,89]}},{"name":"go-humanize","path":"github.com/dustin/go-humanize","span":{"start":[11,1],"end":[11,33],"bytes":[91,123]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[13,1],"end":[13,37],"bytes":[125,161]}}],"types":{"DBStatus":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus","kind":"struct","span":{"start":[86,1],"end":[91,2],"bytes":[1827,1995]},"callables":{},"fields":{"Database":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus/Database","kind":"field","type":"string","span":{"start":[87,1],"end":[87,36],"bytes":[1850,1885]}},"LocalTXID":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus/LocalTXID","kind":"field","type":"string","span":{"start":[89,1],"end":[89,38],"bytes":[1920,1957]}},"Status":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus/Status","kind":"field","type":"string","span":{"start":[88,1],"end":[88,34],"bytes":[1886,1919]}},"WALSize":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.DBStatus/WALSize","kind":"field","type":"string","span":{"start":[90,1],"end":[90,36],"bytes":[1958,1993]}}}},"StatusCommand":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand","kind":"struct","span":{"start":[17,1],"end":[17,28],"bytes":[230,257]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","kind":"method","span":{"start":[20,1],"end":[83,2],"bytes":[288,1761]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[20,1],"end":[20,78],"bytes":[288,365]}},{"name":"args","type":"[]string","span":{"start":[20,1],"end":[20,78],"bytes":[288,365]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"21:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@21:8","span":{"start":[21,8],"end":[21,66],"bytes":[373,431]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"22:29":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@22:29","span":{"start":[22,29],"end":[22,51],"bytes":[460,482]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag"},"23:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@23:16","span":{"start":[23,16],"end":[23,57],"bytes":[498,539]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"25:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@25:12","span":{"start":[25,12],"end":[25,26],"bytes":[571,585]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"31:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@31:17","span":{"start":[31,17],"end":[31,36],"bytes":[681,700]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"},"33:17":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@33:17","span":{"start":[33,17],"end":[33,59],"bytes":[720,762]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile"},"40:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@40:5","span":{"start":[40,5],"end":[40,14],"bytes":[894,903]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"41:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@41:16","span":{"start":[41,16],"end":[41,25],"bytes":[925,934]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"44:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@44:14","span":{"start":[44,14],"end":[44,50],"bytes":[952,988]},"callee":null},"44:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@44:34","span":{"start":[44,34],"end":[44,49],"bytes":[972,987]},"callee":null},"47:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@47:14","span":{"start":[47,14],"end":[47,39],"bytes":[1042,1067]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig"},"53:26":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@53:26","span":{"start":[53,26],"end":[53,35],"bytes":[1161,1170]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"57:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@57:14","span":{"start":[57,14],"end":[57,49],"bytes":[1217,1252]},"callee":null},"57:31":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@57:31","span":{"start":[57,31],"end":[57,48],"bytes":[1234,1251]},"callee":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus"},"61:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@61:18","span":{"start":[61,18],"end":[61,56],"bytes":[1292,1330]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"63:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@63:11","span":{"start":[63,11],"end":[63,59],"bytes":[1359,1407]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"65:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@65:15","span":{"start":[65,15],"end":[65,29],"bytes":[1426,1440]},"callee":null},"65:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@65:3","span":{"start":[65,3],"end":[65,30],"bytes":[1414,1441]},"callee":"can://litestream/litestream/@external/fmt/Println"},"69:7":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@69:7","span":{"start":[69,7],"end":[69,54],"bytes":[1465,1512]},"callee":"can://litestream/litestream/@external/text/tabwriter/NewWriter"},"70:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@70:8","span":{"start":[70,8],"end":[70,17],"bytes":[1520,1529]},"callee":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","is_deferred":true},"72:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@72:2","span":{"start":[72,2],"end":[72,59],"bytes":[1532,1589]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"},"74:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run@74:3","span":{"start":[74,3],"end":[79,4],"bytes":[1627,1743]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"}}},"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage","kind":"method","span":{"start":[132,1],"end":[173,2],"bytes":[2932,3919]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"133:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage@133:2","span":{"start":[133,2],"end":[172,3],"bytes":[2967,3917]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"171:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage@171:3","span":{"start":[171,3],"end":[171,22],"bytes":[3894,3913]},"callee":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath"}}},"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus":{"id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","kind":"method","span":{"start":[94,1],"end":[129,2],"bytes":[2055,2887]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","parameters":[{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[94,1],"end":[94,66],"bytes":[2055,2120]}}],"return_type":"github.com/benbjohnson/litestream/cmd/litestream.DBStatus","metrics":{"cyclomatic":6},"body":{"103:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@103:12","span":{"start":[103,12],"end":[103,21],"bytes":[2276,2285]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"104:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@104:15","span":{"start":[104,15],"end":[104,30],"bytes":[2300,2315]},"callee":"can://litestream/litestream/@external/os/Stat"},"104:32":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@104:32","span":{"start":[104,32],"end":[104,50],"bytes":[2317,2335]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"110:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@110:13","span":{"start":[110,13],"end":[110,25],"bytes":[2425,2437]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"111:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@111:21","span":{"start":[111,21],"end":[111,37],"bytes":[2458,2474]},"callee":"can://litestream/litestream/@external/os/Stat"},"112:20":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@112:20","span":{"start":[112,20],"end":[112,58],"bytes":[2508,2546]},"callee":null},"112:35":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@112:35","span":{"start":[112,35],"end":[112,57],"bytes":[2523,2545]},"callee":null},"112:42":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@112:42","span":{"start":[112,42],"end":[112,56],"bytes":[2530,2544]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"113:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@113:12","span":{"start":[113,12],"end":[113,30],"bytes":[2558,2576]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"118:21":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@118:21","span":{"start":[118,21],"end":[118,32],"bytes":[2666,2677]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"120:22":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@120:22","span":{"start":[120,22],"end":[120,38],"bytes":[2731,2747]},"callee":null},"96:14":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus@96:14","span":{"start":[96,14],"end":[96,23],"bytes":[2155,2164]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}}}}},"functions":{},"content_hash":"98a8f08a6eb5a3cbf7ad03e9f39b80995556107089918886c263347426f999a9"},"cmd/litestream/stop.go":{"id":"can://litestream/litestream/go/cmd/litestream/stop.go","kind":"module","span":{"start":[1,1],"end":[133,1],"bytes":[0,3330]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// StopCommand represents the command to stop replication for a database.\ntype StopCommand struct{}\n\n// Run executes the stop command.\nfunc (c *StopCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-stop\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream stop /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\t// Create HTTP client that connects via Unix socket with timeout\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.StopRequest{\n\t\tPath: dbPath,\n\t\tTimeout: *timeout,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tresp, err := client.Post(\"http://localhost/stop\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"stop failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"stop failed: %s\", string(body))\n\t}\n\n\tvar result litestream.StopResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := StartStopResult{\n\t\tStatus: result.Status,\n\t\tDBPath: result.Path,\n\t\tState: \"stopped\",\n\t\tTXID: result.TXID,\n\t\tSocket: *socketPath,\n\t}\n\tif err := printStartStopResult(confirmation, *jsonOutput); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Usage prints the help text for the stop command.\nfunc (c *StopCommand) Usage() {\n\tfmt.Println(`\nusage: litestream stop [OPTIONS] DB_PATH\n\nStop replication for a database.\nStop always waits for shutdown and final sync.\n\nOptions:\n -timeout SECONDS\n Maximum time to wait in seconds (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n # Stop replication for a database.\n $ litestream stop /path/to/db\n\n # Stop replication and emit a JSON confirmation.\n $ litestream stop -json /path/to/db\n\n # Stop replication using a non-default control socket.\n $ litestream stop -socket /tmp/litestream.sock /path/to/db\n\n # Stop replication and wait up to 10 seconds for final sync and shutdown.\n $ litestream stop -timeout 10 /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"StopCommand":{"id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand","kind":"struct","span":{"start":[18,1],"end":[18,26],"bytes":[223,248]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","kind":"method","span":{"start":[21,1],"end":[99,2],"bytes":[284,2461]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[21,1],"end":[21,70],"bytes":[284,353]}},{"name":"args","type":"[]string","span":{"start":[21,1],"end":[21,70],"bytes":[284,353]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"22:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@22:8","span":{"start":[22,8],"end":[22,64],"bytes":[361,417]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"23:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@23:13","span":{"start":[23,13],"end":[23,56],"bytes":[430,473]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Int"},"24:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@24:16","span":{"start":[24,16],"end":[24,86],"bytes":[489,559]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"25:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@25:16","span":{"start":[25,16],"end":[25,57],"bytes":[575,616]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"27:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@27:12","span":{"start":[27,12],"end":[27,26],"bytes":[648,662]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"31:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@31:5","span":{"start":[31,5],"end":[31,14],"bytes":[698,707]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"37:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@37:5","span":{"start":[37,5],"end":[37,14],"bytes":[829,838]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"38:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@38:10","span":{"start":[38,10],"end":[38,42],"bytes":[854,886]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"41:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@41:12","span":{"start":[41,12],"end":[41,21],"bytes":[902,911]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"44:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@44:19","span":{"start":[44,19],"end":[44,42],"bytes":[997,1020]},"callee":null},"58:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@58:18","span":{"start":[58,18],"end":[58,35],"bytes":[1359,1376]},"callee":"can://litestream/litestream/@external/encoding/json/Marshal"},"60:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@60:10","span":{"start":[60,10],"end":[60,58],"bytes":[1403,1451]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"63:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@63:15","span":{"start":[63,15],"end":[63,97],"bytes":[1470,1552]},"callee":"can://litestream/litestream/@external/net/http/Client.Post"},"63:72":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@63:72","span":{"start":[63,72],"end":[63,96],"bytes":[1527,1551]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"65:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@65:10","span":{"start":[65,10],"end":[65,68],"bytes":[1579,1637]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"67:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@67:8","span":{"start":[67,8],"end":[67,25],"bytes":[1648,1665]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"69:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@69:15","span":{"start":[69,15],"end":[69,36],"bytes":[1681,1702]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"71:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@71:10","span":{"start":[71,10],"end":[71,56],"bytes":[1729,1775]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"76:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@76:13","span":{"start":[76,13],"end":[76,43],"bytes":[1870,1900]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"77:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@77:11","span":{"start":[77,11],"end":[77,55],"bytes":[1948,1992]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"79:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@79:10","span":{"start":[79,10],"end":[79,53],"bytes":[2006,2049]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"79:40":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@79:40","span":{"start":[79,40],"end":[79,52],"bytes":[2036,2048]},"callee":null},"83:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@83:12","span":{"start":[83,12],"end":[83,41],"bytes":[2101,2130]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"84:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@84:10","span":{"start":[84,10],"end":[84,57],"bytes":[2154,2201]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"94:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run@94:12","span":{"start":[94,12],"end":[94,59],"bytes":[2369,2416]},"callee":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run.closure_1","kind":"function","span":{"start":[48,1],"end":[50,6],"bytes":[1116,1257]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[48,1],"end":[48,73],"bytes":[1116,1188]}},{"name":"_","type":"string","span":{"start":[48,1],"end":[48,73],"bytes":[1116,1188]}},{"name":"_","type":"string","span":{"start":[48,1],"end":[48,73],"bytes":[1116,1188]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"49:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run.closure_1@49:12","span":{"start":[49,12],"end":[49,63],"bytes":[1200,1251]},"callee":"can://litestream/litestream/@external/net/DialTimeout"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Usage","kind":"method","span":{"start":[102,1],"end":[132,2],"bytes":[2515,3329]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"103:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Usage@103:2","span":{"start":[103,2],"end":[131,7],"bytes":[2548,3327]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}}},"functions":{},"content_hash":"7980bb929ad3d474f22b95549b12385368f7253b2704c25e3656b0c025b55625"},"cmd/litestream/sync.go":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go","kind":"module","span":{"start":[1,1],"end":[162,1],"bytes":[0,4043]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\n// SyncCommand represents the command to force an immediate sync for a database.\ntype SyncCommand struct{}\n\n// Run executes the sync command.\nfunc (c *SyncCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-sync\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\twait := fs.Bool(\"wait\", false, \"block until sync completes\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream sync /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.SyncRequest{\n\t\tPath: dbPath,\n\t\tWait: *wait,\n\t\tTimeout: *timeout,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tstart := time.Now()\n\tresp, err := client.Post(\"http://localhost/sync\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\tdurationMS := time.Since(start).Milliseconds()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"sync failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"sync failed: %s\", string(body))\n\t}\n\n\tvar result litestream.SyncResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := SyncResult{\n\t\tDBPath: result.Path,\n\t\tTXID: result.TXID,\n\t\tDurationMS: durationMS,\n\t}\n\tif *wait {\n\t\tconfirmation.ReplicaTXID = \u0026result.ReplicatedTXID\n\t}\n\tif err := printSyncResult(confirmation, *jsonOutput); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype SyncResult struct {\n\tDBPath string `json:\"db_path\"`\n\tTXID uint64 `json:\"txid\"`\n\tReplicaTXID *uint64 `json:\"replica_txid,omitempty\"`\n\tDurationMS int64 `json:\"duration_ms\"`\n}\n\nfunc printSyncResult(result SyncResult, jsonOutput bool) error {\n\tif jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"db_path: %s\\n\", result.DBPath)\n\tfmt.Printf(\"txid: %d\\n\", result.TXID)\n\tif result.ReplicaTXID != nil {\n\t\tfmt.Printf(\"replica_txid: %d\\n\", *result.ReplicaTXID)\n\t}\n\tfmt.Printf(\"duration_ms: %d\\n\", result.DurationMS)\n\n\treturn nil\n}\n\n// Usage prints the help text for the sync command.\nfunc (c *SyncCommand) Usage() {\n\tfmt.Println(`\nusage: litestream sync [OPTIONS] DB_PATH\n\nForce an immediate sync for a database.\n\nOptions:\n -wait\n Block until sync completes including remote replication (default: false).\n\n -timeout SECONDS\n Maximum time to wait in seconds, best-effort (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n $ litestream sync /path/to/db\n $ litestream sync -json /path/to/db\n $ litestream sync -wait /path/to/db\n $ litestream sync -wait -timeout 120 /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"SyncCommand":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand","kind":"struct","span":{"start":[18,1],"end":[18,26],"bytes":[230,255]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","kind":"method","span":{"start":[21,1],"end":[106,2],"bytes":[291,2650]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[21,1],"end":[21,70],"bytes":[291,360]}},{"name":"args","type":"[]string","span":{"start":[21,1],"end":[21,70],"bytes":[291,360]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"101:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@101:12","span":{"start":[101,12],"end":[101,54],"bytes":[2563,2605]},"callee":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult"},"22:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@22:8","span":{"start":[22,8],"end":[22,64],"bytes":[368,424]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"23:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@23:13","span":{"start":[23,13],"end":[23,56],"bytes":[437,480]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Int"},"24:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@24:16","span":{"start":[24,16],"end":[24,86],"bytes":[496,566]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"25:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@25:10","span":{"start":[25,10],"end":[25,62],"bytes":[576,628]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"26:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@26:16","span":{"start":[26,16],"end":[26,57],"bytes":[644,685]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"28:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@28:12","span":{"start":[28,12],"end":[28,26],"bytes":[717,731]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"32:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@32:5","span":{"start":[32,5],"end":[32,14],"bytes":[767,776]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"38:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@38:5","span":{"start":[38,5],"end":[38,14],"bytes":[898,907]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"39:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@39:10","span":{"start":[39,10],"end":[39,42],"bytes":[923,955]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"42:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@42:10","span":{"start":[42,10],"end":[42,54],"bytes":[988,1032]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"45:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@45:12","span":{"start":[45,12],"end":[45,21],"bytes":[1048,1057]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"47:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@47:19","span":{"start":[47,19],"end":[47,42],"bytes":[1077,1100]},"callee":null},"62:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@62:18","span":{"start":[62,18],"end":[62,35],"bytes":[1457,1474]},"callee":"can://litestream/litestream/@external/encoding/json/Marshal"},"64:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@64:10","span":{"start":[64,10],"end":[64,58],"bytes":[1501,1549]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"67:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@67:11","span":{"start":[67,11],"end":[67,21],"bytes":[1564,1574]},"callee":"can://litestream/litestream/@external/time/Now"},"68:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@68:15","span":{"start":[68,15],"end":[68,97],"bytes":[1589,1671]},"callee":"can://litestream/litestream/@external/net/http/Client.Post"},"68:72":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@68:72","span":{"start":[68,72],"end":[68,96],"bytes":[1646,1670]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"70:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@70:10","span":{"start":[70,10],"end":[70,68],"bytes":[1698,1756]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"72:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@72:8","span":{"start":[72,8],"end":[72,25],"bytes":[1767,1784]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"73:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@73:16","span":{"start":[73,16],"end":[73,48],"bytes":[1800,1832]},"callee":"can://litestream/litestream/@external/time/Duration.Milliseconds"},"73:16/2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@73:16/2","span":{"start":[73,16],"end":[73,33],"bytes":[1800,1817]},"callee":"can://litestream/litestream/@external/time/Since"},"75:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@75:15","span":{"start":[75,15],"end":[75,36],"bytes":[1848,1869]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"77:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@77:10","span":{"start":[77,10],"end":[77,56],"bytes":[1896,1942]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"82:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@82:13","span":{"start":[82,13],"end":[82,43],"bytes":[2037,2067]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"83:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@83:11","span":{"start":[83,11],"end":[83,55],"bytes":[2115,2159]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"85:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@85:10","span":{"start":[85,10],"end":[85,53],"bytes":[2173,2216]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"85:40":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@85:40","span":{"start":[85,40],"end":[85,52],"bytes":[2203,2215]},"callee":null},"89:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@89:12","span":{"start":[89,12],"end":[89,41],"bytes":[2268,2297]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"90:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run@90:10","span":{"start":[90,10],"end":[90,57],"bytes":[2321,2368]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run.closure_1","kind":"function","span":{"start":[51,1],"end":[53,6],"bytes":[1196,1337]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[51,1],"end":[51,73],"bytes":[1196,1268]}},{"name":"_","type":"string","span":{"start":[51,1],"end":[51,73],"bytes":[1196,1268]}},{"name":"_","type":"string","span":{"start":[51,1],"end":[51,73],"bytes":[1196,1268]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"52:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run.closure_1@52:12","span":{"start":[52,12],"end":[52,63],"bytes":[1280,1331]},"callee":"can://litestream/litestream/@external/net/DialTimeout"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Usage","kind":"method","span":{"start":[136,1],"end":[161,2],"bytes":[3406,4042]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"137:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Usage@137:2","span":{"start":[137,2],"end":[160,7],"bytes":[3439,4040]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}},"SyncResult":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult","kind":"struct","span":{"start":[108,1],"end":[113,2],"bytes":[2652,2846]},"callables":{},"fields":{"DBPath":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult/DBPath","kind":"field","type":"string","span":{"start":[109,1],"end":[109,38],"bytes":[2677,2714]}},"DurationMS":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult/DurationMS","kind":"field","type":"int64","span":{"start":[112,1],"end":[112,42],"bytes":[2803,2844]}},"ReplicaTXID":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult/ReplicaTXID","kind":"field","type":"*uint64","span":{"start":[111,1],"end":[111,53],"bytes":[2750,2802]}},"TXID":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncResult/TXID","kind":"field","type":"uint64","span":{"start":[110,1],"end":[110,35],"bytes":[2715,2749]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.printSyncResult":{"id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","kind":"function","span":{"start":[115,1],"end":[133,2],"bytes":[2848,3352]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","parameters":[{"name":"result","type":"github.com/benbjohnson/litestream/cmd/litestream.SyncResult","span":{"start":[115,1],"end":[115,65],"bytes":[2848,2912]}},{"name":"jsonOutput","type":"bool","span":{"start":[115,1],"end":[115,65],"bytes":[2848,2912]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"117:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult@117:18","span":{"start":[117,18],"end":[117,54],"bytes":[2947,2983]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"119:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult@119:11","span":{"start":[119,11],"end":[119,59],"bytes":[3012,3060]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"121:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult@121:15","span":{"start":[121,15],"end":[121,29],"bytes":[3079,3093]},"callee":null},"121:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult@121:3","span":{"start":[121,3],"end":[121,30],"bytes":[3067,3094]},"callee":"can://litestream/litestream/@external/fmt/Println"},"125:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult@125:2","span":{"start":[125,2],"end":[125,44],"bytes":[3113,3155]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"126:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult@126:2","span":{"start":[126,2],"end":[126,39],"bytes":[3157,3194]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"128:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult@128:3","span":{"start":[128,3],"end":[128,56],"bytes":[3229,3282]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"130:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult@130:2","span":{"start":[130,2],"end":[130,52],"bytes":[3287,3337]},"callee":"can://litestream/litestream/@external/fmt/Printf"}}}},"content_hash":"f124c02d744ececee52a6c5a31922dc5e6a71a5b9fe8ad28262622a0785c0d9b"},"cmd/litestream/unregister.go":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go","kind":"module","span":{"start":[1,1],"end":[177,1],"bytes":[0,4764]},"package":"main","source":"package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\ntype UnregisterCommand struct{}\n\nfunc (c *UnregisterCommand) Run(ctx context.Context, args []string) error {\n\tfs := flag.NewFlagSet(\"litestream-unregister\", flag.ContinueOnError)\n\ttimeout := fs.Int(\"timeout\", 30, \"timeout in seconds\")\n\tsocketPath := fs.String(\"socket\", \"/var/run/litestream.sock\", \"control socket path\")\n\tdryRun := fs.Bool(\"dry-run\", false, \"print what would be unregistered without changing the daemon\")\n\tjsonOutput := fs.Bool(\"json\", false, \"output raw JSON\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif fs.NArg() == 0 {\n\t\treturn \u0026usageError{\n\t\t\tmessage: \"database path required\",\n\t\t\thint: \"litestream unregister /path/to/db\",\n\t\t}\n\t}\n\tif fs.NArg() \u003e 1 {\n\t\treturn fmt.Errorf(\"too many arguments\")\n\t}\n\tif *timeout \u003c= 0 {\n\t\treturn fmt.Errorf(\"timeout must be greater than 0\")\n\t}\n\n\tdbPath := fs.Arg(0)\n\n\tif *dryRun {\n\t\tfmt.Println(\"Dry run: unregister request preview\")\n\t\tfmt.Printf(\" database: %s\\n\", dbPath)\n\t\tfmt.Printf(\" socket: %s\\n\", *socketPath)\n\t\tfmt.Printf(\" replicas: daemon-managed replica for this database\\n\")\n\t\tfmt.Printf(\" final sync: daemon close will sync the database and replica before the command completes\\n\")\n\t\tfmt.Printf(\" timeout: %ds\\n\", *timeout)\n\t\tfmt.Println(\"No unregister request was sent.\")\n\t\treturn nil\n\t}\n\n\t// Create HTTP client that connects via Unix socket with timeout.\n\tclientTimeout := time.Duration(*timeout) * time.Second\n\tclient := \u0026http.Client{\n\t\tTimeout: clientTimeout,\n\t\tTransport: \u0026http.Transport{\n\t\t\tDialContext: func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\t\treturn net.DialTimeout(\"unix\", *socketPath, clientTimeout)\n\t\t\t},\n\t\t},\n\t}\n\n\treq := litestream.UnregisterDatabaseRequest{\n\t\tPath: dbPath,\n\t\tTimeout: *timeout,\n\t}\n\treqBody, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal request: %w\", err)\n\t}\n\n\tresp, err := client.Post(\"http://localhost/unregister\", \"application/json\", bytes.NewReader(reqBody))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to control socket: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read response: %w\", err)\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar errResp litestream.ErrorResponse\n\t\tif err := json.Unmarshal(body, \u0026errResp); err == nil \u0026\u0026 errResp.Error != \"\" {\n\t\t\treturn fmt.Errorf(\"unregister failed: %s\", errResp.Error)\n\t\t}\n\t\treturn fmt.Errorf(\"unregister failed: %s\", string(body))\n\t}\n\n\tvar result litestream.UnregisterDatabaseResponse\n\tif err := json.Unmarshal(body, \u0026result); err != nil {\n\t\treturn fmt.Errorf(\"failed to parse response: %w\", err)\n\t}\n\n\tconfirmation := UnregisterResult{\n\t\tStatus: result.Status,\n\t\tDBPath: result.Path,\n\t\tFinalTXID: result.TXID,\n\t\tSocket: *socketPath,\n\t}\n\tif err := printUnregisterResult(confirmation, *jsonOutput); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\ntype UnregisterResult struct {\n\tStatus string `json:\"status\"`\n\tDBPath string `json:\"db_path\"`\n\tFinalTXID uint64 `json:\"final_txid\"`\n\tSocket string `json:\"socket\"`\n}\n\nfunc printUnregisterResult(result UnregisterResult, jsonOutput bool) error {\n\tif jsonOutput {\n\t\toutput, err := json.MarshalIndent(result, \"\", \" \")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to format response: %w\", err)\n\t\t}\n\t\tfmt.Println(string(output))\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"status: %s\\n\", result.Status)\n\tfmt.Printf(\"db_path: %s\\n\", result.DBPath)\n\tfmt.Printf(\"final_txid: %d\\n\", result.FinalTXID)\n\tfmt.Printf(\"socket: %s\\n\", result.Socket)\n\n\treturn nil\n}\n\nfunc (c *UnregisterCommand) Usage() {\n\tfmt.Println(`\nusage: litestream unregister [OPTIONS] DB_PATH\n\nUnregister a database from replication.\n\nArguments:\n DB_PATH Path to the SQLite database file.\n\nOptions:\n -timeout SECONDS\n Maximum time to wait in seconds (default: 30).\n\n -socket PATH\n Path to control socket (default: /var/run/litestream.sock).\n\n -dry-run\n Preview what would be unregistered without changing the daemon.\n\n -json\n Output raw JSON instead of human-readable text.\n\nExamples:\n # Unregister a database from the running daemon.\n $ litestream unregister /path/to/db\n\n # Unregister a database and emit a JSON confirmation.\n $ litestream unregister -json /path/to/db\n\n # Preview an unregister request without changing the daemon.\n $ litestream unregister -dry-run /path/to/db\n\n # Unregister a database using a non-default control socket.\n $ litestream unregister -socket /tmp/litestream.sock /path/to/db\n\n # Unregister a database and wait up to 10 seconds for shutdown.\n $ litestream unregister -timeout 10 /path/to/db\n`[1:])\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[43,59]}},{"name":"flag","path":"flag","span":{"start":[7,1],"end":[7,8],"bytes":[60,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[75,80]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[81,87]}},{"name":"http","path":"net/http","span":{"start":[11,1],"end":[11,12],"bytes":[88,99]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[100,107]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[14,1],"end":[14,37],"bytes":[109,145]}}],"types":{"UnregisterCommand":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand","kind":"struct","span":{"start":[17,1],"end":[17,32],"bytes":[149,180]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","kind":"method","span":{"start":[19,1],"end":[111,2],"bytes":[182,3036]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[19,1],"end":[19,76],"bytes":[182,257]}},{"name":"args","type":"[]string","span":{"start":[19,1],"end":[19,76],"bytes":[182,257]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"106:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@106:12","span":{"start":[106,12],"end":[106,60],"bytes":[2943,2991]},"callee":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult"},"20:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@20:8","span":{"start":[20,8],"end":[20,70],"bytes":[265,327]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"21:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@21:13","span":{"start":[21,13],"end":[21,56],"bytes":[340,383]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Int"},"22:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@22:16","span":{"start":[22,16],"end":[22,86],"bytes":[399,469]},"callee":"can://litestream/litestream/@external/flag/FlagSet.String"},"23:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@23:12","span":{"start":[23,12],"end":[23,101],"bytes":[481,570]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"24:16":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@24:16","span":{"start":[24,16],"end":[24,57],"bytes":[586,627]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"26:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@26:12","span":{"start":[26,12],"end":[26,26],"bytes":[659,673]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"30:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@30:5","span":{"start":[30,5],"end":[30,14],"bytes":[709,718]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"36:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@36:5","span":{"start":[36,5],"end":[36,14],"bytes":[846,855]},"callee":"can://litestream/litestream/@external/flag/FlagSet.NArg"},"37:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@37:10","span":{"start":[37,10],"end":[37,42],"bytes":[871,903]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"40:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@40:10","span":{"start":[40,10],"end":[40,54],"bytes":[936,980]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"43:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@43:12","span":{"start":[43,12],"end":[43,21],"bytes":[996,1005]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Arg"},"46:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@46:3","span":{"start":[46,3],"end":[46,53],"bytes":[1023,1073]},"callee":"can://litestream/litestream/@external/fmt/Println"},"47:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@47:3","span":{"start":[47,3],"end":[47,41],"bytes":[1076,1114]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"48:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@48:3","span":{"start":[48,3],"end":[48,44],"bytes":[1117,1158]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"49:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@49:3","span":{"start":[49,3],"end":[49,71],"bytes":[1161,1229]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"50:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@50:3","span":{"start":[50,3],"end":[50,109],"bytes":[1232,1338]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"51:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@51:3","span":{"start":[51,3],"end":[51,43],"bytes":[1341,1381]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"52:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@52:3","span":{"start":[52,3],"end":[52,49],"bytes":[1384,1430]},"callee":"can://litestream/litestream/@external/fmt/Println"},"57:19":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@57:19","span":{"start":[57,19],"end":[57,42],"bytes":[1533,1556]},"callee":null},"71:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@71:18","span":{"start":[71,18],"end":[71,35],"bytes":[1909,1926]},"callee":"can://litestream/litestream/@external/encoding/json/Marshal"},"73:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@73:10","span":{"start":[73,10],"end":[73,58],"bytes":[1953,2001]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"76:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@76:15","span":{"start":[76,15],"end":[76,103],"bytes":[2020,2108]},"callee":"can://litestream/litestream/@external/net/http/Client.Post"},"76:78":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@76:78","span":{"start":[76,78],"end":[76,102],"bytes":[2083,2107]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"78:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@78:10","span":{"start":[78,10],"end":[78,68],"bytes":[2135,2193]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"80:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@80:8","span":{"start":[80,8],"end":[80,25],"bytes":[2204,2221]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"82:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@82:15","span":{"start":[82,15],"end":[82,36],"bytes":[2237,2258]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"84:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@84:10","span":{"start":[84,10],"end":[84,56],"bytes":[2285,2331]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"89:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@89:13","span":{"start":[89,13],"end":[89,43],"bytes":[2426,2456]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"90:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@90:11","span":{"start":[90,11],"end":[90,61],"bytes":[2504,2554]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"92:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@92:10","span":{"start":[92,10],"end":[92,59],"bytes":[2568,2617]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"92:46":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@92:46","span":{"start":[92,46],"end":[92,58],"bytes":[2604,2616]},"callee":null},"96:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@96:12","span":{"start":[96,12],"end":[96,41],"bytes":[2683,2712]},"callee":"can://litestream/litestream/@external/encoding/json/Unmarshal"},"97:10":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run@97:10","span":{"start":[97,10],"end":[97,57],"bytes":[2736,2783]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run.closure_1","kind":"function","span":{"start":[61,1],"end":[63,6],"bytes":[1652,1793]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run.closure_1","parameters":[{"name":"_","type":"context.Context","span":{"start":[61,1],"end":[61,73],"bytes":[1652,1724]}},{"name":"_","type":"string","span":{"start":[61,1],"end":[61,73],"bytes":[1652,1724]}},{"name":"_","type":"string","span":{"start":[61,1],"end":[61,73],"bytes":[1652,1724]}}],"return_type":"(net.Conn, error)","error_channel":["error"],"body":{"62:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run.closure_1@62:12","span":{"start":[62,12],"end":[62,63],"bytes":[1736,1787]},"callee":"can://litestream/litestream/@external/net/DialTimeout"}}}}},"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Usage","kind":"method","span":{"start":[138,1],"end":[176,2],"bytes":[3685,4763]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"139:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Usage@139:2","span":{"start":[139,2],"end":[175,7],"bytes":[3724,4761]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}},"UnregisterResult":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult","kind":"struct","span":{"start":[113,1],"end":[118,2],"bytes":[3038,3211]},"callables":{},"fields":{"DBPath":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult/DBPath","kind":"field","type":"string","span":{"start":[115,1],"end":[115,35],"bytes":[3103,3137]}},"FinalTXID":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult/FinalTXID","kind":"field","type":"uint64","span":{"start":[116,1],"end":[116,38],"bytes":[3138,3175]}},"Socket":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult/Socket","kind":"field","type":"string","span":{"start":[117,1],"end":[117,34],"bytes":[3176,3209]}},"Status":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult/Status","kind":"field","type":"string","span":{"start":[114,1],"end":[114,34],"bytes":[3069,3102]}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult":{"id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","kind":"function","span":{"start":[120,1],"end":[136,2],"bytes":[3213,3683]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","parameters":[{"name":"result","type":"github.com/benbjohnson/litestream/cmd/litestream.UnregisterResult","span":{"start":[120,1],"end":[120,77],"bytes":[3213,3289]}},{"name":"jsonOutput","type":"bool","span":{"start":[120,1],"end":[120,77],"bytes":[3213,3289]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"122:18":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult@122:18","span":{"start":[122,18],"end":[122,54],"bytes":[3324,3360]},"callee":"can://litestream/litestream/@external/encoding/json/MarshalIndent"},"124:11":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult@124:11","span":{"start":[124,11],"end":[124,59],"bytes":[3389,3437]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"126:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult@126:15","span":{"start":[126,15],"end":[126,29],"bytes":[3456,3470]},"callee":null},"126:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult@126:3","span":{"start":[126,3],"end":[126,30],"bytes":[3444,3471]},"callee":"can://litestream/litestream/@external/fmt/Println"},"130:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult@130:2","span":{"start":[130,2],"end":[130,43],"bytes":[3490,3531]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"131:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult@131:2","span":{"start":[131,2],"end":[131,44],"bytes":[3533,3575]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"132:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult@132:2","span":{"start":[132,2],"end":[132,50],"bytes":[3577,3625]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"133:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult@133:2","span":{"start":[133,2],"end":[133,43],"bytes":[3627,3668]},"callee":"can://litestream/litestream/@external/fmt/Printf"}}}},"content_hash":"909fe9bc1d4b8b209baf657348f921a8297a26fbca8d7a9cae91f6b20174a455"},"cmd/litestream/version.go":{"id":"can://litestream/litestream/go/cmd/litestream/version.go","kind":"module","span":{"start":[1,1],"end":[110,1],"bytes":[0,2638]},"package":"main","source":"package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"runtime/debug\"\n)\n\n// defaultVersion is the placeholder used when no version was injected at\n// build time via -ldflags \"-X main.Version=...\".\nconst defaultVersion = \"(development build)\"\n\n// resolveVersion returns the most descriptive version string available:\n// the ldflags-injected value, the VCS-stamped module version, the VCS\n// revision, or the development-build placeholder, in that order.\nfunc resolveVersion(injected string, bi *debug.BuildInfo) string {\n\tif injected != \"\" \u0026\u0026 injected != defaultVersion {\n\t\treturn injected\n\t}\n\tif bi == nil {\n\t\treturn defaultVersion\n\t}\n\n\tif v := bi.Main.Version; v != \"\" \u0026\u0026 v != \"(devel)\" {\n\t\treturn v\n\t}\n\n\trevision, modified, _ := vcsSettings(bi)\n\tif revision == \"\" {\n\t\treturn defaultVersion\n\t}\n\tif len(revision) \u003e 12 {\n\t\trevision = revision[:12]\n\t}\n\tif modified {\n\t\trevision += \"-dirty\"\n\t}\n\treturn fmt.Sprintf(\"(development build %s)\", revision)\n}\n\n// vcsSettings extracts VCS metadata from embedded build info settings.\n// The vcs.time value is the commit timestamp, not the build time.\nfunc vcsSettings(bi *debug.BuildInfo) (revision string, modified bool, commitTime string) {\n\tfor _, s := range bi.Settings {\n\t\tswitch s.Key {\n\t\tcase \"vcs.revision\":\n\t\t\trevision = s.Value\n\t\tcase \"vcs.modified\":\n\t\t\tmodified = s.Value == \"true\"\n\t\tcase \"vcs.time\":\n\t\t\tcommitTime = s.Value\n\t\t}\n\t}\n\treturn revision, modified, commitTime\n}\n\n// VersionCommand represents a command to print the current version.\ntype VersionCommand struct{}\n\n// Run executes the command.\nfunc (c *VersionCommand) Run(_ context.Context, args []string) (err error) {\n\tfs := flag.NewFlagSet(\"litestream-version\", flag.ContinueOnError)\n\tverbose := fs.Bool(\"verbose\", false, \"print detailed build metadata\")\n\tfs.Usage = c.Usage\n\tif err := fs.Parse(args); err != nil {\n\t\treturn err\n\t}\n\n\tif !*verbose {\n\t\tfmt.Println(Version)\n\t\treturn nil\n\t}\n\n\tfmt.Printf(\"Version: %s\\n\", Version)\n\tfmt.Printf(\"Go Version: %s\\n\", runtime.Version())\n\tif bi, ok := debug.ReadBuildInfo(); ok {\n\t\trevision, modified, commitTime := vcsSettings(bi)\n\t\tif revision != \"\" {\n\t\t\tif modified {\n\t\t\t\trevision += \" (dirty)\"\n\t\t\t}\n\t\t\tfmt.Printf(\"Git Commit: %s\\n\", revision)\n\t\t}\n\t\tif commitTime != \"\" {\n\t\t\tfmt.Printf(\"Commit Time: %s\\n\", commitTime)\n\t\t}\n\t}\n\tfmt.Printf(\"OS/Arch: %s/%s\\n\", runtime.GOOS, runtime.GOARCH)\n\n\treturn nil\n}\n\n// Usage prints the help screen to STDOUT.\nfunc (c *VersionCommand) Usage() {\n\tfmt.Println(`\nPrints the version.\n\nUsage:\n\n\tlitestream version [arguments]\n\nArguments:\n\n\t-verbose\n\t Print detailed build metadata (Go version, commit, build time, OS/arch).\n`[1:])\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"flag","path":"flag","span":{"start":[5,1],"end":[5,8],"bytes":[34,41]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[42,48]}},{"name":"runtime","path":"runtime","span":{"start":[7,1],"end":[7,11],"bytes":[49,59]}},{"name":"debug","path":"runtime/debug","span":{"start":[8,1],"end":[8,17],"bytes":[60,76]}}],"types":{"VersionCommand":{"id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand","kind":"struct","span":{"start":[60,1],"end":[60,29],"bytes":[1499,1527]},"callables":{"github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run":{"id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","kind":"method","span":{"start":[63,1],"end":[93,2],"bytes":[1558,2372]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","parameters":[{"name":"_","type":"context.Context","span":{"start":[63,1],"end":[63,77],"bytes":[1558,1634]}},{"name":"args","type":"[]string","span":{"start":[63,1],"end":[63,77],"bytes":[1558,1634]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"64:8":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@64:8","span":{"start":[64,8],"end":[64,67],"bytes":[1642,1701]},"callee":"can://litestream/litestream/@external/flag/NewFlagSet"},"65:13":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@65:13","span":{"start":[65,13],"end":[65,71],"bytes":[1714,1772]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Bool"},"67:12":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@67:12","span":{"start":[67,12],"end":[67,26],"bytes":[1804,1818]},"callee":"can://litestream/litestream/@external/flag/FlagSet.Parse"},"72:3":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@72:3","span":{"start":[72,3],"end":[72,23],"bytes":[1868,1888]},"callee":"can://litestream/litestream/@external/fmt/Println"},"76:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@76:2","span":{"start":[76,2],"end":[76,42],"bytes":[1907,1947]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"77:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@77:2","span":{"start":[77,2],"end":[77,52],"bytes":[1949,1999]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"77:34":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@77:34","span":{"start":[77,34],"end":[77,51],"bytes":[1981,1998]},"callee":"can://litestream/litestream/@external/runtime/Version"},"78:15":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@78:15","span":{"start":[78,15],"end":[78,36],"bytes":[2014,2035]},"callee":"can://litestream/litestream/@external/runtime/debug/ReadBuildInfo"},"79:37":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@79:37","span":{"start":[79,37],"end":[79,52],"bytes":[2078,2093]},"callee":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings"},"84:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@84:4","span":{"start":[84,4],"end":[84,45],"bytes":[2168,2209]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"87:4":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@87:4","span":{"start":[87,4],"end":[87,47],"bytes":[2241,2284]},"callee":"can://litestream/litestream/@external/fmt/Printf"},"90:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run@90:2","span":{"start":[90,2],"end":[90,66],"bytes":[2293,2357]},"callee":"can://litestream/litestream/@external/fmt/Printf"}}},"github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Usage":{"id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Usage","kind":"method","span":{"start":[96,1],"end":[109,2],"bytes":[2417,2637]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Usage","parameters":[],"metrics":{"cyclomatic":1},"body":{"97:2":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Usage@97:2","span":{"start":[97,2],"end":[108,7],"bytes":[2453,2635]},"callee":"can://litestream/litestream/@external/fmt/Println"}}}}}},"functions":{"github.com/benbjohnson/litestream/cmd/litestream.resolveVersion":{"id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","kind":"function","span":{"start":[18,1],"end":[41,2],"bytes":[460,955]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","parameters":[{"name":"injected","type":"string","span":{"start":[18,1],"end":[18,67],"bytes":[460,526]}},{"name":"bi","type":"*runtime/debug.BuildInfo","span":{"start":[18,1],"end":[18,67],"bytes":[460,526]}}],"return_type":"string","metrics":{"cyclomatic":7},"body":{"30:27":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion@30:27","span":{"start":[30,27],"end":[30,42],"bytes":[738,753]},"callee":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings"},"34:5":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion@34:5","span":{"start":[34,5],"end":[34,18],"bytes":[806,819]},"callee":null},"40:9":{"kind":"call","id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion@40:9","span":{"start":[40,9],"end":[40,56],"bytes":[906,953]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream/cmd/litestream.vcsSettings":{"id":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings","kind":"function","span":{"start":[45,1],"end":[57,2],"bytes":[1096,1428]},"signature":"github.com/benbjohnson/litestream/cmd/litestream.vcsSettings","parameters":[{"name":"bi","type":"*runtime/debug.BuildInfo","span":{"start":[45,1],"end":[45,92],"bytes":[1096,1187]}}],"return_type":"(string, bool, string)","metrics":{"cyclomatic":6},"body":{}}},"content_hash":"ef27995c6f376fd80906b31f6c239dde5ea3d88a99a771ec2962b75139f02da0"},"compaction_level.go":{"id":"can://litestream/litestream/go/compaction_level.go","kind":"module","span":{"start":[1,1],"end":[114,1],"bytes":[0,3545]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// SnapshotLevel represents the level which full snapshots are held.\nconst SnapshotLevel = 9\n\n// DefaultCompactionLevels provides the canonical default compaction configuration.\n// Level 0 is raw LTX files, higher levels compact at increasing intervals.\n// These values are also used by cmd/litestream DefaultConfig().\nvar DefaultCompactionLevels = CompactionLevels{\n\t{Level: 0, Interval: 0},\n\t{Level: 1, Interval: 30 * time.Second},\n\t{Level: 2, Interval: 5 * time.Minute},\n\t{Level: 3, Interval: time.Hour},\n}\n\n// CompactionLevel represents a single part of a multi-level compaction.\n// Each level merges LTX files from the previous level into larger time granularities.\ntype CompactionLevel struct {\n\t// The numeric level. Must match the index in the list of levels.\n\tLevel int\n\n\t// The frequency that the level is compacted from the previous level.\n\tInterval time.Duration\n}\n\n// PrevCompactionAt returns the time when the last compaction occurred.\n// Returns the current time if it is exactly a multiple of the level interval.\nfunc (lvl *CompactionLevel) PrevCompactionAt(now time.Time) time.Time {\n\treturn now.Truncate(lvl.Interval).UTC()\n}\n\n// NextCompactionAt returns the time until the next compaction occurs.\n// Returns the current time if it is exactly a multiple of the level interval.\nfunc (lvl *CompactionLevel) NextCompactionAt(now time.Time) time.Time {\n\treturn lvl.PrevCompactionAt(now).Add(lvl.Interval)\n}\n\n// CompactionLevels represents a sorted slice of non-snapshot compaction levels.\ntype CompactionLevels []*CompactionLevel\n\n// Level returns the compaction level at the given index.\n// Returns an error if the index is a snapshot level or is out of bounds.\nfunc (a CompactionLevels) Level(level int) (*CompactionLevel, error) {\n\tif level == SnapshotLevel {\n\t\treturn nil, fmt.Errorf(\"invalid argument, snapshot level\")\n\t}\n\tif level \u003c 0 || level \u003e a.MaxLevel() {\n\t\treturn nil, fmt.Errorf(\"level out of bounds: %d\", level)\n\t}\n\treturn a[level], nil\n}\n\n// MaxLevel return the highest non-snapshot compaction level.\nfunc (a CompactionLevels) MaxLevel() int {\n\treturn len(a) - 1\n}\n\n// Validate returns an error if the levels are invalid.\nfunc (a CompactionLevels) Validate() error {\n\tif len(a) == 0 {\n\t\treturn fmt.Errorf(\"at least one compaction level is required\")\n\t}\n\n\tfor i, lvl := range a {\n\t\tif i != lvl.Level {\n\t\t\treturn fmt.Errorf(\"compaction level number out of order: %d, expected %d\", lvl.Level, i)\n\t\t} else if lvl.Level \u003e SnapshotLevel-1 {\n\t\t\treturn fmt.Errorf(\"compaction level cannot exceed %d\", SnapshotLevel-1)\n\t\t}\n\n\t\tif lvl.Level == 0 \u0026\u0026 lvl.Interval != 0 {\n\t\t\treturn fmt.Errorf(\"cannot set interval on compaction level zero\")\n\t\t}\n\n\t\tif lvl.Level != 0 \u0026\u0026 lvl.Interval \u003c= 0 {\n\t\t\treturn fmt.Errorf(\"interval required for level %d\", lvl.Level)\n\t\t}\n\t}\n\treturn nil\n}\n\n// IsValidLevel returns true if level is a valid compaction level number.\nfunc (a CompactionLevels) IsValidLevel(level int) bool {\n\tif level == SnapshotLevel {\n\t\treturn true\n\t}\n\treturn level \u003e= 0 \u0026\u0026 level \u003c len(a)\n}\n\n// PrevLevel returns the previous compaction level.\n// Returns -1 if there is no previous level.\nfunc (a CompactionLevels) PrevLevel(level int) int {\n\tif level == SnapshotLevel {\n\t\treturn a.MaxLevel()\n\t}\n\treturn level - 1\n}\n\n// NextLevel returns the next compaction level.\n// Returns -1 if there is no next level.\nfunc (a CompactionLevels) NextLevel(level int) int {\n\tif level == SnapshotLevel {\n\t\treturn -1\n\t} else if level == a.MaxLevel() {\n\t\treturn SnapshotLevel\n\t}\n\treturn level + 1\n}\n","imports":[{"name":"fmt","path":"fmt","span":{"start":[4,1],"end":[4,7],"bytes":[29,35]}},{"name":"time","path":"time","span":{"start":[5,1],"end":[5,8],"bytes":[36,43]}}],"types":{"CompactionLevel":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel","kind":"struct","span":{"start":[23,1],"end":[29,2],"bytes":[718,923]},"callables":{"github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt","kind":"method","span":{"start":[39,1],"end":[41,2],"bytes":[1342,1467]},"signature":"github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt","parameters":[{"name":"now","type":"time.Time","span":{"start":[39,1],"end":[39,72],"bytes":[1342,1413]}}],"return_type":"time.Time","metrics":{"cyclomatic":1},"body":{"40:9":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt@40:9","span":{"start":[40,9],"end":[40,52],"bytes":[1422,1465]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"40:9/2":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt@40:9/2","span":{"start":[40,9],"end":[40,34],"bytes":[1422,1447]},"callee":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt"}}},"github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","kind":"method","span":{"start":[33,1],"end":[35,2],"bytes":[1076,1190]},"signature":"github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","parameters":[{"name":"now","type":"time.Time","span":{"start":[33,1],"end":[33,72],"bytes":[1076,1147]}}],"return_type":"time.Time","metrics":{"cyclomatic":1},"body":{"34:9":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt@34:9","span":{"start":[34,9],"end":[34,41],"bytes":[1156,1188]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"34:9/2":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt@34:9/2","span":{"start":[34,9],"end":[34,35],"bytes":[1156,1182]},"callee":"can://litestream/litestream/@external/time/Time.Truncate"}}}},"fields":{"Interval":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/Interval","kind":"field","type":"time.Duration","span":{"start":[28,1],"end":[28,24],"bytes":[898,921]}},"Level":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/Level","kind":"field","type":"int","span":{"start":[25,1],"end":[25,11],"bytes":[815,825]}}}},"CompactionLevels":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels","kind":"defined","span":{"start":[44,1],"end":[44,41],"bytes":[1550,1590]},"callables":{"github.com/benbjohnson/litestream.CompactionLevels.IsValidLevel":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.IsValidLevel","kind":"method","span":{"start":[88,1],"end":[93,2],"bytes":[2913,3054]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.IsValidLevel","parameters":[{"name":"level","type":"int","span":{"start":[88,1],"end":[88,57],"bytes":[2913,2969]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"92:31":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.IsValidLevel@92:31","span":{"start":[92,31],"end":[92,37],"bytes":[3046,3052]},"callee":null}}},"github.com/benbjohnson/litestream.CompactionLevels.Level":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Level","kind":"method","span":{"start":[48,1],"end":[56,2],"bytes":[1724,2013]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.Level","parameters":[{"name":"level","type":"int","span":{"start":[48,1],"end":[48,71],"bytes":[1724,1794]}}],"return_type":"(*github.com/benbjohnson/litestream.CompactionLevel, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"50:15":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Level@50:15","span":{"start":[50,15],"end":[50,61],"bytes":[1838,1884]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"52:26":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Level@52:26","span":{"start":[52,26],"end":[52,38],"bytes":[1913,1925]},"callee":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel"},"53:15":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Level@53:15","span":{"start":[53,15],"end":[53,59],"bytes":[1942,1986]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.CompactionLevels.MaxLevel":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","kind":"method","span":{"start":[59,1],"end":[61,2],"bytes":[2077,2140]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","parameters":[],"return_type":"int","metrics":{"cyclomatic":1},"body":{"60:9":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel@60:9","span":{"start":[60,9],"end":[60,15],"bytes":[2128,2134]},"callee":null}}},"github.com/benbjohnson/litestream.CompactionLevels.NextLevel":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.NextLevel","kind":"method","span":{"start":[106,1],"end":[113,2],"bytes":[3370,3544]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.NextLevel","parameters":[{"name":"level","type":"int","span":{"start":[106,1],"end":[106,53],"bytes":[3370,3422]}}],"return_type":"int","metrics":{"cyclomatic":3},"body":{"109:21":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.NextLevel@109:21","span":{"start":[109,21],"end":[109,33],"bytes":[3484,3496]},"callee":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel"}}},"github.com/benbjohnson/litestream.CompactionLevels.PrevLevel":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel","kind":"method","span":{"start":[97,1],"end":[102,2],"bytes":[3153,3279]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.PrevLevel","parameters":[{"name":"level","type":"int","span":{"start":[97,1],"end":[97,53],"bytes":[3153,3205]}}],"return_type":"int","metrics":{"cyclomatic":2},"body":{"99:10":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel@99:10","span":{"start":[99,10],"end":[99,22],"bytes":[3244,3256]},"callee":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel"}}},"github.com/benbjohnson/litestream.CompactionLevels.Validate":{"id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate","kind":"method","span":{"start":[64,1],"end":[85,2],"bytes":[2198,2837]},"signature":"github.com/benbjohnson/litestream.CompactionLevels.Validate","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"65:5":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate@65:5","span":{"start":[65,5],"end":[65,11],"bytes":[2247,2253]},"callee":null},"66:10":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate@66:10","span":{"start":[66,10],"end":[66,65],"bytes":[2270,2325]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"71:11":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate@71:11","span":{"start":[71,11],"end":[71,92],"bytes":[2387,2468]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"73:11":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate@73:11","span":{"start":[73,11],"end":[73,75],"bytes":[2521,2585]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"77:11":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate@77:11","span":{"start":[77,11],"end":[77,69],"bytes":[2644,2702]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"81:11":{"kind":"call","id":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate@81:11","span":{"start":[81,11],"end":[81,66],"bytes":[2761,2816]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}}}}},"functions":{},"content_hash":"744ac7ec8fbcc2267945fbae48919c5b8a47f37cd2ea08b3a78c852dee2b895d"},"compactor.go":{"id":"can://litestream/litestream/go/compactor.go","kind":"module","span":{"start":[1,1],"end":[427,1],"bytes":[0,12016]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// Compactor handles compaction and retention for LTX files.\n// It operates solely through the ReplicaClient interface, making it\n// suitable for both DB (with local file caching) and VFS (remote-only).\ntype Compactor struct {\n\tclient ReplicaClient\n\tlogger *slog.Logger\n\n\t// VerifyCompaction enables post-compaction TXID consistency verification.\n\t// When enabled, verifies that files at the destination level have\n\t// contiguous TXID ranges after each compaction. Disabled by default.\n\tVerifyCompaction bool\n\n\t// RetentionEnabled controls whether Litestream actively deletes old files\n\t// during retention enforcement. When false, cloud provider lifecycle\n\t// policies handle retention instead. Local file cleanup still occurs.\n\tRetentionEnabled bool\n\n\t// CompactionVerifyErrorCounter is incremented when post-compaction\n\t// verification fails. Optional; if nil, no metric is recorded.\n\tCompactionVerifyErrorCounter prometheus.Counter\n\n\t// LocalFileOpener optionally opens a local LTX file for compaction.\n\t// If nil or returns os.ErrNotExist, falls back to remote.\n\t// This is used by DB to prefer local files over remote for consistency.\n\tLocalFileOpener func(level int, minTXID, maxTXID ltx.TXID) (io.ReadCloser, error)\n\n\t// LocalFileDeleter optionally deletes local LTX files after retention.\n\t// If nil, only remote files are deleted.\n\tLocalFileDeleter func(level int, minTXID, maxTXID ltx.TXID) error\n\n\t// CacheGetter optionally retrieves cached MaxLTXFileInfo for a level.\n\t// If nil, max file info is always fetched from remote.\n\tCacheGetter func(level int) (*ltx.FileInfo, bool)\n\n\t// CacheSetter optionally stores MaxLTXFileInfo for a level.\n\t// If nil, max file info is not cached.\n\tCacheSetter func(level int, info *ltx.FileInfo)\n}\n\n// NewCompactor creates a new Compactor with the given client and logger.\nfunc NewCompactor(client ReplicaClient, logger *slog.Logger) *Compactor {\n\tif logger == nil {\n\t\tlogger = slog.Default()\n\t}\n\treturn \u0026Compactor{\n\t\tclient: client,\n\t\tlogger: logger,\n\t\tRetentionEnabled: true,\n\t}\n}\n\nfunc (c *Compactor) setLogger(logger *slog.Logger) {\n\tc.logger = logger\n}\n\n// MaxLTXFileInfo returns metadata for the last LTX file in a level.\n// Uses cache if available, otherwise fetches from remote.\nfunc (c *Compactor) MaxLTXFileInfo(ctx context.Context, level int) (ltx.FileInfo, error) {\n\tif c.CacheGetter != nil {\n\t\tif info, ok := c.CacheGetter(level); ok {\n\t\t\treturn *info, nil\n\t\t}\n\t}\n\n\titr, err := c.client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn ltx.FileInfo{}, err\n\t}\n\tdefer itr.Close()\n\n\tvar info ltx.FileInfo\n\tfor itr.Next() {\n\t\titem := itr.Item()\n\t\tif item.MaxTXID \u003e info.MaxTXID {\n\t\t\tinfo = *item\n\t\t}\n\t}\n\n\tif c.CacheSetter != nil \u0026\u0026 info.MaxTXID \u003e 0 {\n\t\tc.CacheSetter(level, \u0026info)\n\t}\n\n\treturn info, itr.Close()\n}\n\n// Compact compacts source level files into the destination level.\n// Returns ErrNoCompaction if there are no files to compact.\nfunc (c *Compactor) Compact(ctx context.Context, dstLevel int) (*ltx.FileInfo, error) {\n\tsrcLevel := dstLevel - 1\n\n\tprevMaxInfo, err := c.MaxLTXFileInfo(ctx, dstLevel)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cannot determine max ltx file for destination level: %w\", err)\n\t}\n\tseekTXID := prevMaxInfo.MaxTXID + 1\n\n\titr, err := c.client.LTXFiles(ctx, srcLevel, seekTXID, false)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"source ltx files after %s: %w\", seekTXID, err)\n\t}\n\tdefer itr.Close()\n\n\tvar rdrs []io.Reader\n\tdefer func() {\n\t\tfor _, rd := range rdrs {\n\t\t\tif closer, ok := rd.(io.Closer); ok {\n\t\t\t\t_ = closer.Close()\n\t\t\t}\n\t\t}\n\t}()\n\n\tvar minTXID, maxTXID ltx.TXID\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\n\t\tif minTXID == 0 || info.MinTXID \u003c minTXID {\n\t\t\tminTXID = info.MinTXID\n\t\t}\n\t\tif maxTXID == 0 || info.MaxTXID \u003e maxTXID {\n\t\t\tmaxTXID = info.MaxTXID\n\t\t}\n\n\t\tif c.LocalFileOpener != nil {\n\t\t\tif f, err := c.LocalFileOpener(srcLevel, info.MinTXID, info.MaxTXID); err == nil {\n\t\t\t\trdrs = append(rdrs, f)\n\t\t\t\tcontinue\n\t\t\t} else if !os.IsNotExist(err) {\n\t\t\t\treturn nil, fmt.Errorf(\"open local ltx file: %w\", err)\n\t\t\t}\n\t\t}\n\n\t\tf, err := c.client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, 0, 0)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"open ltx file: %w\", err)\n\t\t}\n\t\trdrs = append(rdrs, internal.NewResumableReader(ctx, c.client, info.Level, info.MinTXID, info.MaxTXID, info.Size, f, c.logger))\n\t}\n\tif len(rdrs) == 0 {\n\t\treturn nil, ErrNoCompaction\n\t}\n\n\tpr, pw := io.Pipe()\n\tgo func() {\n\t\tcomp, err := ltx.NewCompactor(pw, rdrs)\n\t\tif err != nil {\n\t\t\t_ = pw.CloseWithError(fmt.Errorf(\"new ltx compactor: %w\", err))\n\t\t\treturn\n\t\t}\n\t\tcomp.HeaderFlags = ltx.HeaderFlagNoChecksum\n\t\t_ = pw.CloseWithError(comp.Compact(ctx))\n\t}()\n\n\tinfo, err := c.client.WriteLTXFile(ctx, dstLevel, minTXID, maxTXID, pr)\n\t_ = pr.CloseWithError(err)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"write ltx file: %w\", err)\n\t}\n\n\tif c.CacheSetter != nil {\n\t\tc.CacheSetter(dstLevel, info)\n\t}\n\n\t// Verify level consistency if enabled\n\tif c.VerifyCompaction {\n\t\tif err := c.VerifyLevelConsistency(ctx, dstLevel); err != nil {\n\t\t\tc.logger.Warn(\"post-compaction verification failed\",\n\t\t\t\t\"level\", dstLevel,\n\t\t\t\t\"error\", err)\n\t\t\tif c.CompactionVerifyErrorCounter != nil {\n\t\t\t\tc.CompactionVerifyErrorCounter.Inc()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn info, nil\n}\n\n// VerifyLevelConsistency checks that LTX files at the given level have\n// contiguous TXID ranges (prevMaxTXID + 1 == currMinTXID for consecutive files).\n// Returns an error describing any gaps or overlaps found.\nfunc (c *Compactor) VerifyLevelConsistency(ctx context.Context, level int) error {\n\titr, err := c.client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar prevInfo *ltx.FileInfo\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\n\t\t// Skip first file - nothing to compare against\n\t\tif prevInfo == nil {\n\t\t\tprevInfo = info\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check for TXID contiguity: prev.MaxTXID + 1 should equal curr.MinTXID\n\t\texpectedMinTXID := prevInfo.MaxTXID + 1\n\t\tif info.MinTXID != expectedMinTXID {\n\t\t\tif info.MinTXID \u003e expectedMinTXID {\n\t\t\t\treturn fmt.Errorf(\"TXID gap detected: prev.MaxTXID=%s, next.MinTXID=%s (expected %s)\",\n\t\t\t\t\tprevInfo.MaxTXID, info.MinTXID, expectedMinTXID)\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"TXID overlap detected: prev.MaxTXID=%s, next.MinTXID=%s\",\n\t\t\t\tprevInfo.MaxTXID, info.MinTXID)\n\t\t}\n\n\t\tprevInfo = info\n\t}\n\n\tif err := itr.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close iterator: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// EnforceSnapshotRetention enforces retention of snapshot level files by timestamp.\n// Files older than the retention duration are deleted (except the newest is always kept).\n// Returns the minimum snapshot TXID still retained (useful for cascading retention to lower levels).\nfunc (c *Compactor) EnforceSnapshotRetention(ctx context.Context, retention time.Duration) (ltx.TXID, error) {\n\ttimestamp := time.Now().Add(-retention)\n\tc.logger.Debug(\"enforcing snapshot retention\", \"timestamp\", timestamp)\n\n\titr, err := c.client.LTXFiles(ctx, SnapshotLevel, 0, false)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar deleted []*ltx.FileInfo\n\tvar lastInfo *ltx.FileInfo\n\tvar minSnapshotTXID ltx.TXID\n\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tlastInfo = info\n\n\t\tif info.CreatedAt.Before(timestamp) {\n\t\t\tdeleted = append(deleted, info)\n\t\t\tcontinue\n\t\t}\n\n\t\tif minSnapshotTXID == 0 || info.MaxTXID \u003c minSnapshotTXID {\n\t\t\tminSnapshotTXID = info.MaxTXID\n\t\t}\n\t}\n\n\tif len(deleted) \u003e 0 \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\tif !c.RetentionEnabled {\n\t\tc.logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", SnapshotLevel, \"count\", len(deleted))\n\t} else if err := c.client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn 0, fmt.Errorf(\"remove ltx files: %w\", err)\n\t}\n\n\tif c.LocalFileDeleter != nil {\n\t\tfor _, info := range deleted {\n\t\t\tc.logger.Debug(\"deleting local ltx file\",\n\t\t\t\t\"level\", SnapshotLevel,\n\t\t\t\t\"minTXID\", info.MinTXID,\n\t\t\t\t\"maxTXID\", info.MaxTXID)\n\t\t\tif err := c.LocalFileDeleter(SnapshotLevel, info.MinTXID, info.MaxTXID); err != nil {\n\t\t\t\tc.logger.Error(\"failed to remove local ltx file\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn minSnapshotTXID, nil\n}\n\n// EnforceRetentionByTXID deletes files at the given level with maxTXID below the target.\n// Always keeps at least one file.\nfunc (c *Compactor) EnforceRetentionByTXID(ctx context.Context, level int, txID ltx.TXID) error {\n\tc.logger.Debug(\"enforcing retention\", \"level\", level, \"txid\", txID)\n\n\titr, err := c.client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar deleted []*ltx.FileInfo\n\tvar lastInfo *ltx.FileInfo\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tlastInfo = info\n\n\t\tif info.MaxTXID \u003c txID {\n\t\t\tdeleted = append(deleted, info)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tif len(deleted) \u003e 0 \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\tif !c.RetentionEnabled {\n\t\tc.logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", level, \"count\", len(deleted))\n\t} else if err := c.client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn fmt.Errorf(\"remove ltx files: %w\", err)\n\t}\n\n\tif c.LocalFileDeleter != nil {\n\t\tfor _, info := range deleted {\n\t\t\tc.logger.Debug(\"deleting local ltx file\",\n\t\t\t\t\"level\", level,\n\t\t\t\t\"minTXID\", info.MinTXID,\n\t\t\t\t\"maxTXID\", info.MaxTXID)\n\t\t\tif err := c.LocalFileDeleter(level, info.MinTXID, info.MaxTXID); err != nil {\n\t\t\t\tc.logger.Error(\"failed to remove local ltx file\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// EnforceL0Retention retains L0 files based on L1 compaction progress and time.\n// Files are only deleted if they have been compacted into L1 AND are older than retention.\n// This ensures contiguous L0 coverage for VFS reads.\nfunc (c *Compactor) EnforceL0Retention(ctx context.Context, retention time.Duration) error {\n\tif retention \u003c= 0 {\n\t\treturn nil\n\t}\n\n\tc.logger.Debug(\"enforcing l0 retention\", \"retention\", retention)\n\n\titr, err := c.client.LTXFiles(ctx, 1, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch l1 files: %w\", err)\n\t}\n\tvar maxL1TXID ltx.TXID\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tif info.MaxTXID \u003e maxL1TXID {\n\t\t\tmaxL1TXID = info.MaxTXID\n\t\t}\n\t}\n\tif err := itr.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close l1 iterator: %w\", err)\n\t}\n\tif maxL1TXID == 0 {\n\t\treturn nil\n\t}\n\n\tthreshold := time.Now().Add(-retention)\n\titr, err = c.client.LTXFiles(ctx, 0, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch l0 files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar (\n\t\tdeleted []*ltx.FileInfo\n\t\tlastInfo *ltx.FileInfo\n\t\tprocessedAll = true\n\t)\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tlastInfo = info\n\n\t\tcreatedAt := info.CreatedAt\n\t\tif createdAt.IsZero() {\n\t\t\tcreatedAt = threshold\n\t\t}\n\n\t\tif createdAt.After(threshold) {\n\t\t\tprocessedAll = false\n\t\t\tbreak\n\t\t}\n\n\t\tif info.MaxTXID \u003c= maxL1TXID {\n\t\t\tdeleted = append(deleted, info)\n\t\t}\n\t}\n\n\tif processedAll \u0026\u0026 len(deleted) \u003e 0 \u0026\u0026 lastInfo != nil \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\tif len(deleted) == 0 {\n\t\treturn nil\n\t}\n\n\tif !c.RetentionEnabled {\n\t\tc.logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", 0, \"count\", len(deleted))\n\t} else if err := c.client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn fmt.Errorf(\"remove expired l0 files: %w\", err)\n\t}\n\n\tif c.LocalFileDeleter != nil {\n\t\tfor _, info := range deleted {\n\t\t\tc.logger.Debug(\"deleting expired local l0 file\",\n\t\t\t\t\"minTXID\", info.MinTXID,\n\t\t\t\t\"maxTXID\", info.MaxTXID)\n\t\t\tif err := c.LocalFileDeleter(0, info.MinTXID, info.MaxTXID); err != nil {\n\t\t\t\tc.logger.Error(\"failed to remove local l0 file\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tc.logger.Info(\"l0 retention enforced\", \"deleted_count\", len(deleted), \"max_l1_txid\", maxL1TXID)\n\n\treturn nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"fmt","path":"fmt","span":{"start":[5,1],"end":[5,7],"bytes":[40,46]}},{"name":"io","path":"io","span":{"start":[6,1],"end":[6,6],"bytes":[47,52]}},{"name":"slog","path":"log/slog","span":{"start":[7,1],"end":[7,12],"bytes":[53,64]}},{"name":"os","path":"os","span":{"start":[8,1],"end":[8,6],"bytes":[65,70]}},{"name":"time","path":"time","span":{"start":[9,1],"end":[9,8],"bytes":[71,78]}},{"name":"prometheus","path":"github.com/prometheus/client_golang/prometheus","span":{"start":[11,1],"end":[11,50],"bytes":[80,129]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[12,1],"end":[12,27],"bytes":[130,156]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[14,1],"end":[14,46],"bytes":[158,203]}}],"types":{"Compactor":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor","kind":"struct","span":{"start":[20,1],"end":[54,2],"bytes":[410,1950]},"callables":{"github.com/benbjohnson/litestream.Compactor.Compact":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","kind":"method","span":{"start":[104,1],"end":[192,2],"bytes":[3132,5454]},"signature":"github.com/benbjohnson/litestream.Compactor.Compact","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[104,1],"end":[104,88],"bytes":[3132,3219]}},{"name":"dstLevel","type":"int","span":{"start":[104,1],"end":[104,88],"bytes":[3132,3219]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":19},"body":{"107:22":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@107:22","span":{"start":[107,22],"end":[107,53],"bytes":[3268,3299]},"callee":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo"},"109:15":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@109:15","span":{"start":[109,15],"end":[109,89],"bytes":[3331,3405]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"113:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@113:14","span":{"start":[113,14],"end":[113,63],"bytes":[3460,3509]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"115:15":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@115:15","span":{"start":[115,15],"end":[115,73],"bytes":[3541,3599]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"117:8":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@117:8","span":{"start":[117,8],"end":[117,19],"bytes":[3610,3621]},"callee":null,"is_deferred":true},"120:8":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@120:8","span":{"start":[120,8],"end":[126,5],"bytes":[3652,3766]},"callee":null,"is_deferred":true},"129:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@129:6","span":{"start":[129,6],"end":[129,16],"bytes":[3804,3814]},"callee":null},"130:11":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@130:11","span":{"start":[130,11],"end":[130,21],"bytes":[3827,3837]},"callee":null},"140:17":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@140:17","span":{"start":[140,17],"end":[140,72],"bytes":[4040,4095]},"callee":null},"141:12":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@141:12","span":{"start":[141,12],"end":[141,27],"bytes":[4121,4136]},"callee":null},"143:15":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@143:15","span":{"start":[143,15],"end":[143,33],"bytes":[4164,4182]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"144:17":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@144:17","span":{"start":[144,17],"end":[144,59],"bytes":[4201,4243]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"148:13":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@148:13","span":{"start":[148,13],"end":[148,84],"bytes":[4266,4337]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"150:16":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@150:16","span":{"start":[150,16],"end":[150,52],"bytes":[4371,4407]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"152:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@152:10","span":{"start":[152,10],"end":[152,130],"bytes":[4421,4541]},"callee":null},"152:23":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@152:23","span":{"start":[152,23],"end":[152,129],"bytes":[4434,4540]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader"},"154:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@154:5","span":{"start":[154,5],"end":[154,14],"bytes":[4549,4558]},"callee":null},"158:12":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@158:12","span":{"start":[158,12],"end":[158,21],"bytes":[4611,4620]},"callee":"can://litestream/litestream/@external/io/Pipe"},"159:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@159:5","span":{"start":[159,5],"end":[167,5],"bytes":[4625,4868]},"callee":null,"is_goroutine":true},"169:15":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@169:15","span":{"start":[169,15],"end":[169,73],"bytes":[4884,4942]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile"},"170:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@170:6","span":{"start":[170,6],"end":[170,28],"bytes":[4948,4970]},"callee":"can://litestream/litestream/@external/io/PipeReader.CloseWithError"},"172:15":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@172:15","span":{"start":[172,15],"end":[172,52],"bytes":[5002,5039]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"176:3":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@176:3","span":{"start":[176,3],"end":[176,32],"bytes":[5073,5102]},"callee":null},"181:13":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@181:13","span":{"start":[181,13],"end":[181,52],"bytes":[5184,5223]},"callee":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency"},"182:4":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@182:4","span":{"start":[182,4],"end":[184,18],"bytes":[5241,5334]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"186:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact@186:5","span":{"start":[186,5],"end":[186,41],"bytes":[5385,5421]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_1","kind":"function","span":{"start":[120,1],"end":[126,5],"bytes":[3645,3766]},"signature":"github.com/benbjohnson/litestream.Compactor.Compact.closure_1","parameters":[],"body":{"123:9":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_1@123:9","span":{"start":[123,9],"end":[123,23],"bytes":[3738,3752]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}},"closure_2":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2","kind":"function","span":{"start":[159,1],"end":[167,5],"bytes":[4621,4868]},"signature":"github.com/benbjohnson/litestream.Compactor.Compact.closure_2","parameters":[],"body":{"160:16":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2@160:16","span":{"start":[160,16],"end":[160,42],"bytes":[4649,4675]},"callee":null},"162:26":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2@162:26","span":{"start":[162,26],"end":[162,66],"bytes":[4719,4759]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"162:8":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2@162:8","span":{"start":[162,8],"end":[162,67],"bytes":[4701,4760]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"166:25":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2@166:25","span":{"start":[166,25],"end":[166,42],"bytes":[4845,4862]},"callee":null},"166:7":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2@166:7","span":{"start":[166,7],"end":[166,43],"bytes":[4827,4863]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"}}}}},"github.com/benbjohnson/litestream.Compactor.EnforceL0Retention":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","kind":"method","span":{"start":[342,1],"end":[426,2],"bytes":[10004,12015]},"signature":"github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[342,1],"end":[342,93],"bytes":[10004,10096]}},{"name":"retention","type":"time.Duration","span":{"start":[342,1],"end":[342,93],"bytes":[10004,10096]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":19},"body":{"347:2":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@347:2","span":{"start":[347,2],"end":[347,66],"bytes":[10136,10200]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"349:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@349:14","span":{"start":[349,14],"end":[349,49],"bytes":[10215,10250]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"351:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@351:10","span":{"start":[351,10],"end":[351,47],"bytes":[10277,10314]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"354:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@354:6","span":{"start":[354,6],"end":[354,16],"bytes":[10347,10357]},"callee":null},"355:11":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@355:11","span":{"start":[355,11],"end":[355,21],"bytes":[10370,10380]},"callee":null},"360:12":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@360:12","span":{"start":[360,12],"end":[360,23],"bytes":[10459,10470]},"callee":null},"361:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@361:10","span":{"start":[361,10],"end":[361,50],"bytes":[10494,10534]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"367:15":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@367:15","span":{"start":[367,15],"end":[367,41],"bytes":[10590,10616]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"367:15/2":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@367:15/2","span":{"start":[367,15],"end":[367,25],"bytes":[10590,10600]},"callee":"can://litestream/litestream/@external/time/Now"},"368:13":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@368:13","span":{"start":[368,13],"end":[368,48],"bytes":[10629,10664]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"370:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@370:10","span":{"start":[370,10],"end":[370,47],"bytes":[10691,10728]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"372:8":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@372:8","span":{"start":[372,8],"end":[372,19],"bytes":[10739,10750]},"callee":null,"is_deferred":true},"379:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@379:6","span":{"start":[379,6],"end":[379,16],"bytes":[10849,10859]},"callee":null},"380:11":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@380:11","span":{"start":[380,11],"end":[380,21],"bytes":[10872,10882]},"callee":null},"384:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@384:6","span":{"start":[384,6],"end":[384,24],"bytes":[10937,10955]},"callee":null},"388:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@388:6","span":{"start":[388,6],"end":[388,32],"bytes":[10993,11019]},"callee":null},"394:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@394:14","span":{"start":[394,14],"end":[394,35],"bytes":[11106,11127]},"callee":null},"398:21":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@398:21","span":{"start":[398,21],"end":[398,33],"bytes":[11156,11168]},"callee":null},"398:68":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@398:68","span":{"start":[398,68],"end":[398,80],"bytes":[11203,11215]},"callee":null},"399:22":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@399:22","span":{"start":[399,22],"end":[399,34],"bytes":[11254,11266]},"callee":null},"402:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@402:5","span":{"start":[402,5],"end":[402,17],"bytes":[11278,11290]},"callee":null},"407:3":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@407:3","span":{"start":[407,3],"end":[407,101],"bytes":[11343,11441]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"407:88":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@407:88","span":{"start":[407,88],"end":[407,100],"bytes":[11428,11440]},"callee":null},"408:19":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@408:19","span":{"start":[408,19],"end":[408,56],"bytes":[11460,11497]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"409:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@409:10","span":{"start":[409,10],"end":[409,56],"bytes":[11521,11567]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"414:4":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@414:4","span":{"start":[414,4],"end":[416,29],"bytes":[11640,11746]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"417:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@417:14","span":{"start":[417,14],"end":[417,63],"bytes":[11760,11809]},"callee":null},"418:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@418:5","span":{"start":[418,5],"end":[418,67],"bytes":[11828,11890]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"423:2":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@423:2","span":{"start":[423,2],"end":[423,97],"bytes":[11905,12000]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"423:58":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention@423:58","span":{"start":[423,58],"end":[423,70],"bytes":[11961,11973]},"callee":null}}},"github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","kind":"method","span":{"start":[293,1],"end":[337,2],"bytes":[8549,9775]},"signature":"github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[293,1],"end":[293,98],"bytes":[8549,8646]}},{"name":"level","type":"int","span":{"start":[293,1],"end":[293,98],"bytes":[8549,8646]}},{"name":"txID","type":"invalid type","span":{"start":[293,1],"end":[293,98],"bytes":[8549,8646]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"294:2":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@294:2","span":{"start":[294,2],"end":[294,69],"bytes":[8648,8715]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"296:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@296:14","span":{"start":[296,14],"end":[296,53],"bytes":[8730,8769]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"298:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@298:10","span":{"start":[298,10],"end":[298,48],"bytes":[8796,8834]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"300:8":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@300:8","span":{"start":[300,8],"end":[300,19],"bytes":[8845,8856]},"callee":null,"is_deferred":true},"304:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@304:6","span":{"start":[304,6],"end":[304,16],"bytes":[8920,8930]},"callee":null},"305:11":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@305:11","span":{"start":[305,11],"end":[305,21],"bytes":[8943,8953]},"callee":null},"309:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@309:14","span":{"start":[309,14],"end":[309,35],"bytes":[9013,9034]},"callee":null},"314:33":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@314:33","span":{"start":[314,33],"end":[314,45],"bytes":[9087,9099]},"callee":null},"314:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@314:5","span":{"start":[314,5],"end":[314,17],"bytes":[9059,9071]},"callee":null},"315:22":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@315:22","span":{"start":[315,22],"end":[315,34],"bytes":[9138,9150]},"callee":null},"319:3":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@319:3","span":{"start":[319,3],"end":[319,105],"bytes":[9186,9288]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"319:92":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@319:92","span":{"start":[319,92],"end":[319,104],"bytes":[9275,9287]},"callee":null},"320:19":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@320:19","span":{"start":[320,19],"end":[320,56],"bytes":[9307,9344]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"321:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@321:10","span":{"start":[321,10],"end":[321,49],"bytes":[9368,9407]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"326:4":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@326:4","span":{"start":[326,4],"end":[329,29],"bytes":[9480,9599]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"330:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@330:14","span":{"start":[330,14],"end":[330,67],"bytes":[9613,9666]},"callee":null},"331:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID@331:5","span":{"start":[331,5],"end":[331,68],"bytes":[9685,9748]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"}}},"github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","kind":"method","span":{"start":[238,1],"end":[289,2],"bytes":[6939,8422]},"signature":"github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[238,1],"end":[238,111],"bytes":[6939,7049]}},{"name":"retention","type":"time.Duration","span":{"start":[238,1],"end":[238,111],"bytes":[6939,7049]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"239:15":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@239:15","span":{"start":[239,15],"end":[239,41],"bytes":[7064,7090]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"239:15/2":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@239:15/2","span":{"start":[239,15],"end":[239,25],"bytes":[7064,7074]},"callee":"can://litestream/litestream/@external/time/Now"},"240:2":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@240:2","span":{"start":[240,2],"end":[240,72],"bytes":[7092,7162]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"242:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@242:14","span":{"start":[242,14],"end":[242,61],"bytes":[7177,7224]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"244:13":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@244:13","span":{"start":[244,13],"end":[244,51],"bytes":[7254,7292]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"246:8":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@246:8","span":{"start":[246,8],"end":[246,19],"bytes":[7303,7314]},"callee":null,"is_deferred":true},"252:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@252:6","span":{"start":[252,6],"end":[252,16],"bytes":[7409,7419]},"callee":null},"253:11":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@253:11","span":{"start":[253,11],"end":[253,21],"bytes":[7432,7442]},"callee":null},"256:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@256:6","span":{"start":[256,6],"end":[256,38],"bytes":[7467,7499]},"callee":null},"257:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@257:14","span":{"start":[257,14],"end":[257,35],"bytes":[7515,7536]},"callee":null},"266:33":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@266:33","span":{"start":[266,33],"end":[266,45],"bytes":[7690,7702]},"callee":null},"266:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@266:5","span":{"start":[266,5],"end":[266,17],"bytes":[7662,7674]},"callee":null},"267:22":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@267:22","span":{"start":[267,22],"end":[267,34],"bytes":[7741,7753]},"callee":null},"271:100":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@271:100","span":{"start":[271,100],"end":[271,112],"bytes":[7886,7898]},"callee":null},"271:3":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@271:3","span":{"start":[271,3],"end":[271,113],"bytes":[7789,7899]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"272:19":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@272:19","span":{"start":[272,19],"end":[272,56],"bytes":[7918,7955]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"273:13":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@273:13","span":{"start":[273,13],"end":[273,52],"bytes":[7982,8021]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"278:4":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@278:4","span":{"start":[278,4],"end":[281,29],"bytes":[8094,8221]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"282:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@282:14","span":{"start":[282,14],"end":[282,75],"bytes":[8235,8296]},"callee":null},"283:5":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention@283:5","span":{"start":[283,5],"end":[283,68],"bytes":[8315,8378]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"}}},"github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo","kind":"method","span":{"start":[74,1],"end":[100,2],"bytes":[2460,3002]},"signature":"github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[74,1],"end":[74,91],"bytes":[2460,2550]}},{"name":"level","type":"int","span":{"start":[74,1],"end":[74,91],"bytes":[2460,2550]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"76:18":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo@76:18","span":{"start":[76,18],"end":[76,38],"bytes":[2595,2615]},"callee":null},"81:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo@81:14","span":{"start":[81,14],"end":[81,53],"bytes":[2664,2703]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"85:8":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo@85:8","span":{"start":[85,8],"end":[85,19],"bytes":[2760,2771]},"callee":null,"is_deferred":true},"88:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo@88:6","span":{"start":[88,6],"end":[88,16],"bytes":[2801,2811]},"callee":null},"89:11":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo@89:11","span":{"start":[89,11],"end":[89,21],"bytes":[2824,2834]},"callee":null},"96:3":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo@96:3","span":{"start":[96,3],"end":[96,30],"bytes":[2943,2970]},"callee":null},"99:15":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo@99:15","span":{"start":[99,15],"end":[99,26],"bytes":[2989,3000]},"callee":null}}},"github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","kind":"method","span":{"start":[197,1],"end":[233,2],"bytes":[5669,6659]},"signature":"github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[197,1],"end":[197,83],"bytes":[5669,5751]}},{"name":"level","type":"int","span":{"start":[197,1],"end":[197,83],"bytes":[5669,5751]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"198:14":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@198:14","span":{"start":[198,14],"end":[198,53],"bytes":[5765,5804]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"200:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@200:10","span":{"start":[200,10],"end":[200,48],"bytes":[5831,5869]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"202:8":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@202:8","span":{"start":[202,8],"end":[202,19],"bytes":[5880,5891]},"callee":null,"is_deferred":true},"205:6":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@205:6","span":{"start":[205,6],"end":[205,16],"bytes":[5926,5936]},"callee":null},"206:11":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@206:11","span":{"start":[206,11],"end":[206,21],"bytes":[5949,5959]},"callee":null},"218:12":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@218:12","span":{"start":[218,12],"end":[219,54],"bytes":[6276,6409]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"221:11":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@221:11","span":{"start":[221,11],"end":[222,36],"bytes":[6425,6530]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"228:12":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@228:12","span":{"start":[228,12],"end":[228,23],"bytes":[6569,6580]},"callee":null},"229:10":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency@229:10","span":{"start":[229,10],"end":[229,47],"bytes":[6604,6641]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.Compactor.setLogger":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.setLogger","kind":"method","span":{"start":[68,1],"end":[70,2],"bytes":[2257,2330]},"signature":"github.com/benbjohnson/litestream.Compactor.setLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[68,1],"end":[68,53],"bytes":[2257,2309]}}],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"CacheGetter":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/CacheGetter","kind":"field","type":"func(level int) (invalid type, bool)","span":{"start":[49,1],"end":[49,51],"bytes":[1745,1795]}},"CacheSetter":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/CacheSetter","kind":"field","type":"func(level int, info invalid type)","span":{"start":[53,1],"end":[53,49],"bytes":[1900,1948]}},"CompactionVerifyErrorCounter":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/CompactionVerifyErrorCounter","kind":"field","type":"invalid type","span":{"start":[36,1],"end":[36,49],"bytes":[1094,1142]}},"LocalFileDeleter":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/LocalFileDeleter","kind":"field","type":"func(level int, minTXID invalid type, maxTXID invalid type) error","span":{"start":[45,1],"end":[45,67],"bytes":[1548,1614]}},"LocalFileOpener":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/LocalFileOpener","kind":"field","type":"func(level int, minTXID invalid type, maxTXID invalid type) (io.ReadCloser, error)","span":{"start":[41,1],"end":[41,83],"bytes":[1348,1430]}},"RetentionEnabled":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/RetentionEnabled","kind":"field","type":"bool","span":{"start":[32,1],"end":[32,23],"bytes":[936,958]}},"VerifyCompaction":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/VerifyCompaction","kind":"field","type":"bool","span":{"start":[27,1],"end":[27,23],"bytes":[693,715]}},"client":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/client","kind":"field","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[21,1],"end":[21,22],"bytes":[434,455]}},"logger":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[22,1],"end":[22,21],"bytes":[456,476]}}}}},"functions":{"github.com/benbjohnson/litestream.NewCompactor":{"id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.NewCompactor","kind":"function","span":{"start":[57,1],"end":[66,2],"bytes":[2026,2255]},"signature":"github.com/benbjohnson/litestream.NewCompactor","parameters":[{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[57,1],"end":[57,74],"bytes":[2026,2099]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[57,1],"end":[57,74],"bytes":[2026,2099]}}],"return_type":"*github.com/benbjohnson/litestream.Compactor","metrics":{"cyclomatic":2},"body":{"59:12":{"kind":"call","id":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.NewCompactor@59:12","span":{"start":[59,12],"end":[59,26],"bytes":[2131,2145]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}}},"content_hash":"03305762391ff87adf9ad389d530c981333c4ad82035b223a3b612ac6612cb9b"},"db.go":{"id":"can://litestream/litestream/go/db.go","kind":"module","span":{"start":[1,1],"end":[3492,1],"bytes":[0,111886]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"database/sql\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc64\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/promauto\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/semaphore\"\n\t\"modernc.org/sqlite\"\n\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// Default DB settings.\nconst (\n\tDefaultMonitorInterval = 1 * time.Second\n\tDefaultCheckpointInterval = 1 * time.Minute\n\tDefaultBusyTimeout = 1 * time.Second\n\tDefaultMinCheckpointPageN = 1000\n\tDefaultTruncatePageN = 121359 // ~500MB with 4KB page size\n\tDefaultMaxSyncWALBytes = 64 \u003c\u003c 20\n\tDefaultShutdownSyncTimeout = 30 * time.Second\n\tDefaultShutdownSyncInterval = 500 * time.Millisecond\n\n\t// Sync error backoff configuration.\n\t// When sync errors occur repeatedly (e.g., disk full), backoff doubles each time.\n\tDefaultSyncBackoffMax = 5 * time.Minute // Maximum backoff between retries\n\tSyncErrorLogInterval = 30 * time.Second // Rate-limit repeated error logging\n)\n\n// DB represents a managed instance of a SQLite database in the file system.\n//\n// Checkpoint Strategy:\n// Litestream uses a progressive 3-tier checkpoint approach to balance WAL size\n// management with write availability:\n//\n// 1. MinCheckpointPageN (PASSIVE): Non-blocking checkpoint at ~1k pages (~4MB).\n// Attempts checkpoint but allows concurrent readers/writers.\n//\n// 2. CheckpointInterval (PASSIVE): Time-based non-blocking checkpoint.\n// Ensures regular checkpointing even with low write volume.\n//\n// 3. TruncatePageN (TRUNCATE): Blocking checkpoint at ~121k pages (~500MB).\n// Emergency brake for runaway WAL growth. Can block writes while waiting\n// for long-lived read transactions. Configurable with a default backstop.\n//\n// The RESTART checkpoint mode was permanently removed due to production issues\n// with indefinite write blocking (issue #724). All checkpoints now use either\n// PASSIVE (non-blocking) or TRUNCATE (emergency only) modes.\ntype DB struct {\n\tmu sync.RWMutex\n\texecSem *semaphore.Weighted\n\tpath string // part to database\n\tmetaPath string // Path to the database metadata.\n\tdb *sql.DB // target database\n\tf *os.File // long-running db file descriptor\n\trtx *sql.Tx // long running read transaction\n\tpageSize int // page size, in bytes\n\tnotify chan struct{} // closes on WAL change\n\tchkMu sync.RWMutex // checkpoint lock\n\topened bool // true if Open() was called and Close() not yet called\n\tsyncState syncState\n\tsyncDiag diagState\n\n\t// last file info for each level\n\tmaxLTXFileInfos struct {\n\t\tsync.Mutex\n\t\tm map[int]*ltx.FileInfo\n\t}\n\n\t// Cached position from the latest L0 LTX file.\n\t// nil means cache is invalid; non-nil is the cached position.\n\tpos struct {\n\t\tsync.Mutex\n\t\tvalue *ltx.Pos\n\t}\n\n\tfileInfo os.FileInfo // db info cached during init\n\tdirInfo os.FileInfo // parent dir info cached during init\n\n\t// openLTXFile opens LTX staging files; overridable in tests to\n\t// inject filesystem errors such as ENOSPC.\n\topenLTXFile func(name string, flag int, perm os.FileMode) (ltxStagingFile, error)\n\n\tctx context.Context\n\tcancel func()\n\twg sync.WaitGroup\n\tDone \u003c-chan struct{}\n\n\t// Metrics\n\tmetricsRegistered bool\n\tdbSizeGauge prometheus.Gauge\n\twalSizeGauge prometheus.Gauge\n\ttotalWALBytesCounter prometheus.Counter\n\ttxIDGauge prometheus.Gauge\n\tsyncNCounter prometheus.Counter\n\tsyncErrorNCounter prometheus.Counter\n\tsyncSecondsCounter prometheus.Counter\n\tdiskFullGauge prometheus.Gauge\n\tcheckpointNCounterVec *prometheus.CounterVec\n\tcheckpointErrorNCounterVec *prometheus.CounterVec\n\tcheckpointSecondsCounterVec *prometheus.CounterVec\n\n\t// Minimum threshold of WAL size, in pages, before a passive checkpoint.\n\t// A passive checkpoint will attempt a checkpoint but fail if there are\n\t// active transactions occurring at the same time.\n\t//\n\t// Uses PASSIVE checkpoint mode (non-blocking). Keeps WAL size manageable\n\t// for faster restores. Default: 1000 pages (~4MB with 4KB page size).\n\tMinCheckpointPageN int\n\n\t// Threshold of WAL size, in pages, before a forced truncation checkpoint.\n\t// A forced truncation checkpoint will block new transactions and wait for\n\t// existing transactions to finish before issuing a checkpoint and\n\t// truncating the WAL.\n\t//\n\t// Uses TRUNCATE checkpoint mode (blocking). Prevents unbounded WAL growth\n\t// from long-lived read transactions. Default: 121359 pages (~500MB with 4KB\n\t// page size). Set to 0 to retain the default emergency threshold.\n\tTruncatePageN int\n\n\t// Time between automatic checkpoints in the WAL. This is done to allow\n\t// more fine-grained WAL files so that restores can be performed with\n\t// better precision.\n\t//\n\t// Uses PASSIVE checkpoint mode (non-blocking). Default: 1 minute.\n\t// Set to 0 to disable time-based checkpoints.\n\tCheckpointInterval time.Duration\n\n\t// Frequency at which to perform db sync.\n\tMonitorInterval time.Duration\n\n\t// Maximum WAL bytes to process in a single sync executor run.\n\t// The limit is checked at commit boundaries so a single transaction\n\t// larger than this may exceed it. Set to zero to process all\n\t// committed WAL frames in one run.\n\tMaxSyncWALBytes int64\n\n\t// The timeout to wait for EBUSY from SQLite.\n\tBusyTimeout time.Duration\n\n\t// Minimum time to retain L0 files after they have been compacted into L1.\n\tL0Retention time.Duration\n\n\t// VerifyCompaction enables post-compaction TXID consistency verification.\n\t// When enabled, verifies that files at the destination level have\n\t// contiguous TXID ranges after each compaction.\n\tVerifyCompaction bool\n\n\t// RetentionEnabled controls whether Litestream actively deletes old files\n\t// during retention enforcement. When false, cloud provider lifecycle\n\t// policies handle retention instead. Local file cleanup still occurs.\n\tRetentionEnabled bool\n\n\t// Remote replica for the database.\n\t// Must be set before calling Open().\n\tReplica *Replica\n\n\t// Compactor handles shared compaction logic.\n\t// Created in NewDB with nil client; client set once in Open() from Replica.Client.\n\tcompactor *Compactor\n\n\t// Shutdown sync retry settings.\n\t// ShutdownSyncTimeout is the total time to retry syncing on shutdown.\n\t// ShutdownSyncInterval is the time between retry attempts.\n\tShutdownSyncTimeout time.Duration\n\tShutdownSyncInterval time.Duration\n\n\t// lastSuccessfulSyncAt tracks when replication last succeeded.\n\t// Used by heartbeat monitoring to determine if a ping should be sent.\n\tlastSuccessfulSyncMu sync.RWMutex\n\tlastSuccessfulSyncAt time.Time\n\n\t// Where to send log messages, defaults to global slog with database epath.\n\tLogger *slog.Logger\n}\n\n// syncState holds mutable sync-tracking fields extracted from DB.\n// These fields are threaded through sync/checkpoint methods via pointer.\ntype syncState struct {\n\ttruncatePassiveFailed bool\n\n\t// syncedSinceCheckpoint tracks whether any data has been synced since\n\t// the last checkpoint. Used to prevent time-based checkpoints from\n\t// triggering when there are no actual database changes, which would\n\t// otherwise create unnecessary LTX files. See issue #896.\n\tsyncedSinceCheckpoint bool\n\n\t// syncedToWALEnd tracks whether the last successful sync reached the\n\t// exact end of the WAL file. When true, a subsequent WAL truncation\n\t// (from checkpoint) is expected and should NOT trigger a full snapshot.\n\t// This prevents issue #927 where every checkpoint triggers unnecessary\n\t// full snapshots because verify() sees the old LTX position exceeds\n\t// the new (truncated) WAL size.\n\tsyncedToWALEnd bool\n\n\t// lastSyncedWALOffset tracks the logical end of the WAL content after\n\t// the last successful sync. This is the WALOffset + WALSize from the\n\t// last LTX file. Used for checkpoint threshold decisions instead of\n\t// file size, which may include stale frames with old salt values after\n\t// a checkpoint. This prevents issue #997 where PASSIVE checkpoints\n\t// trigger a feedback loop because stale file size exceeds threshold.\n\tlastSyncedWALOffset int64\n}\n\ntype syncExecutor struct {\n\tstate syncState\n\tpos ltx.Pos\n\tposChanged bool\n\tl0FileInfo *ltx.FileInfo\n\tsynced bool\n\tcheckpointAttempted bool\n}\n\ntype diagOp string\n\nconst (\n\tdiagOpSync diagOp = \"sync\"\n\tdiagOpCheckpoint diagOp = \"checkpoint\"\n)\n\ntype diagPhase string\n\nconst (\n\tdiagPhaseStarting diagPhase = \"starting\"\n\tdiagPhaseEnsureWAL diagPhase = \"ensure_wal\"\n\tdiagPhaseVerifyAndSync diagPhase = \"verify_and_sync\"\n\tdiagPhaseCheckpointIfNeeded diagPhase = \"checkpoint_if_needed\"\n\tdiagPhaseUpdateMetrics diagPhase = \"update_metrics\"\n\tdiagPhaseStatWAL diagPhase = \"stat_wal\"\n\tdiagPhaseVerify diagPhase = \"verify\"\n\tdiagPhaseSyncLTX diagPhase = \"sync_ltx\"\n\tdiagPhaseSyncOpenLTX diagPhase = \"sync_open_ltx\"\n\tdiagPhaseSyncPageMap diagPhase = \"sync_page_map\"\n\tdiagPhaseSyncPrepareLTX diagPhase = \"sync_prepare_ltx\"\n\tdiagPhaseWriteLTXFromDB diagPhase = \"write_ltx_from_db\"\n\tdiagPhaseWriteLTXFromWAL diagPhase = \"write_ltx_from_wal\"\n\tdiagPhaseCloseLTX diagPhase = \"close_ltx\"\n\tdiagPhaseFsyncLTX diagPhase = \"fsync_ltx\"\n\tdiagPhaseRenameLTX diagPhase = \"rename_ltx\"\n\tdiagPhaseSyncComplete diagPhase = \"sync_complete\"\n\tdiagPhaseCheckpointLock diagPhase = \"checkpoint_lock\"\n\tdiagPhaseCheckpointReadWALHeader diagPhase = \"checkpoint_read_wal_header\"\n\tdiagPhaseCheckpointCopyBefore diagPhase = \"checkpoint_copy_before\"\n\tdiagPhaseCheckpointExec diagPhase = \"checkpoint_exec\"\n\tdiagPhaseCheckpointVerifyRestart diagPhase = \"checkpoint_verify_restart\"\n\tdiagPhaseCheckpointSnapshotBoundaryLock diagPhase = \"checkpoint_snapshot_boundary_lock\"\n\tdiagPhaseCheckpointSnapshotBoundary diagPhase = \"checkpoint_snapshot_boundary\"\n)\n\ntype diagState struct {\n\tsync.RWMutex\n\tactive bool\n\toperation diagOp\n\tphase diagPhase\n\tstartedAt time.Time\n\tupdatedAt time.Time\n\ttxID ltx.TXID\n\twalSize int64\n\tlastSyncedWALOffset int64\n\tsnapshotting bool\n\tcheckpointMode string\n\treason string\n\terr string\n\texecutorWaiterCount int\n\texecutorWaitStarted time.Time\n}\n\n// SyncDiagnostic reports the latest DB sync/checkpoint activity.\ntype SyncDiagnostic struct {\n\tPath string `json:\"path\"`\n\tActive bool `json:\"active\"`\n\tOperation string `json:\"operation,omitempty\"`\n\tPhase string `json:\"phase,omitempty\"`\n\tStartedAt *time.Time `json:\"started_at,omitempty\"`\n\tUpdatedAt *time.Time `json:\"updated_at,omitempty\"`\n\tElapsedSeconds float64 `json:\"elapsed_seconds,omitempty\"`\n\tTXID uint64 `json:\"txid,omitempty\"`\n\tWALSize int64 `json:\"wal_size,omitempty\"`\n\tLastSyncedWALOffset int64 `json:\"last_synced_wal_offset,omitempty\"`\n\tSnapshotting bool `json:\"snapshotting,omitempty\"`\n\tCheckpointMode string `json:\"checkpoint_mode,omitempty\"`\n\tReason string `json:\"reason,omitempty\"`\n\tError string `json:\"error,omitempty\"`\n\tExecutorWaiterCount int `json:\"executor_waiter_count,omitempty\"`\n\tExecutorWaitStarted *time.Time `json:\"executor_wait_started_at,omitempty\"`\n\tExecutorWaitSeconds float64 `json:\"executor_wait_seconds,omitempty\"`\n}\n\n// NewDB returns a new instance of DB for a given path.\nfunc NewDB(path string) *DB {\n\tdir, file := filepath.Split(path)\n\n\tdb := \u0026DB{\n\t\tpath: path,\n\t\tmetaPath: filepath.Join(dir, \".\"+file+MetaDirSuffix),\n\t\texecSem: semaphore.NewWeighted(1),\n\t\tnotify: make(chan struct{}),\n\n\t\tMinCheckpointPageN: DefaultMinCheckpointPageN,\n\t\tTruncatePageN: DefaultTruncatePageN,\n\t\tCheckpointInterval: DefaultCheckpointInterval,\n\t\tMonitorInterval: DefaultMonitorInterval,\n\t\tMaxSyncWALBytes: DefaultMaxSyncWALBytes,\n\t\tBusyTimeout: DefaultBusyTimeout,\n\t\tL0Retention: DefaultL0Retention,\n\t\tRetentionEnabled: true,\n\t\tShutdownSyncTimeout: DefaultShutdownSyncTimeout,\n\t\tShutdownSyncInterval: DefaultShutdownSyncInterval,\n\t\tLogger: slog.With(LogKeyDB, filepath.Base(path)),\n\t}\n\tdb.maxLTXFileInfos.m = make(map[int]*ltx.FileInfo)\n\tdb.openLTXFile = defaultOpenLTXFile\n\n\tdb.ctx, db.cancel = context.WithCancel(context.Background())\n\n\t// Initialize compactor with nil client (set once in Open() from Replica.Client).\n\tdb.compactor = NewCompactor(nil, db.Logger.With(LogKeySubsystem, LogSubsystemCompactor))\n\tdb.compactor.LocalFileOpener = db.openLocalLTXFile\n\tdb.compactor.LocalFileDeleter = db.deleteLocalLTXFile\n\tdb.initMetrics()\n\tdb.compactor.CacheGetter = func(level int) (*ltx.FileInfo, bool) {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdefer db.maxLTXFileInfos.Unlock()\n\t\tinfo, ok := db.maxLTXFileInfos.m[level]\n\t\treturn info, ok\n\t}\n\tdb.compactor.CacheSetter = func(level int, info *ltx.FileInfo) {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdefer db.maxLTXFileInfos.Unlock()\n\t\tdb.maxLTXFileInfos.m[level] = info\n\t}\n\n\treturn db\n}\n\n// initMetrics creates the per-database Prometheus series.\n// Open calls it again because Close deletes them.\nfunc (db *DB) initMetrics() {\n\tdbMetricOwners.Lock()\n\tdefer dbMetricOwners.Unlock()\n\tif db.metricsRegistered {\n\t\treturn\n\t}\n\tdb.metricsRegistered = true\n\tdbMetricOwners.paths[db.path]++\n\tdbMetricOwners.basenames[filepath.Base(db.path)]++\n\n\tdb.dbSizeGauge = dbSizeGaugeVec.WithLabelValues(db.path)\n\tdb.walSizeGauge = walSizeGaugeVec.WithLabelValues(db.path)\n\tdb.totalWALBytesCounter = totalWALBytesCounterVec.WithLabelValues(db.path)\n\tdb.txIDGauge = txIDIndexGaugeVec.WithLabelValues(db.path)\n\tdb.syncNCounter = syncNCounterVec.WithLabelValues(db.path)\n\tdb.syncErrorNCounter = syncErrorNCounterVec.WithLabelValues(db.path)\n\tdb.syncSecondsCounter = syncSecondsCounterVec.WithLabelValues(db.path)\n\tdb.diskFullGauge = diskFullGaugeVec.WithLabelValues(db.path)\n\tdb.checkpointNCounterVec = checkpointNCounterVec.MustCurryWith(prometheus.Labels{\"db\": db.path})\n\tdb.checkpointErrorNCounterVec = checkpointErrorNCounterVec.MustCurryWith(prometheus.Labels{\"db\": db.path})\n\tdb.checkpointSecondsCounterVec = checkpointSecondsCounterVec.MustCurryWith(prometheus.Labels{\"db\": db.path})\n\tdb.compactor.CompactionVerifyErrorCounter = compactionVerifyErrorCounterVec.WithLabelValues(db.path)\n}\n\n// deleteMetrics removes every per-database series so a process that opens many\n// databases over its lifetime does not accumulate series forever.\nfunc (db *DB) deleteMetrics() {\n\tdbMetricOwners.Lock()\n\tdefer dbMetricOwners.Unlock()\n\tif !db.metricsRegistered {\n\t\treturn\n\t}\n\tdb.metricsRegistered = false\n\n\tname := filepath.Base(db.path)\n\tdbMetricOwners.basenames[name]--\n\tif dbMetricOwners.basenames[name] == 0 {\n\t\tdelete(dbMetricOwners.basenames, name)\n\t\tinternal.L0RetentionGaugeVec.DeletePartialMatch(prometheus.Labels{\"db\": name})\n\t}\n\n\tdbMetricOwners.paths[db.path]--\n\tif dbMetricOwners.paths[db.path] != 0 {\n\t\treturn\n\t}\n\tdelete(dbMetricOwners.paths, db.path)\n\n\tlabels := prometheus.Labels{\"db\": db.path}\n\tdbSizeGaugeVec.DeletePartialMatch(labels)\n\twalSizeGaugeVec.DeletePartialMatch(labels)\n\ttotalWALBytesCounterVec.DeletePartialMatch(labels)\n\ttxIDIndexGaugeVec.DeletePartialMatch(labels)\n\tsyncNCounterVec.DeletePartialMatch(labels)\n\tsyncErrorNCounterVec.DeletePartialMatch(labels)\n\tsyncSecondsCounterVec.DeletePartialMatch(labels)\n\tdiskFullGaugeVec.DeletePartialMatch(labels)\n\tcompactionVerifyErrorCounterVec.DeletePartialMatch(labels)\n\tcheckpointNCounterVec.DeletePartialMatch(labels)\n\tcheckpointErrorNCounterVec.DeletePartialMatch(labels)\n\tcheckpointSecondsCounterVec.DeletePartialMatch(labels)\n}\n\n// SetLogger updates the database logger and propagates to subsystems.\nfunc (db *DB) SetLogger(logger *slog.Logger) {\n\tif logger == nil {\n\t\tlogger = slog.Default()\n\t}\n\tdb.Logger = logger\n\tif db.compactor != nil {\n\t\tdb.compactor.setLogger(logger.With(LogKeySubsystem, LogSubsystemCompactor))\n\t}\n\tif db.Replica != nil \u0026\u0026 db.Replica.Client != nil {\n\t\tdb.Replica.Client.SetLogger(db.Replica.Logger())\n\t}\n}\n\n// SQLDB returns a reference to the underlying sql.DB connection.\nfunc (db *DB) SQLDB() *sql.DB {\n\treturn db.db\n}\n\n// Path returns the path to the database.\nfunc (db *DB) Path() string {\n\treturn db.path\n}\n\n// SyncDiagnostic returns the latest sync/checkpoint diagnostic snapshot.\nfunc (db *DB) SyncDiagnostic() SyncDiagnostic {\n\tdb.syncDiag.RLock()\n\tdefer db.syncDiag.RUnlock()\n\n\tdiag := SyncDiagnostic{\n\t\tPath: db.path,\n\t\tActive: db.syncDiag.active,\n\t\tOperation: string(db.syncDiag.operation),\n\t\tPhase: string(db.syncDiag.phase),\n\t\tTXID: uint64(db.syncDiag.txID),\n\t\tWALSize: db.syncDiag.walSize,\n\t\tLastSyncedWALOffset: db.syncDiag.lastSyncedWALOffset,\n\t\tSnapshotting: db.syncDiag.snapshotting,\n\t\tCheckpointMode: db.syncDiag.checkpointMode,\n\t\tReason: db.syncDiag.reason,\n\t\tError: db.syncDiag.err,\n\t\tExecutorWaiterCount: db.syncDiag.executorWaiterCount,\n\t}\n\tif !db.syncDiag.executorWaitStarted.IsZero() {\n\t\tstartedAt := db.syncDiag.executorWaitStarted\n\t\tdiag.ExecutorWaitStarted = \u0026startedAt\n\t\tdiag.ExecutorWaitSeconds = time.Since(db.syncDiag.executorWaitStarted).Seconds()\n\t}\n\tif !db.syncDiag.startedAt.IsZero() {\n\t\tstartedAt := db.syncDiag.startedAt\n\t\tdiag.StartedAt = \u0026startedAt\n\t}\n\tif !db.syncDiag.updatedAt.IsZero() {\n\t\tupdatedAt := db.syncDiag.updatedAt\n\t\tdiag.UpdatedAt = \u0026updatedAt\n\t}\n\tif !db.syncDiag.startedAt.IsZero() {\n\t\tend := db.syncDiag.updatedAt\n\t\tif db.syncDiag.active || end.IsZero() {\n\t\t\tend = time.Now()\n\t\t}\n\t\tdiag.ElapsedSeconds = end.Sub(db.syncDiag.startedAt).Seconds()\n\t}\n\treturn diag\n}\n\nfunc (db *DB) beginSyncDiag(operation diagOp) {\n\tnow := time.Now()\n\twalSize, _ := db.walFileSize()\n\n\tdb.syncDiag.Lock()\n\tdb.syncDiag.active = true\n\tdb.syncDiag.operation = operation\n\tdb.syncDiag.phase = diagPhaseStarting\n\tdb.syncDiag.startedAt = now\n\tdb.syncDiag.updatedAt = now\n\tdb.syncDiag.txID = 0\n\tdb.syncDiag.walSize = walSize\n\tdb.syncDiag.lastSyncedWALOffset = db.syncState.lastSyncedWALOffset\n\tdb.syncDiag.snapshotting = false\n\tdb.syncDiag.checkpointMode = \"\"\n\tdb.syncDiag.reason = \"\"\n\tdb.syncDiag.err = \"\"\n\tdb.syncDiag.Unlock()\n}\n\nfunc (db *DB) setSyncDiagPhase(phase diagPhase, updates ...func(*diagState)) {\n\tdb.syncDiag.Lock()\n\tdefer db.syncDiag.Unlock()\n\tif !db.syncDiag.active {\n\t\treturn\n\t}\n\tdb.syncDiag.phase = phase\n\tdb.syncDiag.updatedAt = time.Now()\n\tfor _, update := range updates {\n\t\tupdate(\u0026db.syncDiag)\n\t}\n}\n\nfunc (db *DB) finishSyncDiag(err error) {\n\tdb.syncDiag.Lock()\n\tdefer db.syncDiag.Unlock()\n\tif !db.syncDiag.active {\n\t\treturn\n\t}\n\tdb.syncDiag.active = false\n\tdb.syncDiag.updatedAt = time.Now()\n\tif err != nil {\n\t\tdb.syncDiag.err = err.Error()\n\t}\n}\n\nfunc (db *DB) beginSyncExecutorWait() {\n\tdb.syncDiag.Lock()\n\tdefer db.syncDiag.Unlock()\n\tif db.syncDiag.executorWaiterCount == 0 {\n\t\tdb.syncDiag.executorWaitStarted = time.Now()\n\t}\n\tdb.syncDiag.executorWaiterCount++\n}\n\nfunc (db *DB) finishSyncExecutorWait() {\n\tdb.syncDiag.Lock()\n\tdefer db.syncDiag.Unlock()\n\tdb.syncDiag.executorWaiterCount--\n\tif db.syncDiag.executorWaiterCount == 0 {\n\t\tdb.syncDiag.executorWaitStarted = time.Time{}\n\t}\n}\n\n// IsOpen returns true if the database has been opened.\nfunc (db *DB) IsOpen() bool {\n\tdb.mu.RLock()\n\tdefer db.mu.RUnlock()\n\treturn db.opened\n}\n\n// WALPath returns the path to the database's WAL file.\nfunc (db *DB) WALPath() string {\n\treturn db.path + \"-wal\"\n}\n\n// MetaPath returns the path to the database metadata.\nfunc (db *DB) MetaPath() string {\n\treturn db.metaPath\n}\n\n// SetMetaPath sets the path to database metadata.\nfunc (db *DB) SetMetaPath(path string) {\n\tdb.metaPath = path\n}\n\n// LTXDir returns path of the root LTX directory.\nfunc (db *DB) LTXDir() string {\n\treturn filepath.Join(db.metaPath, \"ltx\")\n}\n\n// ResetLocalState removes local LTX files, forcing a fresh snapshot on next sync.\n// This is useful for recovering from corrupted or missing LTX files.\n// The database file itself is not modified.\nfunc (db *DB) ResetLocalState(ctx context.Context) error {\n\tdb.Logger.Info(\"resetting local litestream state\",\n\t\t\"meta_path\", db.metaPath,\n\t\t\"ltx_dir\", db.LTXDir())\n\n\t// Remove all LTX files\n\tif err := os.RemoveAll(db.LTXDir()); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"remove ltx directory: %w\", err)\n\t}\n\n\t// Clear cached LTX file info\n\tdb.maxLTXFileInfos.Lock()\n\tdb.maxLTXFileInfos.m = make(map[int]*ltx.FileInfo)\n\tdb.maxLTXFileInfos.Unlock()\n\n\tdb.invalidatePosCache()\n\n\tdb.Logger.Info(\"local state reset complete, next sync will create fresh snapshot\")\n\treturn nil\n}\n\n// LTXLevelDir returns path of the given LTX compaction level.\n// Panics if level is negative.\nfunc (db *DB) LTXLevelDir(level int) string {\n\treturn filepath.Join(db.LTXDir(), strconv.Itoa(level))\n}\n\n// LTXPath returns the local path of a single LTX file.\n// Panics if level or either txn ID is negative.\nfunc (db *DB) LTXPath(level int, minTXID, maxTXID ltx.TXID) string {\n\tassert(level \u003e= 0, \"level cannot be negative\")\n\treturn filepath.Join(db.LTXLevelDir(level), ltx.FormatFilename(minTXID, maxTXID))\n}\n\n// openLocalLTXFile opens a local LTX file for reading.\n// Used by the Compactor to prefer local files over remote.\nfunc (db *DB) openLocalLTXFile(level int, minTXID, maxTXID ltx.TXID) (io.ReadCloser, error) {\n\treturn os.Open(db.LTXPath(level, minTXID, maxTXID))\n}\n\n// deleteLocalLTXFile deletes a local LTX file.\n// Used by the Compactor for retention enforcement.\nfunc (db *DB) deleteLocalLTXFile(level int, minTXID, maxTXID ltx.TXID) error {\n\tpath := db.LTXPath(level, minTXID, maxTXID)\n\tif err := os.Remove(path); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\tif level == 0 {\n\t\tdb.invalidatePosCache()\n\t}\n\treturn nil\n}\n\n// MaxLTX returns the last LTX file written to level 0.\nfunc (db *DB) MaxLTX() (minTXID, maxTXID ltx.TXID, err error) {\n\tents, err := os.ReadDir(db.LTXLevelDir(0))\n\tif os.IsNotExist(err) {\n\t\treturn 0, 0, nil // no LTX files written\n\t} else if err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// Find highest txn ID.\n\tfor _, ent := range ents {\n\t\tif min, max, err := ltx.ParseFilename(ent.Name()); err != nil {\n\t\t\tcontinue // invalid LTX filename\n\t\t} else if max \u003e maxTXID {\n\t\t\tminTXID, maxTXID = min, max\n\t\t}\n\t}\n\treturn minTXID, maxTXID, nil\n}\n\n// FileInfo returns the cached file stats for the database file when it was initialized.\nfunc (db *DB) FileInfo() os.FileInfo {\n\treturn db.fileInfo\n}\n\n// DirInfo returns the cached file stats for the parent directory of the database file when it was initialized.\nfunc (db *DB) DirInfo() os.FileInfo {\n\treturn db.dirInfo\n}\n\n// Pos returns the current replication position of the database.\n// The result is cached and invalidated when L0 LTX files change.\nfunc (db *DB) Pos() (ltx.Pos, error) {\n\tdb.pos.Lock()\n\tdefer db.pos.Unlock()\n\n\tif db.pos.value != nil {\n\t\treturn *db.pos.value, nil\n\t}\n\n\tminTXID, maxTXID, err := db.MaxLTX()\n\tif err != nil {\n\t\treturn ltx.Pos{}, err\n\t} else if minTXID == 0 {\n\t\treturn ltx.Pos{}, nil // no replication yet\n\t}\n\n\tltxPath := db.LTXPath(0, minTXID, maxTXID)\n\tf, err := os.Open(ltxPath)\n\tif err != nil {\n\t\treturn ltx.Pos{}, NewLTXError(\"open\", ltxPath, 0, uint64(minTXID), uint64(maxTXID), err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tdec := ltx.NewDecoder(f)\n\tif err := dec.Verify(); err != nil {\n\t\treturn ltx.Pos{}, NewLTXError(\"verify\", ltxPath, 0, uint64(minTXID), uint64(maxTXID), fmt.Errorf(\"%w: %w\", ErrLTXCorrupted, err))\n\t}\n\n\tpos := dec.PostApplyPos()\n\tdb.pos.value = \u0026pos\n\n\treturn pos, nil\n}\n\n// invalidatePosCache clears the cached position so the next call to Pos()\n// recomputes it from disk. Call this when L0 LTX files are deleted or\n// when the L0 directory is cleared.\nfunc (db *DB) invalidatePosCache() {\n\tdb.pos.Lock()\n\tdb.pos.value = nil\n\tdb.pos.Unlock()\n}\n\n// Notify returns a channel that closes when the shadow WAL changes.\nfunc (db *DB) Notify() \u003c-chan struct{} {\n\tdb.mu.RLock()\n\tdefer db.mu.RUnlock()\n\treturn db.notify\n}\n\n// PageSize returns the page size of the underlying database.\n// Only valid after database exists \u0026 Init() has successfully run.\nfunc (db *DB) PageSize() int {\n\tdb.mu.RLock()\n\tdefer db.mu.RUnlock()\n\treturn db.pageSize\n}\n\n// RecordSuccessfulSync marks the current time as a successful sync.\n// Used by heartbeat monitoring to determine if a ping should be sent.\nfunc (db *DB) RecordSuccessfulSync() {\n\tdb.lastSuccessfulSyncMu.Lock()\n\tdefer db.lastSuccessfulSyncMu.Unlock()\n\tdb.lastSuccessfulSyncAt = time.Now()\n}\n\n// LastSuccessfulSyncAt returns the time of the last successful sync.\nfunc (db *DB) LastSuccessfulSyncAt() time.Time {\n\tdb.lastSuccessfulSyncMu.RLock()\n\tdefer db.lastSuccessfulSyncMu.RUnlock()\n\treturn db.lastSuccessfulSyncAt\n}\n\n// SyncStatus represents the current replication state of the database.\ntype SyncStatus struct {\n\tLocalTXID ltx.TXID\n\tRemoteTXID ltx.TXID\n\tInSync bool\n}\n\n// SyncStatus returns the current replication status of the database, comparing\n// the local transaction position against the remote replica position. The remote\n// position is queried from the replica storage, so this method may perform I/O.\nfunc (db *DB) SyncStatus(ctx context.Context) (SyncStatus, error) {\n\tif db.Replica == nil {\n\t\treturn SyncStatus{}, fmt.Errorf(\"no replica configured\")\n\t}\n\n\tlocalPos, err := db.Pos()\n\tif err != nil {\n\t\treturn SyncStatus{}, fmt.Errorf(\"local position: %w\", err)\n\t}\n\n\tremotePos, err := db.Replica.calcPos(ctx)\n\tif err != nil {\n\t\treturn SyncStatus{}, fmt.Errorf(\"remote position: %w\", err)\n\t}\n\n\treturn SyncStatus{\n\t\tLocalTXID: localPos.TXID,\n\t\tRemoteTXID: remotePos.TXID,\n\t\tInSync: localPos.TXID \u003e 0 \u0026\u0026 localPos.TXID == remotePos.TXID,\n\t}, nil\n}\n\n// SyncAndWait performs a full sync: WAL to LTX files, then LTX files to remote\n// replica. Blocks until both stages complete.\nfunc (db *DB) SyncAndWait(ctx context.Context) error {\n\tif db.Replica == nil {\n\t\treturn fmt.Errorf(\"no replica configured\")\n\t}\n\n\tif err := db.Sync(ctx); err != nil {\n\t\treturn fmt.Errorf(\"db sync: %w\", err)\n\t}\n\tif err := db.Replica.Sync(ctx); err != nil {\n\t\treturn fmt.Errorf(\"replica sync: %w\", err)\n\t}\n\treturn nil\n}\n\n// EnsureExists restores the database from the configured replica if the local\n// database file does not exist. If no backup is available, it returns nil and\n// a fresh database will be created on Open(). Must be called before Open().\nfunc (db *DB) EnsureExists(ctx context.Context) error {\n\tif db.Replica == nil {\n\t\treturn fmt.Errorf(\"no replica configured\")\n\t}\n\tif db.Replica.Client == nil {\n\t\treturn fmt.Errorf(\"no replica client configured\")\n\t}\n\n\tif _, err := os.Stat(db.Path()); err == nil {\n\t\treturn nil\n\t} else if !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"stat database: %w\", err)\n\t}\n\n\tif dir := filepath.Dir(db.Path()); dir != \".\" {\n\t\tif err := os.MkdirAll(dir, 0o750); err != nil {\n\t\t\treturn fmt.Errorf(\"create parent directory: %w\", err)\n\t\t}\n\t}\n\n\topt := NewRestoreOptions()\n\topt.OutputPath = db.Path()\n\topt.IntegrityCheck = IntegrityCheckQuick\n\n\tif err := db.Replica.Restore(ctx, opt); err != nil {\n\t\tif errors.Is(err, ErrTxNotAvailable) || errors.Is(err, ErrNoSnapshots) {\n\t\t\tdb.Logger.Debug(\"no backup found, will create fresh database\")\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"restore from backup: %w\", err)\n\t}\n\n\tdb.Logger.Info(\"database restored from backup\", \"path\", db.Path())\n\treturn nil\n}\n\n// Open initializes the background monitoring goroutine.\nfunc (db *DB) Open() (err error) {\n\tdb.mu.Lock()\n\tif db.opened {\n\t\tdb.mu.Unlock()\n\t\treturn nil // already open\n\t}\n\t// Recreate context for fresh start (handles reopen after close)\n\tdb.ctx, db.cancel = context.WithCancel(context.Background())\n\tdb.mu.Unlock()\n\n\t// Close deletes the per-database series, so recreate them.\n\tdb.initMetrics()\n\n\t// Validate fields on database.\n\tif db.Replica == nil {\n\t\treturn fmt.Errorf(\"replica required before opening database\")\n\t}\n\tif db.Replica.Client == nil {\n\t\treturn fmt.Errorf(\"replica client required before opening database\")\n\t}\n\tif db.MinCheckpointPageN \u003c= 0 {\n\t\treturn fmt.Errorf(\"minimum checkpoint page count required\")\n\t}\n\n\t// Clear old temporary files that my have been left from a crash.\n\tif err := removeTmpFiles(db.metaPath); err != nil {\n\t\treturn fmt.Errorf(\"cannot remove tmp files: %w\", err)\n\t}\n\n\t// Set the compactor client once before starting any goroutines.\n\tdb.compactor.VerifyCompaction = db.VerifyCompaction\n\tdb.compactor.RetentionEnabled = db.RetentionEnabled\n\tdb.compactor.client = db.Replica.Client\n\n\t// Start monitoring SQLite database in a separate goroutine.\n\tif db.MonitorInterval \u003e 0 {\n\t\tdb.wg.Add(1)\n\t\tgo func() { defer db.wg.Done(); db.monitor() }()\n\t}\n\n\t// Mark as opened only after successful initialization.\n\tdb.mu.Lock()\n\tdb.opened = true\n\tdb.mu.Unlock()\n\n\treturn nil\n}\n\n// Close flushes outstanding WAL writes to replicas, releases the read lock,\n// and closes the database. If Done is set, closing it interrupts the shutdown\n// sync retry loop and cancels any in-flight sync attempt.\nfunc (db *DB) Close(ctx context.Context) (err error) {\n\tdb.cancel()\n\tdb.wg.Wait()\n\n\t// Acquire without honoring caller cancellation: the cleanup below\n\t// (read lock release, handle closes, state reset) must always run or\n\t// the DB is left half-closed with its read lock held. Semaphore\n\t// acquisition fails immediately on an already-done context even when\n\t// the semaphore is free.\n\tif err := db.execSem.Acquire(context.WithoutCancel(ctx), 1); err != nil {\n\t\treturn err\n\t}\n\tdefer db.execSem.Release(1)\n\n\t// Perform a final db sync, if initialized.\n\tif db.db != nil {\n\t\tif _, e := db.syncLocked(ctx, 0); e != nil {\n\t\t\terr = e\n\t\t}\n\t}\n\n\t// Ensure replicas perform a final sync and stop replicating.\n\tif db.Replica != nil {\n\t\tif db.db != nil {\n\t\t\tif e := db.syncReplicaWithRetry(ctx); e != nil \u0026\u0026 err == nil {\n\t\t\t\terr = e\n\t\t\t}\n\t\t}\n\t\tdb.Replica.Stop(true)\n\t}\n\n\t// Release the read lock to allow other applications to handle checkpointing.\n\tif db.rtx != nil {\n\t\tif e := db.releaseReadLock(); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\n\tdb.mu.Lock()\n\tsqlDB := db.db\n\tf := db.f\n\tdb.db = nil\n\tdb.f = nil\n\tdb.opened = false\n\tdb.rtx = nil\n\tdb.mu.Unlock()\n\n\tif sqlDB != nil {\n\t\tif e := sqlDB.Close(); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\n\tif f != nil {\n\t\tif e := f.Close(); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\n\t// Remove this database's series now that the final sync has recorded\n\t// its last values.\n\tdb.deleteMetrics()\n\n\treturn err\n}\n\n// syncReplicaWithRetry attempts to sync the replica with retry logic for shutdown.\n// It retries until success, timeout, or context cancellation. If db.Done is non-nil,\n// closing it cancels any in-flight sync attempt and exits the retry loop.\n// If ShutdownSyncTimeout is 0, it performs a single sync attempt without retries.\nfunc (db *DB) syncReplicaWithRetry(ctx context.Context) error {\n\tif db.Replica == nil {\n\t\treturn nil\n\t}\n\n\ttimeout := db.ShutdownSyncTimeout\n\tinterval := db.ShutdownSyncInterval\n\n\t// If timeout is zero, just try once (no retry)\n\tif timeout == 0 {\n\t\treturn db.Replica.Sync(ctx)\n\t}\n\n\t// Use default interval if not set\n\tif interval == 0 {\n\t\tinterval = DefaultShutdownSyncInterval\n\t}\n\n\t// Create deadline context for total retry duration.\n\tdeadlineCtx, deadlineCancel := context.WithTimeout(ctx, timeout)\n\tdefer deadlineCancel()\n\n\t// If db.Done is set, derive a context that cancels when done is closed\n\t// so that in-flight Replica.Sync calls are interrupted immediately.\n\tsyncCtx := deadlineCtx\n\tif db.Done != nil {\n\t\tvar syncCancel context.CancelFunc\n\t\tsyncCtx, syncCancel = context.WithCancel(deadlineCtx)\n\t\tgo func() {\n\t\t\tselect {\n\t\t\tcase \u003c-db.Done:\n\t\t\t\tsyncCancel()\n\t\t\tcase \u003c-deadlineCtx.Done():\n\t\t\t\tsyncCancel()\n\t\t\t}\n\t\t}()\n\t}\n\n\tvar lastErr error\n\tattempt := 0\n\tstartTime := time.Now()\n\n\tfor {\n\t\t// Check if done is already closed before attempting sync\n\t\tif db.Done != nil {\n\t\t\tselect {\n\t\t\tcase \u003c-db.Done:\n\t\t\t\tdb.Logger.Warn(\"shutdown sync skipped, interrupted by signal\",\n\t\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\t\"duration\", time.Since(startTime))\n\t\t\t\treturn fmt.Errorf(\"after %d attempts: %w\", attempt, ErrShutdownInterrupted)\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\tattempt++\n\n\t\t// Try sync\n\t\tif err := db.Replica.Sync(syncCtx); err == nil {\n\t\t\tif attempt \u003e 1 {\n\t\t\t\tdb.Logger.Info(\"shutdown sync succeeded after retry\",\n\t\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\t\"duration\", time.Since(startTime))\n\t\t\t}\n\t\t\treturn nil\n\t\t} else {\n\t\t\tlastErr = err\n\t\t}\n\n\t\t// Check if we should stop retrying (done signal or timeout)\n\t\tselect {\n\t\tcase \u003c-deadlineCtx.Done():\n\t\t\tdb.Logger.Error(\"shutdown sync failed after timeout\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"duration\", time.Since(startTime),\n\t\t\t\t\"error\", lastErr)\n\t\t\treturn fmt.Errorf(\"shutdown sync timeout after %d attempts: %w\", attempt, lastErr)\n\t\tcase \u003c-db.Done:\n\t\t\tdb.Logger.Warn(\"shutdown sync interrupted by signal\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"duration\", time.Since(startTime),\n\t\t\t\t\"error\", lastErr)\n\t\t\treturn fmt.Errorf(\"after %d attempts: %w\", attempt, ErrShutdownInterrupted)\n\t\tdefault:\n\t\t}\n\n\t\t// Log retry with hint about second signal if interruptible\n\t\tif db.Done != nil {\n\t\t\tdb.Logger.Warn(\"shutdown sync failed, retrying (press Ctrl+C again to skip)\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"error\", lastErr,\n\t\t\t\t\"elapsed\", time.Since(startTime),\n\t\t\t\t\"remaining\", time.Until(startTime.Add(timeout)))\n\t\t} else {\n\t\t\tdb.Logger.Warn(\"shutdown sync failed, retrying\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"error\", lastErr,\n\t\t\t\t\"elapsed\", time.Since(startTime),\n\t\t\t\t\"remaining\", time.Until(startTime.Add(timeout)))\n\t\t}\n\n\t\t// Wait before retry, but also listen for done signal\n\t\tselect {\n\t\tcase \u003c-time.After(interval):\n\t\tcase \u003c-deadlineCtx.Done():\n\t\t\treturn fmt.Errorf(\"shutdown sync timeout after %d attempts: %w\", attempt, lastErr)\n\t\tcase \u003c-db.Done:\n\t\t\tdb.Logger.Warn(\"shutdown sync interrupted by signal\",\n\t\t\t\t\"attempts\", attempt,\n\t\t\t\t\"duration\", time.Since(startTime))\n\t\t\treturn fmt.Errorf(\"after %d attempts: %w\", attempt, ErrShutdownInterrupted)\n\t\t}\n\t}\n}\n\n// setPersistWAL sets the PERSIST_WAL file control on the database connection.\n// This prevents SQLite from removing the WAL file when connections close.\nfunc (db *DB) setPersistWAL(ctx context.Context) error {\n\tconn, err := db.db.Conn(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get connection: %w\", err)\n\t}\n\tdefer conn.Close()\n\n\treturn conn.Raw(func(driverConn interface{}) error {\n\t\tfc, ok := driverConn.(sqlite.FileControl)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"driver does not implement FileControl\")\n\t\t}\n\n\t\t_, err := fc.FileControlPersistWAL(\"main\", 1)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"FileControlPersistWAL: %w\", err)\n\t\t}\n\n\t\treturn nil\n\t})\n}\n\n// init initializes the connection to the database.\n// Skipped if already initialized or if the database file does not exist.\nfunc (db *DB) init(ctx context.Context) (err error) {\n\t// Exit if already initialized.\n\tif db.db != nil {\n\t\treturn nil\n\t}\n\n\t// Exit if no database file exists.\n\tfi, err := os.Stat(db.path)\n\tif os.IsNotExist(err) {\n\t\treturn nil\n\t} else if err != nil {\n\t\treturn err\n\t}\n\tdb.fileInfo = fi\n\n\t// Obtain permissions for parent directory.\n\tif fi, err = os.Stat(filepath.Dir(db.path)); err != nil {\n\t\treturn err\n\t}\n\tdb.dirInfo = fi\n\n\tdsn := fmt.Sprintf(\"file:%s?_pragma=busy_timeout(%d)\u0026_pragma=wal_autocheckpoint(0)\",\n\t\tdb.path, db.BusyTimeout.Milliseconds())\n\n\tif db.db, err = sql.Open(\"sqlite\", dsn); err != nil {\n\t\treturn err\n\t}\n\n\t// Set PERSIST_WAL to prevent WAL file removal when database connections close.\n\tif err := db.setPersistWAL(ctx); err != nil {\n\t\treturn fmt.Errorf(\"set PERSIST_WAL: %w\", err)\n\t}\n\n\t// Open long-running database file descriptor. Required for non-OFD locks.\n\tif db.f, err = os.Open(db.path); err != nil {\n\t\treturn fmt.Errorf(\"open db file descriptor: %w\", err)\n\t}\n\n\t// Ensure database is closed if init fails.\n\t// Initialization can retry on next sync.\n\tdefer func() {\n\t\tif err != nil {\n\t\t\t_ = db.releaseReadLock()\n\t\t\tdb.db.Close()\n\t\t\tdb.f.Close()\n\t\t\tdb.db, db.f = nil, nil\n\t\t}\n\t}()\n\n\t// Enable WAL and ensure it is set. New mode should be returned on success:\n\t// https://www.sqlite.org/pragma.html#pragma_journal_mode\n\tvar mode string\n\tif err := db.db.QueryRowContext(ctx, `PRAGMA journal_mode = wal;`).Scan(\u0026mode); err != nil {\n\t\treturn err\n\t} else if mode != \"wal\" {\n\t\treturn fmt.Errorf(\"enable wal failed, mode=%q\", mode)\n\t}\n\n\t// Create a table to force writes to the WAL when empty.\n\t// There should only ever be one row with id=1.\n\tif _, err := db.db.ExecContext(ctx, `CREATE TABLE IF NOT EXISTS _litestream_seq (id INTEGER PRIMARY KEY, seq INTEGER);`); err != nil {\n\t\treturn fmt.Errorf(\"create _litestream_seq table: %w\", err)\n\t}\n\n\t// Create a lock table to force write locks during sync.\n\t// The sync write transaction always rolls back so no data should be in this table.\n\tif _, err := db.db.ExecContext(ctx, `CREATE TABLE IF NOT EXISTS _litestream_lock (id INTEGER);`); err != nil {\n\t\treturn fmt.Errorf(\"create _litestream_lock table: %w\", err)\n\t}\n\n\t// Start a long-running read transaction to prevent other transactions\n\t// from checkpointing.\n\tif err := db.acquireReadLock(ctx); err != nil {\n\t\treturn fmt.Errorf(\"acquire read lock: %w\", err)\n\t}\n\n\t// Read page size.\n\tif err := db.db.QueryRowContext(ctx, `PRAGMA page_size;`).Scan(\u0026db.pageSize); err != nil {\n\t\treturn fmt.Errorf(\"read page size: %w\", err)\n\t} else if db.pageSize \u003c= 0 {\n\t\treturn fmt.Errorf(\"invalid db page size: %d\", db.pageSize)\n\t}\n\n\t// Ensure meta directory structure exists.\n\tif err := internal.MkdirAll(db.metaPath, db.dirInfo); err != nil {\n\t\treturn err\n\t}\n\n\t// Ensure WAL has at least one frame in it.\n\tif err := db.ensureWALExists(ctx); err != nil {\n\t\treturn fmt.Errorf(\"ensure wal exists: %w\", err)\n\t}\n\n\t// Check if database is behind replica (issue #781).\n\t// This must happen before replica.Start() to detect restore scenarios.\n\tif db.Replica != nil {\n\t\tif err := db.checkDatabaseBehindReplica(ctx); err != nil {\n\t\t\treturn fmt.Errorf(\"check database behind replica: %w\", err)\n\t\t}\n\t}\n\n\t// If we have an existing replication files, ensure the headers match.\n\t// if err := db.verifyHeadersMatch(); err != nil {\n\t// \treturn fmt.Errorf(\"cannot determine last wal position: %w\", err)\n\t// }\n\n\t// TODO(gen): Generate diff of current LTX snapshot and save as next LTX file.\n\n\t// Start replication.\n\tif db.Replica != nil {\n\t\tdb.Replica.Start(db.ctx)\n\t}\n\n\treturn nil\n}\n\n/*\n// verifyHeadersMatch returns an error if\nfunc (db *DB) verifyHeadersMatch() error {\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"cannot determine position: %w\", err)\n\t} else if pos.TXID == 0 {\n\t\treturn true, nil // no replication performed yet\n\t}\n\n\thdr0, err := readWALHeader(db.WALPath())\n\tif os.IsNotExist(err) {\n\t\treturn false, fmt.Errorf(\"no wal: %w\", err)\n\t} else if err != nil {\n\t\treturn false, fmt.Errorf(\"read wal header: %w\", err)\n\t}\n\tsalt1 := binary.BigEndian.Uint32(hdr0[16:])\n\tsalt2 := binary.BigEndian.Uint32(hdr0[20:])\n\n\tltxPath := db.LTXPath(0, pos.TXID, pos.TXID)\n\tf, err := os.Open(ltxPath)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"open ltx path: %w\", err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tdec := ltx.NewDecoder(f)\n\tif err := dec.DecodeHeader(); err != nil {\n\t\treturn false, fmt.Errorf(\"decode ltx header: %w\", err)\n\t}\n\thdr1 := dec.Header()\n\tif salt1 != hdr1.WALSalt1 || salt2 != hdr1.WALSalt2 {\n\t\tdb.Logger.Log(internal.LevelTrace, \"salt mismatch\",\n\t\t\t\"path\", ltxPath,\n\t\t\t\"wal\", [2]uint32{salt1, salt2},\n\t\t\t\"ltx\", [2]uint32{hdr1.WALSalt1, hdr1.WALSalt2})\n\t\treturn false, nil\n\t}\n\treturn true, nil\n}\n*/\n\n// acquireReadLock begins a read transaction on the database to prevent checkpointing.\nfunc (db *DB) acquireReadLock(ctx context.Context) error {\n\tif db.rtx != nil {\n\t\treturn nil\n\t}\n\n\t// Start long running read-transaction to prevent checkpoints. The\n\t// transaction outlives this call, and database/sql rolls it back when its\n\t// BeginTx context is cancelled, so detach it from the caller's context\n\t// (e.g. a control socket request that is cancelled when it returns).\n\ttx, err := db.db.BeginTx(context.WithoutCancel(ctx), nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Execute read query to obtain read lock.\n\tif _, err := tx.ExecContext(ctx, `SELECT COUNT(1) FROM _litestream_seq;`); err != nil {\n\t\t_ = tx.Rollback()\n\t\treturn err\n\t}\n\n\t// Track transaction so we can release it later before checkpoint.\n\tdb.rtx = tx\n\treturn nil\n}\n\n// releaseReadLock rolls back the long-running read transaction.\nfunc (db *DB) releaseReadLock() error {\n\t// Ignore if we do not have a read lock.\n\tif db.rtx == nil {\n\t\treturn nil\n\t}\n\n\t// Rollback \u0026 clear read transaction.\n\t// Use rollback() helper to suppress \"already rolled back\" errors that can\n\t// occur during shutdown when concurrent checkpoint and close operations\n\t// both attempt to release the read lock. See issue #934.\n\terr := rollback(db.rtx)\n\tdb.rtx = nil\n\treturn err\n}\n\n// Sync copies pending data from the WAL to the shadow WAL.\nfunc (db *DB) Sync(ctx context.Context) error {\n\tfor {\n\t\tif err := ctx.Err(); err != nil {\n\t\t\treturn context.Cause(ctx)\n\t\t}\n\n\t\tresult, err := db.syncOnce(ctx, db.MaxSyncWALBytes)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t} else if !result.synced || !result.limited || result.syncedToWALEnd {\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\nfunc (db *DB) syncOnce(ctx context.Context, maxSyncWALBytes int64) (syncResult, error) {\n\tif err := db.lockExec(ctx); err != nil {\n\t\treturn syncResult{}, err\n\t}\n\tdefer db.execSem.Release(1)\n\n\treturn db.syncLocked(ctx, maxSyncWALBytes)\n}\n\nfunc (db *DB) lockExec(ctx context.Context) error {\n\tif db.execSem.TryAcquire(1) {\n\t\treturn nil\n\t}\n\tdb.beginSyncExecutorWait()\n\tdefer db.finishSyncExecutorWait()\n\n\tif err := db.execSem.Acquire(ctx, 1); err != nil {\n\t\treturn fmt.Errorf(\"wait for db sync executor: %w\", context.Cause(ctx))\n\t}\n\treturn nil\n}\n\n// addDurationToCounter records positive durations without allowing a clock\n// adjustment to panic a Prometheus counter.\nfunc addDurationToCounter(counter prometheus.Counter, d time.Duration) {\n\tif d \u003e 0 {\n\t\tcounter.Add(d.Seconds())\n\t}\n}\n\nfunc (db *DB) syncLocked(ctx context.Context, maxSyncWALBytes int64) (result syncResult, err error) {\n\tdb.beginSyncDiag(diagOpSync)\n\tdefer func() { db.finishSyncDiag(err) }()\n\n\t// Track total sync metrics.\n\tt := time.Now()\n\tdefer func() {\n\t\tdb.syncNCounter.Inc()\n\t\tif err != nil {\n\t\t\tdb.syncErrorNCounter.Inc()\n\t\t}\n\t\tif isDiskFullError(err) {\n\t\t\tdb.diskFullGauge.Set(1)\n\t\t} else {\n\t\t\tdb.diskFullGauge.Set(0)\n\t\t}\n\t\taddDurationToCounter(db.syncSecondsCounter, time.Since(t))\n\t}()\n\n\texec, err := db.newSyncExecutor(ctx)\n\tif err != nil {\n\t\treturn result, err\n\t} else if exec == nil {\n\t\tdb.Logger.Debug(\"sync: no database found\")\n\t\treturn result, nil\n\t}\n\tdefer db.applySyncExecutor(exec, true)\n\n\t// Ensure WAL has at least one frame in it.\n\tdb.setSyncDiagPhase(diagPhaseEnsureWAL, func(s *diagState) {\n\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t})\n\tif err := db.ensureWALExists(ctx); err != nil {\n\t\treturn result, fmt.Errorf(\"ensure wal exists: %w\", err)\n\t}\n\n\tdb.setSyncDiagPhase(diagPhaseVerifyAndSync, func(s *diagState) {\n\t\ts.txID = exec.pos.TXID + 1\n\t})\n\tresult, err = db.verifyAndSyncWithExecutor(ctx, false, exec, maxSyncWALBytes)\n\tif err != nil {\n\t\treturn result, err\n\t}\n\texec.applySyncResult(result)\n\n\t// Track that data was synced for time-based checkpoint decisions.\n\tif result.synced {\n\t\texec.state.syncedSinceCheckpoint = true\n\t}\n\n\t// Checkpoint checks normally wait until the WAL is fully synced, but the\n\t// emergency truncate threshold must be honored even mid catch-up:\n\t// sustained writes could otherwise keep every chunk limited and defer the\n\t// truncate checkpoint indefinitely, growing the WAL without bound.\n\tif !result.limited || result.syncedToWALEnd || db.exceedsTruncateThreshold(result.origWALSize) {\n\t\tdb.setSyncDiagPhase(diagPhaseCheckpointIfNeeded, func(s *diagState) {\n\t\t\ts.txID = exec.pos.TXID\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\t\tif err := db.checkpointIfNeeded(ctx, exec, result.origWALSize, result.newWALSize); err != nil {\n\t\t\treturn result, fmt.Errorf(\"checkpoint: %w\", err)\n\t\t}\n\t}\n\n\tdb.setSyncDiagPhase(diagPhaseUpdateMetrics, func(s *diagState) {\n\t\ts.txID = exec.pos.TXID\n\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t})\n\n\t// Compute current index and total shadow WAL size.\n\tdb.txIDGauge.Set(float64(exec.pos.TXID))\n\n\t// Update file size metrics.\n\tif fi, err := os.Stat(db.path); err == nil {\n\t\tdb.dbSizeGauge.Set(float64(fi.Size()))\n\t}\n\tdb.walSizeGauge.Set(float64(exec.state.lastSyncedWALOffset))\n\n\treturn result, nil\n}\n\nfunc (db *DB) verifyAndSync(ctx context.Context, checkpointing bool, state *syncState) (syncResult, error) {\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn syncResult{}, fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\treturn db.verifyAndSyncWithExecutor(ctx, checkpointing, \u0026syncExecutor{\n\t\tstate: *state,\n\t\tpos: pos,\n\t}, 0)\n}\n\nfunc (db *DB) verifyAndSyncWithExecutor(ctx context.Context, checkpointing bool, exec *syncExecutor, maxSyncWALBytes int64) (syncResult, error) {\n\tdb.setSyncDiagPhase(diagPhaseStatWAL, func(s *diagState) {\n\t\ts.txID = exec.pos.TXID + 1\n\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t})\n\n\t// Use the last synced WAL offset as the logical size for checkpoint decisions.\n\t// This avoids using file size which may include stale frames with old salt\n\t// values after a checkpoint. See issue #997.\n\torigWALSize := exec.state.lastSyncedWALOffset\n\tif origWALSize == 0 {\n\t\t// First sync - use file size as fallback\n\t\tvar err error\n\t\torigWALSize, err = db.walFileSize()\n\t\tif err != nil {\n\t\t\treturn syncResult{}, fmt.Errorf(\"stat wal before sync: %w\", err)\n\t\t}\n\t}\n\n\t// Verify our last sync matches the current state of the WAL.\n\t// This ensures that the last sync position of the real WAL hasn't\n\t// been overwritten by another process.\n\tdb.setSyncDiagPhase(diagPhaseVerify)\n\tinfo, err := db.verifyWithExecutor(ctx, exec)\n\tif err != nil {\n\t\treturn syncResult{}, fmt.Errorf(\"cannot verify wal state: %w\", err)\n\t}\n\n\tdb.setSyncDiagPhase(diagPhaseSyncLTX, func(s *diagState) {\n\t\ts.txID = exec.pos.TXID + 1\n\t\ts.snapshotting = info.snapshotting\n\t\ts.reason = info.reason\n\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t})\n\tresult, err := db.sync(ctx, checkpointing, exec, info, maxSyncWALBytes)\n\tif err != nil {\n\t\treturn syncResult{}, fmt.Errorf(\"sync: %w\", err)\n\t}\n\n\tresult.origWALSize = origWALSize\n\treturn result, nil\n}\n\n// checkpointIfNeeded performs a checkpoint based on configured thresholds.\n// Checks thresholds in priority order: TruncatePageN → MinCheckpointPageN → CheckpointInterval.\n//\n// TruncatePageN uses TRUNCATE mode (blocking). Others use PASSIVE mode, which\n// briefly holds the write lock to seal the WAL and can be skipped when the\n// database is busy.\n//\n// Time-based checkpoints only trigger if exec.state.syncedSinceCheckpoint is true, indicating\n// that data has been synced since the last checkpoint. This prevents creating unnecessary\n// LTX files when the only WAL data is from internal bookkeeping (like _litestream_seq\n// updates from previous checkpoints). See issue #896.\nfunc (db *DB) checkpointIfNeeded(ctx context.Context, exec *syncExecutor, origWALSize, newWALSize int64) error {\n\tif db.pageSize == 0 {\n\t\treturn nil\n\t}\n\tif !db.exceedsTruncateThreshold(exec.state.lastSyncedWALOffset) {\n\t\texec.state.truncatePassiveFailed = false\n\t}\n\n\t// Priority 1: Emergency truncate checkpoint (TRUNCATE mode, blocking)\n\t// This prevents unbounded WAL growth from long-lived read transactions.\n\tif db.exceedsTruncateThreshold(origWALSize) {\n\t\ttruncateThreshold := calcWALSize(uint32(db.pageSize), uint32(db.effectiveTruncatePageN()))\n\n\t\tif !exec.state.truncatePassiveFailed {\n\t\t\t// Try a PASSIVE checkpoint first: if it restarts the WAL and brings\n\t\t\t// the synced offset below the threshold, the blocking TRUNCATE and\n\t\t\t// its mandatory boundary snapshot are skipped.\n\t\t\tif restarted, err := db.checkpointWithExecutor(ctx, CheckpointModePassive, exec); err != nil {\n\t\t\t\tif !isSQLiteBusyError(err) {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\texec.state.truncatePassiveFailed = true\n\t\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"passive checkpoint skipped\", \"reason\", \"database busy\")\n\t\t\t} else if restarted {\n\t\t\t\texec.state.truncatePassiveFailed = false\n\t\t\t\tif !db.exceedsTruncateThreshold(exec.state.lastSyncedWALOffset) {\n\t\t\t\t\tdb.Logger.Info(\"wal restarted by passive checkpoint, skipping truncate checkpoint\",\n\t\t\t\t\t\t\"wal_size\", origWALSize,\n\t\t\t\t\t\t\"threshold\", truncateThreshold)\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t} else if exec.checkpointAttempted {\n\t\t\t\texec.state.truncatePassiveFailed = true\n\t\t\t}\n\t\t}\n\n\t\tdb.Logger.Info(\"forcing truncate checkpoint\",\n\t\t\t\"wal_size\", origWALSize,\n\t\t\t\"threshold\", truncateThreshold)\n\t\trestarted, err := db.checkpointWithExecutor(ctx, CheckpointModeTruncate, exec)\n\t\tif restarted || !db.exceedsTruncateThreshold(exec.state.lastSyncedWALOffset) {\n\t\t\texec.state.truncatePassiveFailed = false\n\t\t}\n\t\treturn err\n\t}\n\n\t// Priority 2: Regular checkpoint at min threshold (PASSIVE mode)\n\tif newWALSize \u003e= calcWALSize(uint32(db.pageSize), uint32(db.MinCheckpointPageN)) {\n\t\tif _, err := db.checkpointWithExecutor(ctx, CheckpointModePassive, exec); err != nil {\n\t\t\t// PASSIVE checkpoints can fail with SQLITE_BUSY when database is locked.\n\t\t\t// This is expected behavior and not an error - just log and continue.\n\t\t\tif isSQLiteBusyError(err) {\n\t\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"passive checkpoint skipped\", \"reason\", \"database busy\")\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Priority 3: Time-based checkpoint (PASSIVE mode)\n\t// Only trigger if there have been actual changes synced since the last\n\t// checkpoint. This prevents creating unnecessary LTX files when the only\n\t// WAL data is from internal bookkeeping (like _litestream_seq updates).\n\tif db.CheckpointInterval \u003e 0 \u0026\u0026 exec.state.syncedSinceCheckpoint {\n\t\t// Get database file modification time\n\t\tfi, err := db.f.Stat()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"stat database: %w\", err)\n\t\t}\n\n\t\t// Only checkpoint if enough time has passed and WAL has data\n\t\tif time.Since(fi.ModTime()) \u003e db.CheckpointInterval \u0026\u0026 newWALSize \u003e calcWALSize(uint32(db.pageSize), 1) {\n\t\t\tif _, err := db.checkpointWithExecutor(ctx, CheckpointModePassive, exec); err != nil {\n\t\t\t\t// PASSIVE checkpoints can fail with SQLITE_BUSY when database is locked.\n\t\t\t\t// This is expected behavior and not an error - just log and continue.\n\t\t\t\tif isSQLiteBusyError(err) {\n\t\t\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"passive checkpoint skipped\", \"reason\", \"database busy\")\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// exceedsTruncateThreshold returns true once walSize has grown past the\n// emergency truncate checkpoint threshold.\nfunc (db *DB) exceedsTruncateThreshold(walSize int64) bool {\n\ttruncatePageN := db.effectiveTruncatePageN()\n\treturn truncatePageN \u003e 0 \u0026\u0026 db.pageSize != 0 \u0026\u0026\n\t\twalSize \u003e= calcWALSize(uint32(db.pageSize), uint32(truncatePageN))\n}\n\nfunc (db *DB) effectiveTruncatePageN() int {\n\tif db.TruncatePageN == 0 {\n\t\treturn DefaultTruncatePageN\n\t}\n\treturn db.TruncatePageN\n}\n\n// isSQLiteBusyError returns true if the error is an SQLITE_BUSY error.\nfunc isSQLiteBusyError(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\t// Check for \"database is locked\" or \"SQLITE_BUSY\" in error message\n\terrStr := err.Error()\n\treturn strings.Contains(errStr, \"database is locked\") ||\n\t\tstrings.Contains(errStr, \"SQLITE_BUSY\")\n}\n\n// isDiskFullError returns true if the error indicates disk space issues.\n// This includes \"no space left on device\" (ENOSPC) and \"disk quota exceeded\" (EDQUOT).\nfunc isDiskFullError(err error) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tif errors.Is(err, ErrDiskFull) || errors.Is(err, syscall.ENOSPC) {\n\t\treturn true\n\t}\n\terrStr := strings.ToLower(err.Error())\n\treturn strings.Contains(errStr, \"no space left on device\") ||\n\t\tstrings.Contains(errStr, \"disk quota exceeded\") ||\n\t\tstrings.Contains(errStr, \"not enough space on the disk\") ||\n\t\tstrings.Contains(errStr, \"database or disk is full\") ||\n\t\tstrings.Contains(errStr, \"enospc\") ||\n\t\tstrings.Contains(errStr, \"edquot\")\n}\n\ntype ltxStagingFile interface {\n\tio.Writer\n\tSync() error\n\tClose() error\n}\n\nfunc defaultOpenLTXFile(name string, flag int, perm os.FileMode) (ltxStagingFile, error) {\n\treturn os.OpenFile(name, flag, perm)\n}\n\n// walFileSize returns the size of the WAL file in bytes.\nfunc (db *DB) walFileSize() (int64, error) {\n\tfi, err := os.Stat(db.WALPath())\n\tif os.IsNotExist(err) {\n\t\treturn 0, nil\n\t} else if err != nil {\n\t\treturn 0, err\n\t}\n\treturn fi.Size(), nil\n}\n\n// calcWALSize returns the size of the WAL for a given page size \u0026 count.\n// Casts to int64 before multiplication to prevent uint32 overflow with large page sizes.\nfunc calcWALSize(pageSize uint32, pageN uint32) int64 {\n\treturn int64(WALHeaderSize) + (int64(WALFrameHeaderSize+pageSize) * int64(pageN))\n}\n\nfunc (db *DB) bumpLitestreamSeq(ctx context.Context) error {\n\t_, err := db.db.ExecContext(ctx, `INSERT INTO _litestream_seq (id, seq) VALUES (1, 1) ON CONFLICT (id) DO UPDATE SET seq = seq + 1`)\n\treturn err\n}\n\n// ensureWALExists checks that the real WAL exists and has a header.\nfunc (db *DB) ensureWALExists(ctx context.Context) (err error) {\n\t// Exit early if WAL header exists.\n\tif fi, err := os.Stat(db.WALPath()); err == nil \u0026\u0026 fi.Size() \u003e= WALHeaderSize {\n\t\treturn nil\n\t}\n\n\t// Otherwise create transaction that updates the internal litestream table.\n\treturn db.bumpLitestreamSeq(ctx)\n}\n\n// checkDatabaseBehindReplica detects when a database has been restored to an\n// earlier state and the replica has a higher TXID. This handles issue #781.\n//\n// If detected, it clears local L0 files and fetches the latest L0 LTX file\n// from the replica to establish a baseline. The next DB.sync() will detect\n// the mismatch and trigger a snapshot at the current database state.\nfunc (db *DB) checkDatabaseBehindReplica(ctx context.Context) error {\n\t// Get database position from local L0 files\n\tdbPos, err := db.Pos()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get database position: %w\", err)\n\t}\n\n\t// Get replica position from remote\n\treplicaInfo, err := db.Replica.MaxLTXFileInfo(ctx, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"get replica position: %w\", err)\n\t} else if replicaInfo.MaxTXID == 0 {\n\t\treturn nil // No remote replica data yet\n\t}\n\n\t// Check if database is behind replica\n\tif dbPos.TXID \u003e= replicaInfo.MaxTXID {\n\t\treturn nil // Database is ahead or equal\n\t}\n\n\tdb.Logger.Info(\"detected database behind replica\",\n\t\t\"db_txid\", dbPos.TXID,\n\t\t\"replica_txid\", replicaInfo.MaxTXID)\n\n\t// Clear local L0 files\n\tl0Dir := db.LTXLevelDir(0)\n\tif err := os.RemoveAll(l0Dir); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"remove L0 directory: %w\", err)\n\t}\n\tdb.invalidatePosCache()\n\tif err := internal.MkdirAll(l0Dir, db.dirInfo); err != nil {\n\t\treturn fmt.Errorf(\"recreate L0 directory: %w\", err)\n\t}\n\n\t// Fetch latest L0 LTX file from replica\n\tminTXID, maxTXID := replicaInfo.MinTXID, replicaInfo.MaxTXID\n\treader, err := db.Replica.Client.OpenLTXFile(ctx, 0, minTXID, maxTXID, 0, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open remote L0 file: %w\", err)\n\t}\n\tdefer func() { _ = reader.Close() }()\n\n\t// Write to temp file and atomically rename\n\tlocalPath := db.LTXPath(0, minTXID, maxTXID)\n\ttmpPath := localPath + \".tmp\"\n\n\ttmpFile, err := os.Create(tmpPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create temp L0 file: %w\", err)\n\t}\n\tdefer func() { _ = os.Remove(tmpPath) }() // Clean up temp file on error\n\n\tif _, err := io.Copy(tmpFile, reader); err != nil {\n\t\t_ = tmpFile.Close()\n\t\treturn fmt.Errorf(\"copy L0 file: %w\", err)\n\t}\n\n\tif err := tmpFile.Sync(); err != nil {\n\t\t_ = tmpFile.Close()\n\t\treturn fmt.Errorf(\"sync L0 file: %w\", err)\n\t}\n\n\tif err := tmpFile.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close L0 file: %w\", err)\n\t}\n\n\t// Atomically rename temp file to final path\n\tif err := os.Rename(tmpPath, localPath); err != nil {\n\t\treturn fmt.Errorf(\"rename L0 file: %w\", err)\n\t}\n\tdb.invalidatePosCache()\n\n\tdb.Logger.Info(\"fetched latest L0 file from replica\",\n\t\t\"min_txid\", minTXID,\n\t\t\"max_txid\", maxTXID)\n\n\treturn nil\n}\n\n// verify ensures the current LTX state matches where it left off from\n// the real WAL. Check info.ok if verification was successful.\nfunc (db *DB) verify(ctx context.Context, state *syncState) (info syncInfo, err error) {\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn info, fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\treturn db.verifyWithExecutor(ctx, \u0026syncExecutor{\n\t\tstate: *state,\n\t\tpos: pos,\n\t})\n}\n\nfunc (db *DB) verifyWithExecutor(ctx context.Context, exec *syncExecutor) (info syncInfo, err error) {\n\tframeSize := int64(db.pageSize + WALFrameHeaderSize)\n\tinfo.snapshotting = true\n\n\tif exec.pos.TXID == 0 {\n\t\tinfo.offset = WALHeaderSize\n\t\treturn info, nil // first sync\n\t}\n\n\t// Determine last WAL offset we save from.\n\tltxPath := db.LTXPath(0, exec.pos.TXID, exec.pos.TXID)\n\tltxFile, err := os.Open(ltxPath)\n\tif err != nil {\n\t\treturn info, NewLTXError(\"open\", ltxPath, 0, uint64(exec.pos.TXID), uint64(exec.pos.TXID), err)\n\t}\n\tdefer func() { _ = ltxFile.Close() }()\n\n\tdec := ltx.NewDecoder(ltxFile)\n\tif err := dec.DecodeHeader(); err != nil {\n\t\t// Decode failure indicates corruption\n\t\tltxErr := NewLTXError(\"decode\", ltxPath, 0, uint64(exec.pos.TXID), uint64(exec.pos.TXID), fmt.Errorf(\"%w: %w\", ErrLTXCorrupted, err))\n\t\treturn info, ltxErr\n\t}\n\tinfo.offset = dec.Header().WALOffset + dec.Header().WALSize\n\tinfo.salt1 = dec.Header().WALSalt1\n\tinfo.salt2 = dec.Header().WALSalt2\n\tinfo.prevCommit = dec.Header().Commit\n\n\t// If LTX WAL offset is larger than real WAL then the WAL has been truncated.\n\tif fi, err := os.Stat(db.WALPath()); err != nil {\n\t\treturn info, fmt.Errorf(\"open wal file: %w\", err)\n\t} else if info.offset \u003e fi.Size() {\n\t\texec.state.truncatePassiveFailed = false\n\n\t\t// If we previously synced to the exact end of the WAL, this truncation\n\t\t// is expected (normal checkpoint behavior). Reset position and continue\n\t\t// incrementally rather than triggering a full snapshot. See issue #927.\n\t\tif exec.state.syncedToWALEnd {\n\t\t\t// Read new WAL header to get current salt values\n\t\t\thdr, err := readWALHeader(db.WALPath())\n\t\t\tif err != nil {\n\t\t\t\treturn info, fmt.Errorf(\"read wal header after expected truncation: %w\", err)\n\t\t\t}\n\n\t\t\tinfo.offset = WALHeaderSize\n\t\t\tinfo.salt1 = binary.BigEndian.Uint32(hdr[16:])\n\t\t\tinfo.salt2 = binary.BigEndian.Uint32(hdr[20:])\n\t\t\tinfo.snapshotting = false\n\t\t\tinfo.reason = \"\"\n\t\t\tinfo.clearSyncedToWALEnd = true\n\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"wal truncated after sync to end (expected checkpoint)\",\n\t\t\t\t\"new_salt1\", info.salt1,\n\t\t\t\t\"new_salt2\", info.salt2)\n\n\t\t\treturn info, nil\n\t\t}\n\n\t\tinfo.reason = \"wal truncated by another process\"\n\t\treturn info, nil\n\t}\n\n\t// Compare WAL headers. Restart from beginning of WAL if different.\n\thdr0, err := readWALHeader(db.WALPath())\n\tif err != nil {\n\t\treturn info, fmt.Errorf(\"cannot read wal header: %w\", err)\n\t}\n\tsalt1 := binary.BigEndian.Uint32(hdr0[16:])\n\tsalt2 := binary.BigEndian.Uint32(hdr0[20:])\n\tsaltMatch := salt1 == dec.Header().WALSalt1 \u0026\u0026 salt2 == dec.Header().WALSalt2\n\tif !saltMatch {\n\t\texec.state.truncatePassiveFailed = false\n\t}\n\n\t// Handle edge case where we're at WAL header (WALOffset=32, WALSize=0).\n\t// This can happen when an LTX file represents a state at the beginning of the WAL\n\t// with no frames written yet. We must check this before computing prevWALOffset\n\t// to avoid underflow (32 - 4120 = -4088).\n\t// See: https://github.com/benbjohnson/litestream/issues/900\n\tif info.offset == WALHeaderSize {\n\t\tdb.Logger.Debug(\"verify\", \"saltMatch\", saltMatch, \"atWALHeader\", true)\n\t\tif saltMatch {\n\t\t\tinfo.snapshotting = false\n\t\t\treturn info, nil\n\t\t}\n\t\tinfo.reason = \"wal header salt reset, snapshotting\"\n\t\treturn info, nil\n\t}\n\n\t// If offset is at the beginning of the first page, we can't check for previous page.\n\tprevWALOffset := info.offset - frameSize\n\tdb.Logger.Debug(\"verify\", \"saltMatch\", saltMatch, \"prevWALOffset\", prevWALOffset)\n\n\tif prevWALOffset == WALHeaderSize {\n\t\tif saltMatch { // No writes occurred since last sync, salt still matches\n\t\t\tinfo.snapshotting = false\n\t\t\treturn info, nil\n\t\t}\n\t\t// Salt has changed but we don't know if writes occurred since last sync\n\t\tinfo.reason = \"wal header salt reset, snapshotting\"\n\t\treturn info, nil\n\t} else if prevWALOffset \u003c WALHeaderSize {\n\t\treturn info, fmt.Errorf(\"prev WAL offset is less than the header size: %d\", prevWALOffset)\n\t}\n\n\t// If we can't verify the last page is in the last LTX file, then we need to snapshot.\n\tlastPageMatch, err := db.lastPageMatch(ctx, dec, prevWALOffset, frameSize)\n\tif err != nil {\n\t\treturn info, fmt.Errorf(\"last page match: %w\", err)\n\t} else if !lastPageMatch {\n\t\t// A snapshot must hold every frame not yet in the database file,\n\t\t// including those before the stale offset.\n\t\tinfo.offset = WALHeaderSize\n\t\tinfo.reason = \"last page does not exist in last ltx file, wal overwritten by another process\"\n\t\treturn info, nil\n\t}\n\n\tdb.Logger.Debug(\"verify.2\", \"lastPageMatch\", lastPageMatch)\n\n\t// Salt has changed which could indicate a FULL checkpoint.\n\t// If we have a last page match, then we can assume that the WAL has not been overwritten.\n\tif !saltMatch {\n\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"wal restarted\",\n\t\t\t\"salt1\", salt1,\n\t\t\t\"salt2\", salt2)\n\n\t\tinfo.offset = WALHeaderSize\n\t\tinfo.salt1, info.salt2 = salt1, salt2\n\n\t\tif detected, err := db.detectFullCheckpoint(ctx, [][2]uint32{{salt1, salt2}, {dec.Header().WALSalt1, dec.Header().WALSalt2}}); err != nil {\n\t\t\treturn info, fmt.Errorf(\"detect full checkpoint: %w\", err)\n\t\t} else if detected {\n\t\t\tinfo.reason = \"full or restart checkpoint detected, snapshotting\"\n\t\t} else {\n\t\t\tinfo.snapshotting = false\n\t\t}\n\n\t\treturn info, nil\n\t}\n\n\tinfo.snapshotting = false\n\n\treturn info, nil\n}\n\n// lastPageMatch checks if the last page read in the WAL exists in the last LTX file.\nfunc (db *DB) lastPageMatch(ctx context.Context, dec *ltx.Decoder, prevWALOffset, frameSize int64) (bool, error) {\n\tif prevWALOffset \u003c= WALHeaderSize {\n\t\treturn false, nil\n\t}\n\n\tframe, err := readWALFileAt(db.WALPath(), prevWALOffset, frameSize)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"cannot read last synced wal page: %w\", err)\n\t}\n\tpgno := binary.BigEndian.Uint32(frame[0:])\n\tfsalt1 := binary.BigEndian.Uint32(frame[8:])\n\tfsalt2 := binary.BigEndian.Uint32(frame[12:])\n\tdata := frame[WALFrameHeaderSize:]\n\n\tif fsalt1 != dec.Header().WALSalt1 || fsalt2 != dec.Header().WALSalt2 {\n\t\treturn false, nil\n\t}\n\n\t// Verify that the last page in the WAL exists in the last LTX file.\n\tbuf := make([]byte, dec.Header().PageSize)\n\tfor {\n\t\tvar hdr ltx.PageHeader\n\t\tif err := dec.DecodePage(\u0026hdr, buf); errors.Is(err, io.EOF) {\n\t\t\treturn false, nil // page not found in LTX file\n\t\t} else if err != nil {\n\t\t\treturn false, fmt.Errorf(\"decode ltx page: %w\", err)\n\t\t}\n\n\t\tif pgno != hdr.Pgno {\n\t\t\tcontinue // page number doesn't match\n\t\t}\n\t\tif !bytes.Equal(data, buf) {\n\t\t\tcontinue // page data doesn't match\n\t\t}\n\t\treturn true, nil // Page matches\n\t}\n}\n\n// detectFullCheckpoint attempts to detect checks if a FULL or RESTART checkpoint\n// has occurred and we may have missed some frames.\nfunc (db *DB) detectFullCheckpoint(ctx context.Context, knownSalts [][2]uint32) (bool, error) {\n\twalFile, err := os.Open(db.WALPath())\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"open wal file: %w\", err)\n\t}\n\tdefer walFile.Close()\n\n\tvar lastKnownSalt [2]uint32\n\tif len(knownSalts) \u003e 0 {\n\t\tlastKnownSalt = knownSalts[len(knownSalts)-1]\n\t}\n\n\trd, err := NewWALReader(walFile, db.Logger.With(LogKeySubsystem, LogSubsystemWALReader))\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"new wal reader: %w\", err)\n\t}\n\tm, err := rd.FrameSaltsUntil(ctx, lastKnownSalt)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"frame salts until: %w\", err)\n\t}\n\n\t// Remove known salts from the map.\n\tfor _, salt := range knownSalts {\n\t\tdelete(m, salt)\n\t}\n\n\t// If we have more than one unknown salt, then we have a FULL or RESTART checkpoint.\n\treturn len(m) \u003e= 1, nil\n}\n\ntype syncInfo struct {\n\toffset int64 // end of the previous LTX read\n\tsalt1 uint32\n\tsalt2 uint32\n\tprevCommit uint32\n\tsnapshotting bool // if true, a full snapshot is required\n\treason string // reason for snapshot\n\tclearSyncedToWALEnd bool\n}\n\ntype syncResult struct {\n\torigWALSize int64\n\tnewWALSize int64\n\tsynced bool\n\tlimited bool\n\tsyncedToWALEnd bool\n\tpos *ltx.Pos\n\tl0FileInfo *ltx.FileInfo\n}\n\nfunc (db *DB) applySyncResult(state *syncState, result syncResult) {\n\tstate.lastSyncedWALOffset = result.newWALSize\n\tstate.syncedToWALEnd = result.syncedToWALEnd\n\tif result.pos != nil {\n\t\tdb.pos.Lock()\n\t\tdb.pos.value = result.pos\n\t\tdb.pos.Unlock()\n\t}\n\tif result.l0FileInfo != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdb.maxLTXFileInfos.m[0] = result.l0FileInfo\n\t\tdb.maxLTXFileInfos.Unlock()\n\t}\n}\n\nfunc (db *DB) newSyncExecutor(ctx context.Context) (*syncExecutor, error) {\n\tdb.mu.Lock()\n\tdefer db.mu.Unlock()\n\n\tif err := db.init(ctx); err != nil {\n\t\treturn nil, err\n\t} else if db.db == nil {\n\t\treturn nil, nil\n\t}\n\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\treturn \u0026syncExecutor{\n\t\tstate: db.syncState,\n\t\tpos: pos,\n\t}, nil\n}\n\nfunc (db *DB) applySyncExecutor(exec *syncExecutor, notify bool) {\n\tif exec == nil {\n\t\treturn\n\t}\n\n\t// Only publish the position if this executor advanced it. Republishing\n\t// the snapshot taken at executor start would clobber concurrent cache\n\t// invalidation (e.g. ResetLocalState) with a stale position.\n\tif exec.posChanged {\n\t\tdb.pos.Lock()\n\t\tpos := exec.pos\n\t\tdb.pos.value = \u0026pos\n\t\tdb.pos.Unlock()\n\t}\n\n\tif exec.l0FileInfo != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tinfo := *exec.l0FileInfo\n\t\tdb.maxLTXFileInfos.m[0] = \u0026info\n\t\tdb.maxLTXFileInfos.Unlock()\n\t}\n\n\tdb.mu.Lock()\n\tdb.syncState = exec.state\n\tif notify \u0026\u0026 exec.synced {\n\t\tclose(db.notify)\n\t\tdb.notify = make(chan struct{})\n\t}\n\tdb.mu.Unlock()\n}\n\nfunc (exec *syncExecutor) applySyncResult(result syncResult) {\n\texec.state.lastSyncedWALOffset = result.newWALSize\n\texec.state.syncedToWALEnd = result.syncedToWALEnd\n\tif result.pos != nil {\n\t\texec.pos = *result.pos\n\t\texec.posChanged = true\n\t}\n\tif result.l0FileInfo != nil {\n\t\tinfo := *result.l0FileInfo\n\t\texec.l0FileInfo = \u0026info\n\t}\n\texec.synced = exec.synced || result.synced\n}\n\n// sync copies pending bytes from the real WAL to LTX.\n// Returns synced=true if an LTX file was created (i.e., there were new pages to sync).\nfunc (db *DB) sync(ctx context.Context, checkpointing bool, exec *syncExecutor, info syncInfo, maxSyncWALBytes int64) (result syncResult, err error) {\n\tresult.newWALSize = exec.state.lastSyncedWALOffset\n\tresult.syncedToWALEnd = exec.state.syncedToWALEnd\n\tif info.clearSyncedToWALEnd {\n\t\tresult.syncedToWALEnd = false\n\t}\n\n\t// Determine the next sequential transaction ID.\n\ttxID := exec.pos.TXID + 1\n\tdb.setSyncDiagPhase(diagPhaseSyncOpenLTX,\n\t\tfunc(s *diagState) {\n\t\t\ts.txID = txID\n\t\t\ts.snapshotting = info.snapshotting\n\t\t\ts.reason = info.reason\n\t\t})\n\n\tfilename := db.LTXPath(0, txID, txID)\n\n\tlogArgs := []any{\n\t\t\"txid\", txID.String(),\n\t\t\"offset\", info.offset,\n\t}\n\tif checkpointing {\n\t\tlogArgs = append(logArgs, \"chkpt\", \"true\")\n\t}\n\tif info.snapshotting {\n\t\tlogArgs = append(logArgs, \"snap\", \"true\")\n\t}\n\tif info.reason != \"\" {\n\t\tlogArgs = append(logArgs, \"reason\", info.reason)\n\t}\n\tdb.Logger.Debug(\"sync\", logArgs...)\n\n\t// Prevent internal checkpoints during sync. Ignore if already in a checkpoint.\n\tif !checkpointing {\n\t\tdb.chkMu.RLock()\n\t\tdefer db.chkMu.RUnlock()\n\t}\n\n\tfi, err := db.f.Stat()\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tmode := fi.Mode()\n\tcommit := uint32(fi.Size() / int64(db.pageSize))\n\n\twalFile, err := os.Open(db.WALPath())\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer walFile.Close()\n\n\twalReaderLogger := db.Logger.With(LogKeySubsystem, LogSubsystemWALReader)\n\tvar rd *WALReader\n\tif info.offset == WALHeaderSize {\n\t\tif rd, err = NewWALReader(walFile, walReaderLogger); err != nil {\n\t\t\treturn result, fmt.Errorf(\"new wal reader: %w\", err)\n\t\t}\n\t} else {\n\t\t// If we cannot verify the previous frame\n\t\tvar pfmError *PrevFrameMismatchError\n\t\tif rd, err = NewWALReaderWithOffset(ctx, walFile, info.offset, info.salt1, info.salt2, walReaderLogger); errors.As(err, \u0026pfmError) {\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"prev frame mismatch, snapshotting\", \"err\", pfmError.Err)\n\t\t\tinfo.offset = WALHeaderSize\n\t\t\tif rd, err = NewWALReader(walFile, walReaderLogger); err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"new wal reader, after reset\")\n\t\t\t}\n\t\t} else if err != nil {\n\t\t\treturn result, fmt.Errorf(\"new wal reader with offset: %w\", err)\n\t\t}\n\t}\n\n\t// Build a mapping of changed page numbers and their latest content.\n\tdb.setSyncDiagPhase(diagPhaseSyncPageMap,\n\t\tfunc(s *diagState) {\n\t\t\ts.txID = txID\n\t\t\ts.snapshotting = info.snapshotting\n\t\t\ts.reason = info.reason\n\t\t})\n\tif info.snapshotting {\n\t\tmaxSyncWALBytes = 0\n\t}\n\tpageMap, maxOffset, walCommit, limited, err := rd.pageMap(ctx, maxSyncWALBytes)\n\tif err != nil {\n\t\treturn result, fmt.Errorf(\"page map: %w\", err)\n\t}\n\tresult.limited = limited\n\tif walCommit \u003e 0 {\n\t\tcommit = walCommit\n\t}\n\tvar sz int64\n\tif maxOffset \u003e 0 {\n\t\tsz = maxOffset - info.offset\n\t}\n\tassert(sz \u003e= 0, fmt.Sprintf(\"wal size must be positive: sz=%d, maxOffset=%d, info.offset=%d\", sz, maxOffset, info.offset))\n\tdb.setSyncDiagPhase(diagPhaseSyncPrepareLTX,\n\t\tfunc(s *diagState) {\n\t\t\ts.txID = txID\n\t\t\ts.walSize = sz\n\t\t\ts.snapshotting = info.snapshotting\n\t\t\ts.reason = info.reason\n\t\t})\n\n\t// Track total WAL bytes synced.\n\tif sz \u003e 0 {\n\t\tdb.totalWALBytesCounter.Add(float64(sz))\n\t}\n\n\t// Exit if we have no new WAL pages and we aren't snapshotting.\n\tif !info.snapshotting \u0026\u0026 sz == 0 {\n\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"sync: skip\", \"reason\", \"no new wal pages\")\n\t\treturn result, nil\n\t}\n\n\ttmpFilename := filename + \".tmp\"\n\tif err := internal.MkdirAll(filepath.Dir(tmpFilename), db.dirInfo); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-mkdir\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, err\n\t}\n\n\tltxFile, err := db.openLTXFile(tmpFilename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode)\n\tif err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-open\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"open temp ltx file: %w\", err)\n\t}\n\tdefer func() { _ = os.Remove(tmpFilename) }()\n\tdefer func() { _ = ltxFile.Close() }()\n\n\tuid, gid := internal.Fileinfo(db.fileInfo)\n\t_ = os.Chown(tmpFilename, uid, gid)\n\n\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode header\",\n\t\t\"txid\", txID.String(),\n\t\t\"commit\", commit,\n\t\t\"walOffset\", info.offset,\n\t\t\"walSize\", sz,\n\t\t\"salt1\", rd.salt1,\n\t\t\"salt2\", rd.salt2)\n\n\ttimestamp := time.Now()\n\tenc, err := ltx.NewEncoder(ltxFile)\n\tif err != nil {\n\t\treturn result, fmt.Errorf(\"new ltx encoder: %w\", err)\n\t}\n\tif err := enc.EncodeHeader(ltx.Header{\n\t\tVersion: ltx.Version,\n\t\tFlags: ltx.HeaderFlagNoChecksum,\n\t\tPageSize: uint32(db.pageSize),\n\t\tCommit: commit,\n\t\tMinTXID: txID,\n\t\tMaxTXID: txID,\n\t\tTimestamp: timestamp.UnixMilli(),\n\t\tWALOffset: info.offset,\n\t\tWALSize: sz,\n\t\tWALSalt1: rd.salt1,\n\t\tWALSalt2: rd.salt2,\n\t}); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-write\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"encode ltx header: %w\", err)\n\t}\n\n\t// If we need a full snapshot, then copy from the database \u0026 WAL.\n\t// Otherwise, just copy incrementally from the WAL.\n\tif info.snapshotting {\n\t\tdb.setSyncDiagPhase(diagPhaseWriteLTXFromDB,\n\t\t\tfunc(s *diagState) {\n\t\t\t\ts.txID = txID\n\t\t\t\ts.walSize = sz\n\t\t\t\ts.snapshotting = true\n\t\t\t\ts.reason = info.reason\n\t\t\t})\n\t\tif err := db.writeLTXFromDB(ctx, enc, walFile, commit, pageMap); err != nil {\n\t\t\tif isDiskFullError(err) {\n\t\t\t\treturn result, NewLTXError(\"stage-write\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t\t}\n\t\t\treturn result, fmt.Errorf(\"write ltx from db: %w\", err)\n\t\t}\n\t} else {\n\t\tdb.setSyncDiagPhase(diagPhaseWriteLTXFromWAL,\n\t\t\tfunc(s *diagState) {\n\t\t\t\ts.txID = txID\n\t\t\t\ts.walSize = sz\n\t\t\t\ts.snapshotting = false\n\t\t\t\ts.reason = info.reason\n\t\t\t})\n\t\tif err := db.writeLTXFromWAL(ctx, enc, walFile, info.prevCommit, commit, pageMap); err != nil {\n\t\t\tif isDiskFullError(err) {\n\t\t\t\treturn result, NewLTXError(\"stage-write\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t\t}\n\t\t\treturn result, fmt.Errorf(\"write ltx from wal: %w\", err)\n\t\t}\n\t}\n\n\t// Encode final trailer to the end of the LTX file.\n\tdb.setSyncDiagPhase(diagPhaseCloseLTX, func(s *diagState) {\n\t\ts.txID = txID\n\t\ts.walSize = sz\n\t})\n\tif err := enc.Close(); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-write\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"close ltx encoder: %w\", err)\n\t}\n\n\t// Sync \u0026 close LTX file.\n\tdb.setSyncDiagPhase(diagPhaseFsyncLTX, func(s *diagState) {\n\t\ts.txID = txID\n\t\ts.walSize = sz\n\t})\n\tif err := ltxFile.Sync(); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-sync\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"sync ltx file: %w\", err)\n\t}\n\tif err := ltxFile.Close(); err != nil {\n\t\tif isDiskFullError(err) {\n\t\t\treturn result, NewLTXError(\"stage-close\", tmpFilename, 0, uint64(txID), uint64(txID), fmt.Errorf(\"%w: %w\", ErrDiskFull, err))\n\t\t}\n\t\treturn result, fmt.Errorf(\"close ltx file: %w\", err)\n\t}\n\n\t// Atomically rename file to final path.\n\tdb.setSyncDiagPhase(diagPhaseRenameLTX, func(s *diagState) {\n\t\ts.txID = txID\n\t\ts.walSize = sz\n\t})\n\tif err := os.Rename(tmpFilename, filename); err != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdelete(db.maxLTXFileInfos.m, 0) // clear cache if in unknown state\n\t\tdb.maxLTXFileInfos.Unlock()\n\t\tdb.invalidatePosCache()\n\t\treturn result, fmt.Errorf(\"rename ltx file: %w\", err)\n\t}\n\tif err := internal.FsyncDir(filepath.Dir(filename)); err != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tdelete(db.maxLTXFileInfos.m, 0) // clear cache if in unknown state\n\t\tdb.maxLTXFileInfos.Unlock()\n\t\tdb.invalidatePosCache()\n\t\treturn result, fmt.Errorf(\"sync ltx dir: %w\", err)\n\t}\n\n\tresult.synced = true\n\tresult.l0FileInfo = \u0026ltx.FileInfo{\n\t\tLevel: 0,\n\t\tMinTXID: txID,\n\t\tMaxTXID: txID,\n\t\tCreatedAt: time.Now(),\n\t\tSize: enc.N(),\n\t}\n\n\tencPos := enc.PostApplyPos()\n\tresult.pos = \u0026encPos\n\n\t// Track the logical end of WAL content for checkpoint decisions.\n\t// This is the WALOffset + WALSize from the LTX we just created.\n\t// Using this instead of file size prevents issue #997 where stale\n\t// frames with old salt values cause perpetual checkpoint triggering.\n\tfinalOffset := info.offset + sz\n\tresult.newWALSize = finalOffset\n\n\t// Track if we synced to the exact end of the WAL file.\n\t// This is used by verify() to distinguish expected checkpoint truncation\n\t// from unexpected external WAL modifications. See issue #927.\n\tif walSize, err := db.walFileSize(); err == nil {\n\t\tresult.syncedToWALEnd = finalOffset == walSize\n\t} else {\n\t\tresult.syncedToWALEnd = false\n\t}\n\tdb.setSyncDiagPhase(diagPhaseSyncComplete,\n\t\tfunc(s *diagState) {\n\t\t\ts.txID = txID\n\t\t\ts.walSize = sz\n\t\t\ts.lastSyncedWALOffset = finalOffset\n\t\t\ts.snapshotting = info.snapshotting\n\t\t\ts.reason = info.reason\n\t\t})\n\n\tdb.Logger.Debug(\"db sync\", \"status\", \"ok\")\n\n\treturn result, nil\n}\n\nfunc (db *DB) writeLTXFromDB(ctx context.Context, enc *ltx.Encoder, walFile *os.File, commit uint32, pageMap map[uint32]int64) error {\n\tlockPgno := ltx.LockPgno(uint32(db.pageSize))\n\tdata := make([]byte, db.pageSize)\n\n\tfor pgno := uint32(1); pgno \u003c= commit; pgno++ {\n\t\tif pgno == lockPgno {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check if the caller has canceled during processing.\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn context.Cause(ctx)\n\t\tdefault:\n\t\t}\n\n\t\t// If page exists in the WAL, read from there.\n\t\tif offset, ok := pageMap[pgno]; ok {\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode page from wal\", \"txid\", enc.Header().MinTXID, \"offset\", offset, \"pgno\", pgno, \"type\", \"db+wal\")\n\n\t\t\tif n, err := walFile.ReadAt(data, offset+WALFrameHeaderSize); err != nil {\n\t\t\t\treturn fmt.Errorf(\"read page %d @ %d: %w\", pgno, offset, err)\n\t\t\t} else if n != len(data) {\n\t\t\t\treturn fmt.Errorf(\"short read page %d @ %d\", pgno, offset)\n\t\t\t}\n\n\t\t\tif err := enc.EncodePage(ltx.PageHeader{Pgno: pgno}, data); err != nil {\n\t\t\t\treturn fmt.Errorf(\"encode ltx frame (pgno=%d): %w\", pgno, err)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\toffset := int64(pgno-1) * int64(db.pageSize)\n\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode page from database\", \"offset\", offset, \"pgno\", pgno)\n\n\t\t// Otherwise read directly from the database file.\n\t\tif _, err := db.f.ReadAt(data, offset); err != nil {\n\t\t\treturn fmt.Errorf(\"read database page %d: %w\", pgno, err)\n\t\t}\n\t\tif err := enc.EncodePage(ltx.PageHeader{Pgno: pgno}, data); err != nil {\n\t\t\treturn fmt.Errorf(\"encode ltx frame (pgno=%d): %w\", pgno, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (db *DB) writeLTXFromWAL(ctx context.Context, enc *ltx.Encoder, walFile *os.File, prevCommit, commit uint32, pageMap map[uint32]int64) error {\n\t// Create an ordered list of page numbers since the LTX encoder requires it.\n\tpgnos := make([]uint32, 0, len(pageMap))\n\tfor pgno := range pageMap {\n\t\tpgnos = append(pgnos, pgno)\n\t}\n\tlockPgno := ltx.LockPgno(uint32(db.pageSize))\n\tif commit \u003e prevCommit {\n\t\twalPgnoN := len(pgnos)\n\t\tfor pgno := prevCommit + 1; pgno \u003c= commit; pgno++ {\n\t\t\tif pgno == lockPgno {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, ok := pageMap[pgno]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tpgnos = append(pgnos, pgno)\n\t\t}\n\t\tif growthPgnoN := len(pgnos) - walPgnoN; growthPgnoN \u003e 0 {\n\t\t\tdb.Logger.Debug(\"filling wal growth pages from database\",\n\t\t\t\t\"txid\", enc.Header().MinTXID,\n\t\t\t\t\"n\", growthPgnoN,\n\t\t\t\t\"prev_commit\", prevCommit,\n\t\t\t\t\"commit\", commit)\n\t\t}\n\t}\n\tslices.Sort(pgnos)\n\n\tdata := make([]byte, db.pageSize)\n\tfor _, pgno := range pgnos {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn context.Cause(ctx)\n\t\tdefault:\n\t\t}\n\t\tif offset, ok := pageMap[pgno]; ok {\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode page from wal\", \"txid\", enc.Header().MinTXID, \"offset\", offset, \"pgno\", pgno, \"type\", \"walonly\")\n\n\t\t\tif n, err := walFile.ReadAt(data, offset+WALFrameHeaderSize); err != nil {\n\t\t\t\treturn fmt.Errorf(\"read page %d @ %d: %w\", pgno, offset, err)\n\t\t\t} else if n != len(data) {\n\t\t\t\treturn fmt.Errorf(\"short read page %d @ %d\", pgno, offset)\n\t\t\t}\n\t\t} else {\n\t\t\toffset := int64(pgno-1) * int64(db.pageSize)\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"encode page from database\", \"txid\", enc.Header().MinTXID, \"offset\", offset, \"pgno\", pgno, \"type\", \"walgrowth\")\n\n\t\t\tif _, err := db.f.ReadAt(data, offset); err != nil {\n\t\t\t\treturn fmt.Errorf(\"read database page %d: %w\", pgno, err)\n\t\t\t}\n\t\t}\n\n\t\tif err := enc.EncodePage(ltx.PageHeader{Pgno: pgno}, data); err != nil {\n\t\t\treturn fmt.Errorf(\"encode ltx frame (pgno=%d): %w\", pgno, err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// Checkpoint performs a checkpoint on the WAL file.\nfunc (db *DB) Checkpoint(ctx context.Context, mode string) (err error) {\n\tif err := db.lockExec(ctx); err != nil {\n\t\treturn err\n\t}\n\tdefer db.execSem.Release(1)\n\tdb.beginSyncDiag(diagOpCheckpoint)\n\tdefer func() { db.finishSyncDiag(err) }()\n\n\texec, err := db.newSyncExecutor(ctx)\n\tif err != nil {\n\t\treturn err\n\t} else if exec == nil {\n\t\treturn nil\n\t}\n\tdefer db.applySyncExecutor(exec, true)\n\n\t_, err = db.checkpointWithExecutor(ctx, mode, exec)\n\treturn err\n}\n\n// checkpoint performs a checkpoint on the WAL file and initializes a\n// new shadow WAL file.\nfunc (db *DB) checkpoint(ctx context.Context, mode string, state *syncState) error {\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\texec := \u0026syncExecutor{\n\t\tstate: *state,\n\t\tpos: pos,\n\t}\n\tif _, err := db.checkpointWithExecutor(ctx, mode, exec); err != nil {\n\t\treturn err\n\t}\n\n\t*state = exec.state\n\tdb.pos.Lock()\n\tpos = exec.pos\n\tdb.pos.value = \u0026pos\n\tdb.pos.Unlock()\n\tif exec.l0FileInfo != nil {\n\t\tdb.maxLTXFileInfos.Lock()\n\t\tinfo := *exec.l0FileInfo\n\t\tdb.maxLTXFileInfos.m[0] = \u0026info\n\t\tdb.maxLTXFileInfos.Unlock()\n\t}\n\treturn nil\n}\n\n// checkpointWithExecutor performs a checkpoint in the given mode and reports\n// whether the checkpoint restarted the WAL. It returns false without\n// checkpointing when the checkpoint lock is held by an in-progress snapshot.\nfunc (db *DB) checkpointWithExecutor(ctx context.Context, mode string, exec *syncExecutor) (walRestarted bool, err error) {\n\texec.checkpointAttempted = false\n\tdb.setSyncDiagPhase(diagPhaseCheckpointLock,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\t// Try getting a checkpoint lock, will fail during snapshots. Skipping is\n\t// safe since the next sync retries.\n\tif !db.chkMu.TryLock() {\n\t\tif mode == CheckpointModeTruncate {\n\t\t\tdb.Logger.Info(\"checkpoint skipped, snapshot in progress\", \"mode\", mode)\n\t\t} else {\n\t\t\tdb.Logger.Log(ctx, internal.LevelTrace, \"checkpoint skipped, snapshot in progress\", \"mode\", mode)\n\t\t}\n\t\treturn false, nil\n\t}\n\tdefer db.chkMu.Unlock()\n\texec.checkpointAttempted = true\n\n\t// Read WAL header before checkpoint to check if it has been restarted.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointReadWALHeader,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\thdr, err := readWALHeader(db.WALPath())\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\t// Copy end of WAL before checkpoint to copy as much as possible.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointCopyBefore,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\tresult, err := db.verifyAndSyncWithExecutor(ctx, true, exec, 0)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"cannot copy wal before checkpoint: %w\", err)\n\t}\n\texec.applySyncResult(result)\n\n\tvar barrierTx *sql.Tx\n\tif mode == CheckpointModePassive {\n\t\tbarrierTx, err = db.db.BeginTx(ctx, nil)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"begin passive checkpoint barrier: %w\", err)\n\t\t}\n\t\tdefer func() {\n\t\t\tif barrierTx != nil {\n\t\t\t\t_ = rollback(barrierTx)\n\t\t\t}\n\t\t}()\n\n\t\tif _, err := barrierTx.ExecContext(ctx, `INSERT INTO _litestream_lock (id) VALUES (1);`); err != nil {\n\t\t\treturn false, fmt.Errorf(\"_litestream_lock: %w\", err)\n\t\t}\n\n\t\tresult, err = db.verifyAndSyncWithExecutor(ctx, true, exec, 0)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"cannot seal wal before passive checkpoint: %w\", err)\n\t\t}\n\t\texec.applySyncResult(result)\n\t}\n\n\tframeSize := int64(db.pageSize + WALFrameHeaderSize)\n\tpreCheckpointFrameN := 0\n\tif exec.state.lastSyncedWALOffset \u003e WALHeaderSize {\n\t\tpreCheckpointFrameN = int((exec.state.lastSyncedWALOffset - WALHeaderSize) / frameSize)\n\t}\n\n\t// Execute checkpoint and immediately issue a write to the WAL to ensure\n\t// a new page is written.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointExec,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\twalFrameN, err := db.execCheckpoint(ctx, mode)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tif barrierTx != nil {\n\t\tif err = rollback(barrierTx); err != nil {\n\t\t\treturn false, fmt.Errorf(\"rollback passive checkpoint barrier: %w\", err)\n\t\t}\n\t\tbarrierTx = nil\n\t}\n\n\tif err = db.bumpLitestreamSeq(ctx); err != nil {\n\t\treturn false, fmt.Errorf(\"bump litestream seq: %w\", err)\n\t}\n\n\t// If WAL hasn't been restarted, exit.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointVerifyRestart,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\tother, err := readWALHeader(db.WALPath())\n\tif err != nil {\n\t\treturn false, err\n\t} else if bytes.Equal(hdr, other) {\n\t\texec.state.syncedSinceCheckpoint = false\n\t\treturn false, nil\n\t}\n\texec.state.truncatePassiveFailed = false\n\n\tif mode == CheckpointModePassive {\n\t\tresult, err = db.verifyAndSyncWithExecutor(ctx, true, exec, 0)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"cannot copy wal after passive checkpoint: %w\", err)\n\t\t}\n\t\texec.applySyncResult(result)\n\t\texec.state.syncedSinceCheckpoint = false\n\t\treturn true, nil\n\t}\n\n\t// A successful TRUNCATE checkpoint always reports zero frames because\n\t// the WAL is reset before the counters are read, so the comparison\n\t// below can never prove that no commits landed between the sealed\n\t// sync and the checkpoint taking the writer lock. Those commits are\n\t// backfilled and truncated unseen, so TRUNCATE must take the boundary\n\t// snapshot unconditionally.\n\tif mode != CheckpointModeTruncate \u0026\u0026 walFrameN \u003c= preCheckpointFrameN {\n\t\tresult, err = db.verifyAndSyncWithExecutor(ctx, true, exec, 0)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"cannot copy wal after checkpoint: %w\", err)\n\t\t}\n\t\texec.applySyncResult(result)\n\t\texec.state.syncedSinceCheckpoint = false\n\t\treturn true, nil\n\t}\n\n\t// Start a transaction. This will be promoted immediately after.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointSnapshotBoundaryLock,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\ttx, err := db.db.BeginTx(ctx, nil)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"begin: %w\", err)\n\t}\n\tdefer func() { _ = rollback(tx) }()\n\n\t// Insert into the lock table to promote to a write tx. The lock table\n\t// insert will never actually occur because our tx will be rolled back,\n\t// however, it will ensure our tx grabs the write lock. Unfortunately,\n\t// we can't call \"BEGIN IMMEDIATE\" as we are already in a transaction.\n\tif _, err := tx.ExecContext(ctx, `INSERT INTO _litestream_lock (id) VALUES (1);`); err != nil {\n\t\treturn false, fmt.Errorf(\"_litestream_lock: %w\", err)\n\t}\n\n\t// Copy anything that may have occurred after the checkpoint.\n\tdb.setSyncDiagPhase(diagPhaseCheckpointSnapshotBoundary,\n\t\tfunc(s *diagState) {\n\t\t\ts.checkpointMode = mode\n\t\t\ts.lastSyncedWALOffset = exec.state.lastSyncedWALOffset\n\t\t})\n\tsnapshotInfo := syncInfo{\n\t\toffset: WALHeaderSize,\n\t\tsalt1: binary.BigEndian.Uint32(other[16:]),\n\t\tsalt2: binary.BigEndian.Uint32(other[20:]),\n\t\tsnapshotting: true,\n\t\treason: \"checkpoint boundary snapshot\",\n\t}\n\tresult, err = db.sync(ctx, true, exec, snapshotInfo, 0)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"cannot snapshot after checkpoint: %w\", err)\n\t}\n\texec.applySyncResult(result)\n\n\t// Release write lock before exiting.\n\t// Use rollback() helper for consistency with releaseReadLock() and the\n\t// defer above. See issue #934.\n\tif err := rollback(tx); err != nil {\n\t\treturn false, fmt.Errorf(\"rollback post-checkpoint tx: %w\", err)\n\t}\n\n\texec.state.syncedSinceCheckpoint = false\n\treturn true, nil\n}\n\n// execCheckpoint issues a wal_checkpoint PRAGMA in the given mode and returns\n// the number of frames in the WAL as reported by the checkpoint.\nfunc (db *DB) execCheckpoint(ctx context.Context, mode string) (walFrameN int, err error) {\n\t// Ignore if there is no underlying database.\n\tif db.db == nil {\n\t\treturn 0, nil\n\t}\n\n\t// Track checkpoint metrics.\n\tt := time.Now()\n\tdefer func() {\n\t\tlabels := prometheus.Labels{\"mode\": mode}\n\t\tdb.checkpointNCounterVec.With(labels).Inc()\n\t\tif err != nil {\n\t\t\tdb.checkpointErrorNCounterVec.With(labels).Inc()\n\t\t}\n\t\taddDurationToCounter(db.checkpointSecondsCounterVec.With(labels), time.Since(t))\n\t}()\n\n\t// Ensure the read lock has been removed before issuing a checkpoint.\n\t// We defer the re-acquire to ensure it occurs even on an early return.\n\tif err := db.releaseReadLock(); err != nil {\n\t\treturn 0, fmt.Errorf(\"release read lock: %w\", err)\n\t}\n\tdefer func() { _ = db.acquireReadLock(ctx) }()\n\n\t// A non-forced checkpoint is issued as \"PASSIVE\". This will only checkpoint\n\t// if there are not pending transactions. A forced checkpoint (\"RESTART\")\n\t// will wait for pending transactions to end \u0026 block new transactions before\n\t// forcing the checkpoint and restarting the WAL.\n\t//\n\t// See: https://www.sqlite.org/pragma.html#pragma_wal_checkpoint\n\trawsql := `PRAGMA wal_checkpoint(` + mode + `);`\n\n\tvar row [3]int\n\tif err := db.db.QueryRowContext(ctx, rawsql).Scan(\u0026row[0], \u0026row[1], \u0026row[2]); err != nil {\n\t\treturn 0, err\n\t}\n\tdb.Logger.Debug(\"checkpoint\", \"mode\", mode, \"result\", fmt.Sprintf(\"%d,%d,%d\", row[0], row[1], row[2]))\n\n\t// Reacquire the read lock immediately after the checkpoint.\n\tif err := db.acquireReadLock(ctx); err != nil {\n\t\treturn 0, fmt.Errorf(\"reacquire read lock: %w\", err)\n\t}\n\n\treturn row[1], nil\n}\n\ntype snapshotReadPosition struct {\n\tpos ltx.Pos\n\tpageSize int\n\twalEndOffset int64\n\tdb *DB\n\tcloseOnce sync.Once\n}\n\nfunc (p *snapshotReadPosition) close() {\n\tp.closeOnce.Do(func() { p.db.chkMu.RUnlock() })\n}\n\ntype snapshotReadCloser struct {\n\t*io.PipeReader\n\tpos *snapshotReadPosition\n}\n\nfunc (r *snapshotReadCloser) Close() error {\n\tdefer r.pos.close()\n\treturn r.PipeReader.Close()\n}\n\n// SnapshotReader returns the current position of the database \u0026 a reader that contains a full database snapshot.\n// Internal checkpoints remain disabled until the reader reaches EOF or is\n// closed. Callers must close readers they do not fully consume; abandoning a\n// reader blocks checkpoints indefinitely.\nfunc (db *DB) SnapshotReader(ctx context.Context) (ltx.Pos, io.ReadCloser, error) {\n\tpos, err := db.snapshotPosition(ctx)\n\tif err != nil {\n\t\treturn ltx.Pos{}, nil, err\n\t}\n\n\tr, err := db.snapshotReader(ctx, pos)\n\tif err != nil {\n\t\tpos.close()\n\t\treturn pos.pos, nil, err\n\t}\n\treturn pos.pos, r, nil\n}\n\nfunc (db *DB) snapshotPosition(ctx context.Context) (*snapshotReadPosition, error) {\n\tif err := db.lockExec(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\tdefer db.execSem.Release(1)\n\n\tpageSize := db.PageSize()\n\tpos, err := db.Pos()\n\n\tif pageSize == 0 {\n\t\tdb.Logger.Debug(\"page size not initialized yet\", \"pageSize\", 0)\n\t\treturn nil, \u0026DBNotReadyError{Reason: \"page size not initialized\"}\n\t}\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"pos: %w\", err)\n\t}\n\n\twalEndOffset, err := db.snapshotWALEndOffset(pos)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif walEndOffset \u003c WALHeaderSize {\n\t\twalEndOffset = WALHeaderSize\n\t}\n\n\t// Acquire the checkpoint read lock while the executor semaphore is still\n\t// held (the deferred release runs after this function returns). Every\n\t// checkpoint takes chkMu under execSem, so this handoff guarantees no\n\t// checkpoint can run between capturing pos and locking chkMu — the\n\t// snapshot always matches the advertised position.\n\tdb.chkMu.RLock()\n\treturn \u0026snapshotReadPosition{\n\t\tpos: pos,\n\t\tpageSize: pageSize,\n\t\twalEndOffset: walEndOffset,\n\t\tdb: db,\n\t}, nil\n}\n\n// snapshotWALEndOffset returns the WAL offset a snapshot may read up to for\n// the given position. db.syncState is read without db.mu because every writer\n// mutates it while holding execSem, which the caller also holds.\nfunc (db *DB) snapshotWALEndOffset(pos ltx.Pos) (int64, error) {\n\tif db.syncState.lastSyncedWALOffset \u003e 0 {\n\t\treturn db.syncState.lastSyncedWALOffset, nil\n\t}\n\tif pos.TXID == 0 {\n\t\treturn WALHeaderSize, nil\n\t}\n\n\tltxPath := db.LTXPath(0, pos.TXID, pos.TXID)\n\tf, err := os.Open(ltxPath)\n\tif err != nil {\n\t\treturn 0, NewLTXError(\"open\", ltxPath, 0, uint64(pos.TXID), uint64(pos.TXID), err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tdec := ltx.NewDecoder(f)\n\tif err := dec.DecodeHeader(); err != nil {\n\t\treturn 0, NewLTXError(\"decode\", ltxPath, 0, uint64(pos.TXID), uint64(pos.TXID), fmt.Errorf(\"%w: %w\", ErrLTXCorrupted, err))\n\t}\n\n\t// Compare WAL headers. If the WAL was restarted since this LTX file was\n\t// written, its salts no longer match and its recorded extent does not\n\t// apply to the current WAL.\n\thdr, err := readWALHeader(db.WALPath())\n\tif os.IsNotExist(err) || errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) {\n\t\treturn WALHeaderSize, nil\n\t} else if err != nil {\n\t\treturn 0, fmt.Errorf(\"cannot read wal header: %w\", err)\n\t}\n\tsalt1 := binary.BigEndian.Uint32(hdr[16:])\n\tsalt2 := binary.BigEndian.Uint32(hdr[20:])\n\tif salt1 != dec.Header().WALSalt1 || salt2 != dec.Header().WALSalt2 {\n\t\treturn WALHeaderSize, nil\n\t}\n\n\treturn dec.Header().WALOffset + dec.Header().WALSize, nil\n}\n\nfunc (db *DB) snapshotReader(ctx context.Context, pos *snapshotReadPosition) (io.ReadCloser, error) {\n\tdb.Logger.Debug(\"snapshot\", \"txid\", pos.pos.TXID.String(), \"walEndOffset\", pos.walEndOffset)\n\n\t// TODO(ltx): Read database size from database header.\n\n\tfi, err := db.f.Stat()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcommit := uint32(fi.Size() / int64(pos.pageSize))\n\n\t// Execute encoding in a separate goroutine so the caller can initialize before reading.\n\tpr, pw := io.Pipe()\n\tgo func() {\n\t\tdefer pos.close()\n\n\t\twalFile, err := os.Open(db.WALPath())\n\t\tif err != nil {\n\t\t\tpw.CloseWithError(err)\n\t\t\treturn\n\t\t}\n\t\tdefer walFile.Close()\n\n\t\trd, err := NewWALReader(walFile, db.Logger.With(LogKeySubsystem, LogSubsystemWALReader))\n\t\tif err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"new wal reader: %w\", err))\n\t\t\treturn\n\t\t}\n\n\t\t// Build a mapping of changed page numbers and their latest content.\n\t\tmaxBytes := pos.walEndOffset - WALHeaderSize\n\t\tpageMap := make(map[uint32]int64)\n\t\tvar maxOffset int64\n\t\tvar walCommit uint32\n\t\tif maxBytes \u003e 0 {\n\t\t\tpageMap, maxOffset, walCommit, _, err = rd.pageMap(ctx, maxBytes)\n\t\t\tif err != nil {\n\t\t\t\tpw.CloseWithError(fmt.Errorf(\"page map: %w\", err))\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif walCommit \u003e 0 {\n\t\t\tcommit = walCommit\n\t\t}\n\n\t\tif maxOffset \u003e pos.walEndOffset {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"snapshot wal read exceeded bound: max offset %d \u003e end offset %d\", maxOffset, pos.walEndOffset))\n\t\t\treturn\n\t\t}\n\t\twalOffset, walSize := snapshotHeaderWALRange(maxOffset, int64(WALFrameHeaderSize+pos.pageSize))\n\n\t\tdb.Logger.Debug(\"encode snapshot header\",\n\t\t\t\"txid\", pos.pos.TXID.String(),\n\t\t\t\"commit\", commit,\n\t\t\t\"walOffset\", walOffset,\n\t\t\t\"walSize\", walSize,\n\t\t\t\"walEndOffset\", pos.walEndOffset,\n\t\t\t\"salt1\", rd.salt1,\n\t\t\t\"salt2\", rd.salt2)\n\n\t\tenc, err := ltx.NewEncoder(pw)\n\t\tif err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"new ltx encoder: %w\", err))\n\t\t\treturn\n\t\t}\n\t\tif err := enc.EncodeHeader(ltx.Header{\n\t\t\tVersion: ltx.Version,\n\t\t\tFlags: ltx.HeaderFlagNoChecksum,\n\t\t\tPageSize: uint32(pos.pageSize),\n\t\t\tCommit: commit,\n\t\t\tMinTXID: 1,\n\t\t\tMaxTXID: pos.pos.TXID,\n\t\t\tTimestamp: time.Now().UnixMilli(),\n\t\t\tWALOffset: walOffset,\n\t\t\tWALSize: walSize,\n\t\t\tWALSalt1: rd.salt1,\n\t\t\tWALSalt2: rd.salt2,\n\t\t}); err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"encode ltx snapshot header: %w\", err))\n\t\t\treturn\n\t\t}\n\n\t\tif err := db.writeLTXFromDB(ctx, enc, walFile, commit, pageMap); err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"write snapshot ltx: %w\", err))\n\t\t\treturn\n\t\t}\n\n\t\tif err := enc.Close(); err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"close ltx snapshot encoder: %w\", err))\n\t\t\treturn\n\t\t}\n\t\t_ = pw.Close()\n\t}()\n\n\treturn \u0026snapshotReadCloser{PipeReader: pr, pos: pos}, nil\n}\n\nfunc snapshotHeaderWALRange(maxOffset, frameSize int64) (offset, size int64) {\n\tif maxOffset \u003c= WALHeaderSize || frameSize \u003c= 0 {\n\t\treturn WALHeaderSize, 0\n\t}\n\toffset = max(maxOffset-frameSize, WALHeaderSize)\n\treturn offset, maxOffset - offset\n}\n\n// Compact performs a compaction of the LTX file at the previous level into dstLevel.\n// Returns metadata for the newly written compaction file. Returns ErrNoCompaction\n// if no new files are available to be compacted.\nfunc (db *DB) Compact(ctx context.Context, dstLevel int) (*ltx.FileInfo, error) {\n\tinfo, err := db.compactor.Compact(ctx, dstLevel)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// If this is L1, clean up L0 files using the time-based retention policy.\n\tif dstLevel == 1 {\n\t\tif err := db.EnforceL0RetentionByTime(ctx); err != nil {\n\t\t\t// Don't log context cancellation errors during shutdown\n\t\t\tif !isShutdownError(ctx, err) {\n\t\t\t\tdb.Logger.Error(\"enforce L0 time retention\", \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn info, nil\n}\n\n// Snapshot writes a snapshot to the replica for the current database position.\n// It always writes, even when a snapshot already exists at the current\n// position, so operators can force a re-upload (replicate -force-snapshot).\n// Callers that want to skip duplicates check first, as Store.CompactDB does.\nfunc (db *DB) Snapshot(ctx context.Context) (*ltx.FileInfo, error) {\n\tpos, r, err := db.SnapshotReader(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer func() { _ = r.Close() }()\n\n\tinfo, err := db.Replica.Client.WriteLTXFile(ctx, SnapshotLevel, 1, pos.TXID, r)\n\tif err != nil {\n\t\treturn info, err\n\t}\n\n\tdb.maxLTXFileInfos.Lock()\n\tdb.maxLTXFileInfos.m[SnapshotLevel] = info\n\tdb.maxLTXFileInfos.Unlock()\n\n\treturn info, nil\n}\n\n// EnforceSnapshotRetention enforces retention of the snapshot level in the database by timestamp.\nfunc (db *DB) EnforceSnapshotRetention(ctx context.Context, timestamp time.Time) (minSnapshotTXID ltx.TXID, err error) {\n\tdb.Logger.Debug(\"enforcing snapshot retention\", \"timestamp\", timestamp)\n\n\t// Normal operation - use fast timestamps\n\titr, err := db.Replica.Client.LTXFiles(ctx, SnapshotLevel, 0, false)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar deleted []*ltx.FileInfo\n\tvar snapshots []*ltx.FileInfo\n\tvar lastInfo *ltx.FileInfo\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tsnapshots = append(snapshots, info)\n\t\tlastInfo = info\n\n\t\t// If this snapshot is before the retention timestamp, mark it for deletion.\n\t\tif info.CreatedAt.Before(timestamp) {\n\t\t\tdeleted = append(deleted, info)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// If this is the snapshot level, we need to ensure that at least one snapshot exists.\n\tif len(deleted) \u003e 0 \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\t// Use the last deleted snapshot's MaxTXID, rather than the first retained\n\t// snapshot's MaxTXID, to preserve lower-level files in an in-flight restore\n\t// plan. TestStore_EnforceSnapshotRetention_RetainsInFlightRestorePlanFiles\n\t// guards this conservative floor.\n\tfor i, info := range snapshots {\n\t\tif slices.Contains(deleted, info) {\n\t\t\tcontinue\n\t\t}\n\t\tif i \u003e 0 {\n\t\t\tminSnapshotTXID = snapshots[i-1].MaxTXID\n\t\t}\n\t\tbreak\n\t}\n\n\t// Remove files marked for deletion from remote storage (unless retention disabled).\n\tif !db.RetentionEnabled {\n\t\tdb.Logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", SnapshotLevel, \"count\", len(deleted))\n\t} else if err := db.Replica.Client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn 0, fmt.Errorf(\"remove ltx files: %w\", err)\n\t}\n\n\t// Always clean up local files.\n\tfor _, info := range deleted {\n\t\tlocalPath := db.LTXPath(SnapshotLevel, info.MinTXID, info.MaxTXID)\n\t\tdb.Logger.Debug(\"deleting local ltx file\", \"level\", SnapshotLevel, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", localPath)\n\n\t\tif err := os.Remove(localPath); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\tdb.Logger.Error(\"failed to remove local ltx file\", \"path\", localPath, \"error\", err)\n\t\t}\n\t}\n\n\treturn minSnapshotTXID, nil\n}\n\n// EnforceL0RetentionByTime retains L0 files until they have been compacted into\n// L1 and have existed for at least L0Retention.\nfunc (db *DB) EnforceL0RetentionByTime(ctx context.Context) error {\n\tif db.L0Retention \u003c= 0 {\n\t\treturn nil\n\t}\n\n\tdb.Logger.Debug(\"starting l0 retention enforcement\", \"retention\", db.L0Retention)\n\n\tdbName := filepath.Base(db.Path())\n\n\t// Determine the highest TXID that has been compacted into L1.\n\titr, err := db.Replica.Client.LTXFiles(ctx, 1, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch l1 files: %w\", err)\n\t}\n\tvar maxL1TXID ltx.TXID\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tif info.MaxTXID \u003e maxL1TXID {\n\t\t\tmaxL1TXID = info.MaxTXID\n\t\t}\n\t}\n\tif err := itr.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close l1 iterator: %w\", err)\n\t}\n\tif maxL1TXID == 0 {\n\t\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"eligible\").Set(0)\n\t\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"not_compacted\").Set(0)\n\t\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"too_recent\").Set(0)\n\t\treturn nil\n\t}\n\n\tthreshold := time.Now().Add(-db.L0Retention)\n\titr, err = db.Replica.Client.LTXFiles(ctx, 0, 0, false)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch l0 files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar (\n\t\tdeleted []*ltx.FileInfo\n\t\tlastInfo *ltx.FileInfo\n\t\tprocessedAll = true\n\t\ttotalFiles int\n\t\tnotCompactedCount int\n\t\ttooRecentCount int\n\t)\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tlastInfo = info\n\t\ttotalFiles++\n\n\t\tcreatedAt := info.CreatedAt\n\t\tif createdAt.IsZero() {\n\t\t\tif fi, err := os.Stat(db.LTXPath(0, info.MinTXID, info.MaxTXID)); err == nil {\n\t\t\t\tcreatedAt = fi.ModTime().UTC()\n\t\t\t} else {\n\t\t\t\tcreatedAt = threshold\n\t\t\t}\n\t\t}\n\n\t\tif createdAt.After(threshold) {\n\t\t\t// L0 entries are ordered; once we reach a newer file we stop so we don't\n\t\t\t// create gaps between retained files. VFS expects contiguous coverage.\n\t\t\tprocessedAll = false\n\t\t\ttooRecentCount++\n\t\t\tbreak\n\t\t}\n\n\t\tif info.MaxTXID \u003c= maxL1TXID {\n\t\t\tdeleted = append(deleted, info)\n\t\t} else {\n\t\t\tnotCompactedCount++\n\t\t}\n\t}\n\n\t// Count remaining files as too_recent if we stopped early\n\tif !processedAll {\n\t\tfor itr.Next() {\n\t\t\ttooRecentCount++\n\t\t}\n\t}\n\n\t// Ensure we do not delete the newest L0 file only if we processed the entire level.\n\tif processedAll \u0026\u0026 len(deleted) \u003e 0 \u0026\u0026 lastInfo != nil \u0026\u0026 deleted[len(deleted)-1] == lastInfo {\n\t\tdeleted = deleted[:len(deleted)-1]\n\t}\n\n\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"eligible\").Set(float64(len(deleted)))\n\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"not_compacted\").Set(float64(notCompactedCount))\n\tinternal.L0RetentionGaugeVec.WithLabelValues(dbName, \"too_recent\").Set(float64(tooRecentCount))\n\n\tdb.Logger.Debug(\"l0 retention scan complete\",\n\t\t\"total_l0_files\", totalFiles,\n\t\t\"eligible_for_deletion\", len(deleted),\n\t\t\"not_compacted_yet\", notCompactedCount,\n\t\t\"too_recent\", tooRecentCount,\n\t\t\"max_l1_txid\", maxL1TXID)\n\n\tif len(deleted) == 0 {\n\t\treturn nil\n\t}\n\n\tif !db.RetentionEnabled {\n\t\tdb.Logger.Debug(\"skipping remote deletion (retention disabled)\", \"level\", 0, \"count\", len(deleted))\n\t} else if err := db.Replica.Client.DeleteLTXFiles(ctx, deleted); err != nil {\n\t\treturn fmt.Errorf(\"remove expired l0 files: %w\", err)\n\t}\n\n\tfor _, info := range deleted {\n\t\tlocalPath := db.LTXPath(0, info.MinTXID, info.MaxTXID)\n\t\tdb.Logger.Debug(\"deleting expired local l0 file\", \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", localPath)\n\t\tif err := os.Remove(localPath); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\tdb.Logger.Error(\"failed to remove local l0 file\", \"path\", localPath, \"error\", err)\n\t\t}\n\t}\n\tif len(deleted) \u003e 0 {\n\t\tdb.invalidatePosCache()\n\t}\n\n\tdb.Logger.Info(\"l0 retention enforced\", \"deleted_count\", len(deleted), \"max_l1_txid\", maxL1TXID)\n\n\treturn nil\n}\n\n// EnforceRetentionByTXID enforces retention so that any LTX files below\n// the target TXID are deleted. Always keep at least one file.\nfunc (db *DB) EnforceRetentionByTXID(ctx context.Context, level int, txID ltx.TXID) (err error) {\n\treturn db.compactor.EnforceRetentionByTXID(ctx, level, txID)\n}\n\n// monitor runs in a separate goroutine and monitors the database \u0026 WAL.\n//\n// Implements exponential backoff on repeated sync errors to prevent disk churn\n// when persistent errors (like disk full) occur. See issue #927.\nfunc (db *DB) monitor() {\n\tticker := time.NewTicker(db.MonitorInterval)\n\tdefer ticker.Stop()\n\n\t// Backoff state for error handling.\n\tvar backoff time.Duration\n\tvar lastLogTime time.Time\n\tvar consecutiveErrs int\n\n\tfor {\n\t\t// Wait for ticker or context close.\n\t\tselect {\n\t\tcase \u003c-db.ctx.Done():\n\t\t\treturn\n\t\tcase \u003c-ticker.C:\n\t\t}\n\n\t\t// If in backoff mode, wait additional time before retrying.\n\t\tif backoff \u003e 0 {\n\t\t\tselect {\n\t\t\tcase \u003c-db.ctx.Done():\n\t\t\t\treturn\n\t\t\tcase \u003c-time.After(backoff):\n\t\t\t}\n\t\t}\n\n\t\t// Sync the database to the shadow WAL. Sync() loops over bounded\n\t\t// chunks, releasing the executor lock between each so checkpoints\n\t\t// and snapshots can interleave, but always catches up to the WAL\n\t\t// end so checkpointIfNeeded() runs. A single bounded chunk per\n\t\t// tick would cap drain throughput and starve the TruncatePageN\n\t\t// emergency checkpoint while behind, growing the WAL unbounded.\n\t\tif err := db.Sync(db.ctx); err != nil \u0026\u0026 !isShutdownError(db.ctx, err) {\n\t\t\tconsecutiveErrs++\n\n\t\t\t// Exponential backoff: MonitorInterval -\u003e 2x -\u003e 4x -\u003e ... -\u003e max\n\t\t\tif backoff == 0 {\n\t\t\t\tbackoff = db.MonitorInterval\n\t\t\t} else {\n\t\t\t\tbackoff *= 2\n\t\t\t\tif backoff \u003e DefaultSyncBackoffMax {\n\t\t\t\t\tbackoff = DefaultSyncBackoffMax\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log with rate limiting to avoid log spam during persistent errors.\n\t\t\tif time.Since(lastLogTime) \u003e= SyncErrorLogInterval {\n\t\t\t\tvar ltxErr *LTXError\n\t\t\t\tif errors.Is(err, ErrDiskFull) \u0026\u0026 errors.As(err, \u0026ltxErr) {\n\t\t\t\t\t// Recovery is automatic but can lag up to max_backoff\n\t\t\t\t\t// behind space being freed.\n\t\t\t\t\tdb.Logger.Error(\"disk full while staging ltx file, replication paused until space is freed\",\n\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\"path\", ltxErr.Path,\n\t\t\t\t\t\t\"txid\", ltx.TXID(ltxErr.MaxTXID).String(),\n\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\"backoff\", backoff,\n\t\t\t\t\t\t\"max_backoff\", DefaultSyncBackoffMax)\n\t\t\t\t} else {\n\t\t\t\t\tdb.Logger.Error(\"sync error\",\n\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\"backoff\", backoff)\n\t\t\t\t}\n\t\t\t\tlastLogTime = time.Now()\n\t\t\t}\n\n\t\t\t// Try to clean up stale temp files after persistent disk errors.\n\t\t\tif isDiskFullError(err) \u0026\u0026 consecutiveErrs \u003e= 3 {\n\t\t\t\tdb.Logger.Warn(\"attempting temp file cleanup due to persistent disk errors\")\n\t\t\t\tif cleanupErr := removeTmpFiles(db.metaPath); cleanupErr != nil {\n\t\t\t\t\tdb.Logger.Error(\"temp file cleanup failed\", \"error\", cleanupErr)\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Success - reset backoff and error counter.\n\t\tif consecutiveErrs \u003e 0 {\n\t\t\tdb.Logger.Info(\"sync recovered\", \"previous_errors\", consecutiveErrs)\n\t\t}\n\t\tbackoff = 0\n\t\tconsecutiveErrs = 0\n\t}\n}\n\n// CRC64 returns a CRC-64 ISO checksum of the database and its current position.\n//\n// This function obtains a read lock so it prevents syncs from occurring until\n// the operation is complete. The database will still be usable but it will be\n// unable to checkpoint during this time.\n//\n// If dst is set, the database file is copied to that location before checksum.\nfunc (db *DB) CRC64(ctx context.Context) (uint64, ltx.Pos, error) {\n\tif err := db.lockExec(ctx); err != nil {\n\t\treturn 0, ltx.Pos{}, err\n\t}\n\tdefer db.execSem.Release(1)\n\n\texec, err := db.newSyncExecutor(ctx)\n\tif err != nil {\n\t\treturn 0, ltx.Pos{}, err\n\t} else if exec == nil {\n\t\treturn 0, ltx.Pos{}, os.ErrNotExist\n\t}\n\tdefer db.applySyncExecutor(exec, true)\n\n\t// Force a RESTART checkpoint to ensure the database is at the start of the WAL.\n\tif _, err := db.checkpointWithExecutor(ctx, CheckpointModeRestart, exec); err != nil {\n\t\treturn 0, ltx.Pos{}, err\n\t}\n\n\t// Seek to the beginning of the db file descriptor and checksum whole file.\n\th := crc64.New(crc64.MakeTable(crc64.ISO))\n\tif _, err := db.f.Seek(0, io.SeekStart); err != nil {\n\t\treturn 0, exec.pos, err\n\t} else if _, err := io.Copy(h, db.f); err != nil {\n\t\treturn 0, exec.pos, err\n\t}\n\treturn h.Sum64(), exec.pos, nil\n}\n\n// MaxLTXFileInfo returns the metadata for the last LTX file in a level.\n// If cached, it will returned the local copy. Otherwise, it fetches from the replica.\nfunc (db *DB) MaxLTXFileInfo(ctx context.Context, level int) (ltx.FileInfo, error) {\n\tdb.maxLTXFileInfos.Lock()\n\tdefer db.maxLTXFileInfos.Unlock()\n\n\tinfo, ok := db.maxLTXFileInfos.m[level]\n\tif ok {\n\t\treturn *info, nil\n\t}\n\n\tremoteInfo, err := db.Replica.MaxLTXFileInfo(ctx, level)\n\tif err != nil {\n\t\treturn ltx.FileInfo{}, fmt.Errorf(\"cannot determine L%d max ltx file for %q: %w\", level, db.Path(), err)\n\t}\n\n\tdb.maxLTXFileInfos.m[level] = \u0026remoteInfo\n\treturn remoteInfo, nil\n}\n\n// DefaultRestoreParallelism is the default parallelism when downloading WAL files.\nconst DefaultRestoreParallelism = 8\n\n// DefaultFollowInterval is the default polling interval for follow mode.\nconst DefaultFollowInterval = 1 * time.Second\n\n// IntegrityCheckMode specifies the level of integrity checking after restore.\ntype IntegrityCheckMode int\n\nconst (\n\tIntegrityCheckNone IntegrityCheckMode = iota\n\tIntegrityCheckQuick\n\tIntegrityCheckFull\n)\n\n// RestoreOptions represents options for DB.Restore().\ntype RestoreOptions struct {\n\t// Target path to restore into.\n\t// If blank, the original DB path is used.\n\tOutputPath string\n\n\t// Specific transaction to restore to.\n\t// If zero, TXID is ignored.\n\tTXID ltx.TXID\n\n\t// Point-in-time to restore database.\n\t// If zero, database restore to most recent state available.\n\tTimestamp time.Time\n\n\t// Specifies how many WAL files are downloaded in parallel during restore.\n\tParallelism int\n\n\t// Follow enables continuous restore mode, polling for new LTX files\n\t// and applying them to the restored database. Similar to tail -f.\n\tFollow bool\n\n\t// FollowInterval specifies how often to poll for new LTX files in follow mode.\n\tFollowInterval time.Duration\n\n\t// IntegrityCheck specifies the level of integrity checking after restore.\n\t// Zero value (IntegrityCheckNone) skips the check for backward compatibility.\n\tIntegrityCheck IntegrityCheckMode\n}\n\n// NewRestoreOptions returns a new instance of RestoreOptions with defaults.\nfunc NewRestoreOptions() RestoreOptions {\n\treturn RestoreOptions{\n\t\tParallelism: DefaultRestoreParallelism,\n\t\tFollowInterval: DefaultFollowInterval,\n\t}\n}\n\n// Database metrics.\nvar (\n\tdbMetricOwners = struct {\n\t\tsync.Mutex\n\t\tpaths map[string]int\n\t\tbasenames map[string]int\n\t}{\n\t\tpaths: make(map[string]int),\n\t\tbasenames: make(map[string]int),\n\t}\n\n\tdbSizeGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_db_size\",\n\t\tHelp: \"The current size of the real DB\",\n\t}, []string{\"db\"})\n\n\twalSizeGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_wal_size\",\n\t\tHelp: \"The current size of the real WAL\",\n\t}, []string{\"db\"})\n\n\ttotalWALBytesCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_total_wal_bytes\",\n\t\tHelp: \"Total number of bytes written to shadow WAL\",\n\t}, []string{\"db\"})\n\n\ttxIDIndexGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_txid\",\n\t\tHelp: \"The current transaction ID\",\n\t}, []string{\"db\"})\n\n\tsyncNCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_sync_count\",\n\t\tHelp: \"Number of sync operations performed\",\n\t}, []string{\"db\"})\n\n\tsyncErrorNCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_sync_error_count\",\n\t\tHelp: \"Number of sync errors that have occurred\",\n\t}, []string{\"db\"})\n\n\tsyncSecondsCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_sync_seconds\",\n\t\tHelp: \"Time spent syncing shadow WAL, in seconds\",\n\t}, []string{\"db\"})\n\n\tdiskFullGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_disk_full\",\n\t\tHelp: \"Whether replication is paused because the local disk is full\",\n\t}, []string{\"db\"})\n\n\tcheckpointNCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_checkpoint_count\",\n\t\tHelp: \"Number of checkpoint operations performed\",\n\t}, []string{\"db\", \"mode\"})\n\n\tcheckpointErrorNCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_checkpoint_error_count\",\n\t\tHelp: \"Number of checkpoint errors that have occurred\",\n\t}, []string{\"db\", \"mode\"})\n\n\tcheckpointSecondsCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_checkpoint_seconds\",\n\t\tHelp: \"Time spent checkpointing WAL, in seconds\",\n\t}, []string{\"db\", \"mode\"})\n\n\tcompactionVerifyErrorCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_compaction_verify_error_count\",\n\t\tHelp: \"Number of post-compaction verification failures\",\n\t}, []string{\"db\"})\n)\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[29,37]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[38,48]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[49,64]}},{"name":"binary","path":"encoding/binary","span":{"start":[7,1],"end":[7,19],"bytes":[65,83]}},{"name":"errors","path":"errors","span":{"start":[8,1],"end":[8,10],"bytes":[84,93]}},{"name":"fmt","path":"fmt","span":{"start":[9,1],"end":[9,7],"bytes":[94,100]}},{"name":"crc64","path":"hash/crc64","span":{"start":[10,1],"end":[10,14],"bytes":[101,114]}},{"name":"io","path":"io","span":{"start":[11,1],"end":[11,6],"bytes":[115,120]}},{"name":"slog","path":"log/slog","span":{"start":[12,1],"end":[12,12],"bytes":[121,132]}},{"name":"os","path":"os","span":{"start":[13,1],"end":[13,6],"bytes":[133,138]}},{"name":"filepath","path":"path/filepath","span":{"start":[14,1],"end":[14,17],"bytes":[139,155]}},{"name":"slices","path":"slices","span":{"start":[15,1],"end":[15,10],"bytes":[156,165]}},{"name":"strconv","path":"strconv","span":{"start":[16,1],"end":[16,11],"bytes":[166,176]}},{"name":"strings","path":"strings","span":{"start":[17,1],"end":[17,11],"bytes":[177,187]}},{"name":"sync","path":"sync","span":{"start":[18,1],"end":[18,8],"bytes":[188,195]}},{"name":"syscall","path":"syscall","span":{"start":[19,1],"end":[19,11],"bytes":[196,206]}},{"name":"time","path":"time","span":{"start":[20,1],"end":[20,8],"bytes":[207,214]}},{"name":"prometheus","path":"github.com/prometheus/client_golang/prometheus","span":{"start":[22,1],"end":[22,50],"bytes":[216,265]}},{"name":"promauto","path":"github.com/prometheus/client_golang/prometheus/promauto","span":{"start":[23,1],"end":[23,59],"bytes":[266,324]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[24,1],"end":[24,27],"bytes":[325,351]}},{"name":"semaphore","path":"golang.org/x/sync/semaphore","span":{"start":[25,1],"end":[25,31],"bytes":[352,382]}},{"name":"sqlite","path":"modernc.org/sqlite","span":{"start":[26,1],"end":[26,22],"bytes":[383,404]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[28,1],"end":[28,46],"bytes":[406,451]}}],"types":{"DB":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB","kind":"struct","span":{"start":[67,1],"end":[193,2],"bytes":[2132,6925]},"callables":{"github.com/benbjohnson/litestream.DB.CRC64":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","kind":"method","span":{"start":[3320,1],"end":[3347,2],"bytes":[106358,107235]},"signature":"github.com/benbjohnson/litestream.DB.CRC64","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3320,1],"end":[3320,68],"bytes":[106358,106425]}}],"return_type":"(uint64, invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"3321:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3321:12","span":{"start":[3321,12],"end":[3321,28],"bytes":[106437,106453]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec"},"3324:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3324:8","span":{"start":[3324,8],"end":[3324,29],"bytes":[106505,106526]},"callee":null,"is_deferred":true},"3326:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3326:15","span":{"start":[3326,15],"end":[3326,38],"bytes":[106542,106565]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor"},"3332:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3332:8","span":{"start":[3332,8],"end":[3332,40],"bytes":[106683,106715]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","is_deferred":true},"3335:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3335:15","span":{"start":[3335,15],"end":[3335,74],"bytes":[106813,106872]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"3340:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3340:17","span":{"start":[3340,17],"end":[3340,43],"bytes":[107011,107037]},"callee":"can://litestream/litestream/@external/hash/crc64/MakeTable"},"3340:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3340:7","span":{"start":[3340,7],"end":[3340,44],"bytes":[107001,107038]},"callee":"can://litestream/litestream/@external/hash/crc64/New"},"3341:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3341:15","span":{"start":[3341,15],"end":[3341,41],"bytes":[107053,107079]},"callee":"can://litestream/litestream/@external/os/File.Seek"},"3343:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3343:22","span":{"start":[3343,22],"end":[3343,38],"bytes":[107141,107157]},"callee":"can://litestream/litestream/@external/io/Copy"},"3346:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64@3346:9","span":{"start":[3346,9],"end":[3346,18],"bytes":[107209,107218]},"callee":"can://litestream/litestream/@external/hash/Hash64.Sum64"}}},"github.com/benbjohnson/litestream.DB.Checkpoint":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","kind":"method","span":{"start":[2469,1],"end":[2487,2],"bytes":[79355,79811]},"signature":"github.com/benbjohnson/litestream.DB.Checkpoint","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2469,1],"end":[2469,73],"bytes":[79355,79427]}},{"name":"mode","type":"string","span":{"start":[2469,1],"end":[2469,73],"bytes":[79355,79427]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"2470:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint@2470:12","span":{"start":[2470,12],"end":[2470,28],"bytes":[79439,79455]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec"},"2473:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint@2473:8","span":{"start":[2473,8],"end":[2473,29],"bytes":[79493,79514]},"callee":null,"is_deferred":true},"2474:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint@2474:2","span":{"start":[2474,2],"end":[2474,36],"bytes":[79516,79550]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag"},"2475:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint@2475:8","span":{"start":[2475,8],"end":[2475,43],"bytes":[79558,79593]},"callee":null,"is_deferred":true},"2477:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint@2477:15","span":{"start":[2477,15],"end":[2477,38],"bytes":[79609,79632]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor"},"2483:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint@2483:8","span":{"start":[2483,8],"end":[2483,40],"bytes":[79711,79743]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","is_deferred":true},"2485:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint@2485:11","span":{"start":[2485,11],"end":[2485,53],"bytes":[79755,79797]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint/github.com/benbjohnson/litestream.DB.Checkpoint.closure_1","kind":"function","span":{"start":[2475,1],"end":[2475,43],"bytes":[79551,79593]},"signature":"github.com/benbjohnson/litestream.DB.Checkpoint.closure_1","parameters":[],"body":{"2475:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint/github.com/benbjohnson/litestream.DB.Checkpoint.closure_1@2475:17","span":{"start":[2475,17],"end":[2475,39],"bytes":[79567,79589]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag"}}}}},"github.com/benbjohnson/litestream.DB.Close":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","kind":"method","span":{"start":[874,1],"end":[938,2],"bytes":[29441,30885]},"signature":"github.com/benbjohnson/litestream.DB.Close","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[874,1],"end":[874,55],"bytes":[29441,29495]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"875:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@875:2","span":{"start":[875,2],"end":[875,13],"bytes":[29497,29508]},"callee":null},"876:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@876:2","span":{"start":[876,2],"end":[876,14],"bytes":[29510,29522]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Wait"},"883:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@883:12","span":{"start":[883,12],"end":[883,61],"bytes":[29838,29887]},"callee":null},"883:31":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@883:31","span":{"start":[883,31],"end":[883,57],"bytes":[29857,29883]},"callee":"can://litestream/litestream/@external/context/WithoutCancel"},"886:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@886:8","span":{"start":[886,8],"end":[886,29],"bytes":[29925,29946]},"callee":null,"is_deferred":true},"890:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@890:14","span":{"start":[890,14],"end":[890,35],"bytes":[30025,30046]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked"},"898:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@898:12","span":{"start":[898,12],"end":[898,40],"bytes":[30196,30224]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry"},"902:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@902:3","span":{"start":[902,3],"end":[902,24],"bytes":[30274,30295]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop"},"907:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@907:11","span":{"start":[907,11],"end":[907,31],"bytes":[30409,30429]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock"},"912:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@912:2","span":{"start":[912,2],"end":[912,14],"bytes":[30476,30488]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"919:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@919:2","span":{"start":[919,2],"end":[919,16],"bytes":[30575,30589]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock"},"922:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@922:11","span":{"start":[922,11],"end":[922,24],"bytes":[30620,30633]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close"},"928:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@928:11","span":{"start":[928,11],"end":[928,20],"bytes":[30704,30713]},"callee":"can://litestream/litestream/@external/os/File.Close"},"935:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close@935:2","span":{"start":[935,2],"end":[935,20],"bytes":[30852,30870]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics"}}},"github.com/benbjohnson/litestream.DB.Compact":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","kind":"method","span":{"start":[2984,1],"end":[3001,2],"bytes":[95536,96052]},"signature":"github.com/benbjohnson/litestream.DB.Compact","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2984,1],"end":[2984,82],"bytes":[95536,95617]}},{"name":"dstLevel","type":"int","span":{"start":[2984,1],"end":[2984,82],"bytes":[95536,95617]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"2985:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact@2985:15","span":{"start":[2985,15],"end":[2985,50],"bytes":[95632,95667]},"callee":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact"},"2992:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact@2992:13","span":{"start":[2992,13],"end":[2992,45],"bytes":[95815,95847]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime"},"2994:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact@2994:8","span":{"start":[2994,8],"end":[2994,33],"bytes":[95929,95954]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"2995:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact@2995:5","span":{"start":[2995,5],"end":[2995,63],"bytes":[95961,96019]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"}}},"github.com/benbjohnson/litestream.DB.DirInfo":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo","kind":"method","span":{"start":[657,1],"end":[659,2],"bytes":[23069,23127]},"signature":"github.com/benbjohnson/litestream.DB.DirInfo","parameters":[],"return_type":"os.FileInfo","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","kind":"method","span":{"start":[3093,1],"end":[3215,2],"bytes":[99222,102862]},"signature":"github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3093,1],"end":[3093,68],"bytes":[99222,99289]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":22},"body":{"3098:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3098:2","span":{"start":[3098,2],"end":[3098,83],"bytes":[99334,99415]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"3100:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3100:12","span":{"start":[3100,12],"end":[3100,36],"bytes":[99428,99452]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"3100:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3100:26","span":{"start":[3100,26],"end":[3100,35],"bytes":[99442,99451]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"3103:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3103:14","span":{"start":[3103,14],"end":[3103,58],"bytes":[99531,99575]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"3105:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3105:10","span":{"start":[3105,10],"end":[3105,47],"bytes":[99602,99639]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"3108:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3108:6","span":{"start":[3108,6],"end":[3108,16],"bytes":[99672,99682]},"callee":null},"3109:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3109:11","span":{"start":[3109,11],"end":[3109,21],"bytes":[99695,99705]},"callee":null},"3114:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3114:12","span":{"start":[3114,12],"end":[3114,23],"bytes":[99784,99795]},"callee":null},"3115:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3115:10","span":{"start":[3115,10],"end":[3115,50],"bytes":[99819,99859]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"3118:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3118:3","span":{"start":[3118,3],"end":[3118,74],"bytes":[99886,99957]},"callee":null},"3118:3/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3118:3/2","span":{"start":[3118,3],"end":[3118,67],"bytes":[99886,99950]},"callee":null},"3119:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3119:3","span":{"start":[3119,3],"end":[3119,79],"bytes":[99960,100036]},"callee":null},"3119:3/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3119:3/2","span":{"start":[3119,3],"end":[3119,72],"bytes":[99960,100029]},"callee":null},"3120:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3120:3","span":{"start":[3120,3],"end":[3120,76],"bytes":[100039,100112]},"callee":null},"3120:3/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3120:3/2","span":{"start":[3120,3],"end":[3120,69],"bytes":[100039,100105]},"callee":null},"3124:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3124:15","span":{"start":[3124,15],"end":[3124,46],"bytes":[100144,100175]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"3124:15/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3124:15/2","span":{"start":[3124,15],"end":[3124,25],"bytes":[100144,100154]},"callee":"can://litestream/litestream/@external/time/Now"},"3125:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3125:13","span":{"start":[3125,13],"end":[3125,57],"bytes":[100188,100232]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"3127:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3127:10","span":{"start":[3127,10],"end":[3127,47],"bytes":[100259,100296]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"3129:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3129:8","span":{"start":[3129,8],"end":[3129,19],"bytes":[100307,100318]},"callee":null,"is_deferred":true},"3139:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3139:6","span":{"start":[3139,6],"end":[3139,16],"bytes":[100504,100514]},"callee":null},"3140:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3140:11","span":{"start":[3140,11],"end":[3140,21],"bytes":[100527,100537]},"callee":null},"3145:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3145:6","span":{"start":[3145,6],"end":[3145,24],"bytes":[100607,100625]},"callee":null},"3146:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3146:18","span":{"start":[3146,18],"end":[3146,68],"bytes":[100645,100695]},"callee":"can://litestream/litestream/@external/os/Stat"},"3146:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3146:26","span":{"start":[3146,26],"end":[3146,67],"bytes":[100653,100694]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"3147:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3147:17","span":{"start":[3147,17],"end":[3147,35],"bytes":[100726,100744]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"3147:17/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3147:17/2","span":{"start":[3147,17],"end":[3147,29],"bytes":[100726,100738]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime"},"3153:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3153:6","span":{"start":[3153,6],"end":[3153,32],"bytes":[100798,100824]},"callee":null},"3162:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3162:14","span":{"start":[3162,14],"end":[3162,35],"bytes":[101083,101104]},"callee":null},"3170:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3170:7","span":{"start":[3170,7],"end":[3170,17],"bytes":[101233,101243]},"callee":null},"3176:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3176:21","span":{"start":[3176,21],"end":[3176,33],"bytes":[101380,101392]},"callee":null},"3176:68":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3176:68","span":{"start":[3176,68],"end":[3176,80],"bytes":[101427,101439]},"callee":null},"3177:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3177:22","span":{"start":[3177,22],"end":[3177,34],"bytes":[101478,101490]},"callee":null},"3180:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3180:2","span":{"start":[3180,2],"end":[3180,93],"bytes":[101499,101590]},"callee":null},"3180:2/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3180:2/2","span":{"start":[3180,2],"end":[3180,66],"bytes":[101499,101563]},"callee":null},"3180:71":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3180:71","span":{"start":[3180,71],"end":[3180,92],"bytes":[101568,101589]},"callee":null},"3180:79":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3180:79","span":{"start":[3180,79],"end":[3180,91],"bytes":[101576,101588]},"callee":null},"3181:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3181:2","span":{"start":[3181,2],"end":[3181,103],"bytes":[101592,101693]},"callee":null},"3181:2/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3181:2/2","span":{"start":[3181,2],"end":[3181,71],"bytes":[101592,101661]},"callee":null},"3181:76":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3181:76","span":{"start":[3181,76],"end":[3181,102],"bytes":[101666,101692]},"callee":null},"3182:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3182:2","span":{"start":[3182,2],"end":[3182,97],"bytes":[101695,101790]},"callee":null},"3182:2/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3182:2/2","span":{"start":[3182,2],"end":[3182,68],"bytes":[101695,101761]},"callee":null},"3182:73":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3182:73","span":{"start":[3182,73],"end":[3182,96],"bytes":[101766,101789]},"callee":null},"3184:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3184:2","span":{"start":[3184,2],"end":[3189,28],"bytes":[101793,102013]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"3186:28":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3186:28","span":{"start":[3186,28],"end":[3186,40],"bytes":[101898,101910]},"callee":null},"3191:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3191:5","span":{"start":[3191,5],"end":[3191,17],"bytes":[102019,102031]},"callee":null},"3196:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3196:3","span":{"start":[3196,3],"end":[3196,102],"bytes":[102085,102184]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"3196:89":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3196:89","span":{"start":[3196,89],"end":[3196,101],"bytes":[102171,102183]},"callee":null},"3197:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3197:19","span":{"start":[3197,19],"end":[3197,65],"bytes":[102203,102249]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"3198:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3198:10","span":{"start":[3198,10],"end":[3198,56],"bytes":[102273,102319]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"3202:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3202:16","span":{"start":[3202,16],"end":[3202,57],"bytes":[102371,102412]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"3203:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3203:3","span":{"start":[3203,3],"end":[3203,121],"bytes":[102415,102533]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"3204:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3204:13","span":{"start":[3204,13],"end":[3204,33],"bytes":[102546,102566]},"callee":"can://litestream/litestream/@external/os/Remove"},"3204:50":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3204:50","span":{"start":[3204,50],"end":[3204,68],"bytes":[102583,102601]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"3205:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3205:4","span":{"start":[3205,4],"end":[3205,86],"bytes":[102607,102689]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"3208:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3208:5","span":{"start":[3208,5],"end":[3208,17],"bytes":[102701,102713]},"callee":null},"3209:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3209:3","span":{"start":[3209,3],"end":[3209,26],"bytes":[102722,102745]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"3212:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3212:2","span":{"start":[3212,2],"end":[3212,98],"bytes":[102751,102847]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"3212:59":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime@3212:59","span":{"start":[3212,59],"end":[3212,71],"bytes":[102808,102820]},"callee":null}}},"github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID","kind":"method","span":{"start":[3219,1],"end":[3221,2],"bytes":[103000,103161]},"signature":"github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3219,1],"end":[3219,98],"bytes":[103000,103097]}},{"name":"level","type":"int","span":{"start":[3219,1],"end":[3219,98],"bytes":[103000,103097]}},{"name":"txID","type":"invalid type","span":{"start":[3219,1],"end":[3219,98],"bytes":[103000,103097]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"3220:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID@3220:9","span":{"start":[3220,9],"end":[3220,62],"bytes":[103106,103159]},"callee":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID"}}},"github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","kind":"method","span":{"start":[3027,1],"end":[3089,2],"bytes":[96884,99090]},"signature":"github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3027,1],"end":[3027,121],"bytes":[96884,97004]}},{"name":"timestamp","type":"time.Time","span":{"start":[3027,1],"end":[3027,121],"bytes":[96884,97004]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"3028:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3028:2","span":{"start":[3028,2],"end":[3028,73],"bytes":[97006,97077]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"3031:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3031:14","span":{"start":[3031,14],"end":[3031,70],"bytes":[97135,97191]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"3033:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3033:13","span":{"start":[3033,13],"end":[3033,51],"bytes":[97221,97259]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"3035:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3035:8","span":{"start":[3035,8],"end":[3035,19],"bytes":[97270,97281]},"callee":null,"is_deferred":true},"3040:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3040:6","span":{"start":[3040,6],"end":[3040,16],"bytes":[97376,97386]},"callee":null},"3041:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3041:11","span":{"start":[3041,11],"end":[3041,21],"bytes":[97399,97409]},"callee":null},"3042:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3042:15","span":{"start":[3042,15],"end":[3042,38],"bytes":[97424,97447]},"callee":null},"3046:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3046:6","span":{"start":[3046,6],"end":[3046,38],"bytes":[97551,97583]},"callee":null},"3047:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3047:14","span":{"start":[3047,14],"end":[3047,35],"bytes":[97599,97620]},"callee":null},"3053:33":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3053:33","span":{"start":[3053,33],"end":[3053,45],"bytes":[97761,97773]},"callee":null},"3053:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3053:5","span":{"start":[3053,5],"end":[3053,17],"bytes":[97733,97745]},"callee":null},"3054:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3054:22","span":{"start":[3054,22],"end":[3054,34],"bytes":[97812,97824]},"callee":null},"3062:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3062:6","span":{"start":[3062,6],"end":[3062,36],"bytes":[98138,98168]},"callee":"can://litestream/litestream/@external/slices/Contains"},"3073:101":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3073:101","span":{"start":[3073,101],"end":[3073,113],"bytes":[98473,98485]},"callee":null},"3073:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3073:3","span":{"start":[3073,3],"end":[3073,114],"bytes":[98375,98486]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"3074:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3074:19","span":{"start":[3074,19],"end":[3074,65],"bytes":[98505,98551]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles"},"3075:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3075:13","span":{"start":[3075,13],"end":[3075,52],"bytes":[98578,98617]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"3080:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3080:16","span":{"start":[3080,16],"end":[3080,69],"bytes":[98702,98755]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"3081:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3081:3","span":{"start":[3081,3],"end":[3081,138],"bytes":[98758,98893]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"3083:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3083:13","span":{"start":[3083,13],"end":[3083,33],"bytes":[98907,98927]},"callee":"can://litestream/litestream/@external/os/Remove"},"3083:50":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3083:50","span":{"start":[3083,50],"end":[3083,68],"bytes":[98944,98962]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"3084:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention@3084:4","span":{"start":[3084,4],"end":[3084,87],"bytes":[98968,99051]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"}}},"github.com/benbjohnson/litestream.DB.EnsureExists":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","kind":"method","span":{"start":[786,1],"end":[820,2],"bytes":[26853,27824]},"signature":"github.com/benbjohnson/litestream.DB.EnsureExists","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[786,1],"end":[786,56],"bytes":[26853,26908]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"788:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@788:10","span":{"start":[788,10],"end":[788,45],"bytes":[26942,26977]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"791:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@791:10","span":{"start":[791,10],"end":[791,52],"bytes":[27021,27063]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"794:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@794:15","span":{"start":[794,15],"end":[794,33],"bytes":[27082,27100]},"callee":"can://litestream/litestream/@external/os/Stat"},"794:23":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@794:23","span":{"start":[794,23],"end":[794,32],"bytes":[27090,27099]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"796:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@796:13","span":{"start":[796,13],"end":[796,31],"bytes":[27140,27158]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"797:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@797:10","span":{"start":[797,10],"end":[797,46],"bytes":[27170,27206]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"800:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@800:12","span":{"start":[800,12],"end":[800,35],"bytes":[27222,27245]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"800:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@800:25","span":{"start":[800,25],"end":[800,34],"bytes":[27235,27244]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"801:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@801:13","span":{"start":[801,13],"end":[801,36],"bytes":[27272,27295]},"callee":"can://litestream/litestream/@external/os/MkdirAll"},"802:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@802:11","span":{"start":[802,11],"end":[802,57],"bytes":[27320,27366]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"806:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@806:9","span":{"start":[806,9],"end":[806,28],"bytes":[27383,27402]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewRestoreOptions"},"807:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@807:19","span":{"start":[807,19],"end":[807,28],"bytes":[27421,27430]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"810:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@810:12","span":{"start":[810,12],"end":[810,40],"bytes":[27485,27513]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore"},"811:43":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@811:43","span":{"start":[811,43],"end":[811,73],"bytes":[27570,27600]},"callee":"can://litestream/litestream/@external/errors/Is"},"811:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@811:6","span":{"start":[811,6],"end":[811,39],"bytes":[27533,27566]},"callee":"can://litestream/litestream/@external/errors/Is"},"812:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@812:4","span":{"start":[812,4],"end":[812,66],"bytes":[27606,27668]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"815:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@815:10","span":{"start":[815,10],"end":[815,52],"bytes":[27696,27738]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"818:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@818:2","span":{"start":[818,2],"end":[818,68],"bytes":[27744,27810]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"818:58":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists@818:58","span":{"start":[818,58],"end":[818,67],"bytes":[27800,27809]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream.DB.FileInfo":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.FileInfo","kind":"method","span":{"start":[652,1],"end":[654,2],"bytes":[22895,22955]},"signature":"github.com/benbjohnson/litestream.DB.FileInfo","parameters":[],"return_type":"os.FileInfo","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.IsOpen":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","kind":"method","span":{"start":[549,1],"end":[553,2],"bytes":[19789,19876]},"signature":"github.com/benbjohnson/litestream.DB.IsOpen","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"550:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen@550:2","span":{"start":[550,2],"end":[550,15],"bytes":[19820,19833]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"},"551:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen@551:8","span":{"start":[551,8],"end":[551,23],"bytes":[19841,19856]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","is_deferred":true}}},"github.com/benbjohnson/litestream.DB.LTXDir":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","kind":"method","span":{"start":[571,1],"end":[573,2],"bytes":[20272,20347]},"signature":"github.com/benbjohnson/litestream.DB.LTXDir","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{"572:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir@572:9","span":{"start":[572,9],"end":[572,42],"bytes":[20312,20345]},"callee":"can://litestream/litestream/@external/path/filepath/Join"}}},"github.com/benbjohnson/litestream.DB.LTXLevelDir":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","kind":"method","span":{"start":[601,1],"end":[603,2],"bytes":[21229,21332]},"signature":"github.com/benbjohnson/litestream.DB.LTXLevelDir","parameters":[{"name":"level","type":"int","span":{"start":[601,1],"end":[601,46],"bytes":[21229,21274]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"602:23":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir@602:23","span":{"start":[602,23],"end":[602,34],"bytes":[21297,21308]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"602:36":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir@602:36","span":{"start":[602,36],"end":[602,55],"bytes":[21310,21329]},"callee":"can://litestream/litestream/@external/strconv/Itoa"},"602:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir@602:9","span":{"start":[602,9],"end":[602,56],"bytes":[21283,21330]},"callee":"can://litestream/litestream/@external/path/filepath/Join"}}},"github.com/benbjohnson/litestream.DB.LTXPath":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","kind":"method","span":{"start":[607,1],"end":[610,2],"bytes":[21439,21640]},"signature":"github.com/benbjohnson/litestream.DB.LTXPath","parameters":[{"name":"level","type":"int","span":{"start":[607,1],"end":[607,69],"bytes":[21439,21507]}},{"name":"minTXID","type":"invalid type","span":{"start":[607,1],"end":[607,69],"bytes":[21439,21507]}},{"name":"maxTXID","type":"invalid type","span":{"start":[607,1],"end":[607,69],"bytes":[21439,21507]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"608:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath@608:2","span":{"start":[608,2],"end":[608,48],"bytes":[21509,21555]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert"},"609:23":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath@609:23","span":{"start":[609,23],"end":[609,44],"bytes":[21578,21599]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir"},"609:46":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath@609:46","span":{"start":[609,46],"end":[609,82],"bytes":[21601,21637]},"callee":null},"609:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath@609:9","span":{"start":[609,9],"end":[609,83],"bytes":[21564,21638]},"callee":"can://litestream/litestream/@external/path/filepath/Join"}}},"github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","kind":"method","span":{"start":[729,1],"end":[733,2],"bytes":[25065,25221]},"signature":"github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","parameters":[],"return_type":"time.Time","metrics":{"cyclomatic":1},"body":{"730:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt@730:2","span":{"start":[730,2],"end":[730,33],"bytes":[25115,25146]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"},"731:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt@731:8","span":{"start":[731,8],"end":[731,41],"bytes":[25154,25187]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","is_deferred":true}}},"github.com/benbjohnson/litestream.DB.MaxLTX":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","kind":"method","span":{"start":[632,1],"end":[649,2],"bytes":[22329,22804]},"signature":"github.com/benbjohnson/litestream.DB.MaxLTX","parameters":[],"return_type":"(invalid type, invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"633:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX@633:15","span":{"start":[633,15],"end":[633,44],"bytes":[22407,22436]},"callee":"can://litestream/litestream/@external/os/ReadDir"},"633:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX@633:26","span":{"start":[633,26],"end":[633,43],"bytes":[22418,22435]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir"},"634:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX@634:5","span":{"start":[634,5],"end":[634,23],"bytes":[22441,22459]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"642:23":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX@642:23","span":{"start":[642,23],"end":[642,52],"bytes":[22627,22656]},"callee":null},"642:41":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX@642:41","span":{"start":[642,41],"end":[642,51],"bytes":[22645,22655]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.Name"}}},"github.com/benbjohnson/litestream.DB.MaxLTXFileInfo":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","kind":"method","span":{"start":[3351,1],"end":[3367,2],"bytes":[107397,107873]},"signature":"github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3351,1],"end":[3351,85],"bytes":[107397,107481]}},{"name":"level","type":"int","span":{"start":[3351,1],"end":[3351,85],"bytes":[107397,107481]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"3352:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo@3352:2","span":{"start":[3352,2],"end":[3352,27],"bytes":[107483,107508]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"3353:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo@3353:8","span":{"start":[3353,8],"end":[3353,35],"bytes":[107516,107543]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"3360:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo@3360:21","span":{"start":[3360,21],"end":[3360,58],"bytes":[107639,107676]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo"},"3362:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo@3362:26","span":{"start":[3362,26],"end":[3362,107],"bytes":[107719,107800]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"3362:92":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo@3362:92","span":{"start":[3362,92],"end":[3362,101],"bytes":[107785,107794]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream.DB.MetaPath":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath","kind":"method","span":{"start":[561,1],"end":[563,2],"bytes":[20050,20105]},"signature":"github.com/benbjohnson/litestream.DB.MetaPath","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.Notify":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify","kind":"method","span":{"start":[706,1],"end":[710,2],"bytes":[24382,24480]},"signature":"github.com/benbjohnson/litestream.DB.Notify","parameters":[],"return_type":"\u003c-chan struct{}","metrics":{"cyclomatic":1},"body":{"707:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify@707:2","span":{"start":[707,2],"end":[707,15],"bytes":[24424,24437]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"},"708:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify@708:8","span":{"start":[708,8],"end":[708,23],"bytes":[24445,24460]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","is_deferred":true}}},"github.com/benbjohnson/litestream.DB.Open":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","kind":"method","span":{"start":[823,1],"end":[869,2],"bytes":[27883,29224]},"signature":"github.com/benbjohnson/litestream.DB.Open","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"824:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@824:2","span":{"start":[824,2],"end":[824,14],"bytes":[27919,27931]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"826:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@826:3","span":{"start":[826,3],"end":[826,17],"bytes":[27950,27964]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock"},"830:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@830:22","span":{"start":[830,22],"end":[830,62],"bytes":[28084,28124]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"830:41":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@830:41","span":{"start":[830,41],"end":[830,61],"bytes":[28103,28123]},"callee":"can://litestream/litestream/@external/context/Background"},"831:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@831:2","span":{"start":[831,2],"end":[831,16],"bytes":[28126,28140]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock"},"834:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@834:2","span":{"start":[834,2],"end":[834,18],"bytes":[28204,28220]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics"},"838:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@838:10","span":{"start":[838,10],"end":[838,64],"bytes":[28288,28342]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"841:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@841:10","span":{"start":[841,10],"end":[841,71],"bytes":[28386,28447]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"844:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@844:10","span":{"start":[844,10],"end":[844,62],"bytes":[28493,28545]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"848:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@848:12","span":{"start":[848,12],"end":[848,39],"bytes":[28628,28655]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles"},"849:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@849:10","span":{"start":[849,10],"end":[849,56],"bytes":[28679,28725]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"859:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@859:3","span":{"start":[859,3],"end":[859,15],"bytes":[29037,29049]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"860:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@860:6","span":{"start":[860,6],"end":[860,51],"bytes":[29055,29100]},"callee":null,"is_goroutine":true},"864:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@864:2","span":{"start":[864,2],"end":[864,14],"bytes":[29163,29175]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"866:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open@866:2","span":{"start":[866,2],"end":[866,16],"bytes":[29195,29209]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open/github.com/benbjohnson/litestream.DB.Open.closure_1","kind":"function","span":{"start":[860,1],"end":[860,51],"bytes":[29050,29100]},"signature":"github.com/benbjohnson/litestream.DB.Open.closure_1","parameters":[],"body":{"860:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open/github.com/benbjohnson/litestream.DB.Open.closure_1@860:21","span":{"start":[860,21],"end":[860,33],"bytes":[29070,29082]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"860:35":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open/github.com/benbjohnson/litestream.DB.Open.closure_1@860:35","span":{"start":[860,35],"end":[860,47],"bytes":[29084,29096]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor"}}}}},"github.com/benbjohnson/litestream.DB.PageSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize","kind":"method","span":{"start":[714,1],"end":[718,2],"bytes":[24611,24701]},"signature":"github.com/benbjohnson/litestream.DB.PageSize","parameters":[],"return_type":"int","metrics":{"cyclomatic":1},"body":{"715:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize@715:2","span":{"start":[715,2],"end":[715,15],"bytes":[24643,24656]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"},"716:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize@716:8","span":{"start":[716,8],"end":[716,23],"bytes":[24664,24679]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","is_deferred":true}}},"github.com/benbjohnson/litestream.DB.Path":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","kind":"method","span":{"start":[438,1],"end":[440,2],"bytes":[16743,16790]},"signature":"github.com/benbjohnson/litestream.DB.Path","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.Pos":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","kind":"method","span":{"start":[663,1],"end":[694,2],"bytes":[23260,24036]},"signature":"github.com/benbjohnson/litestream.DB.Pos","parameters":[],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"664:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@664:2","span":{"start":[664,2],"end":[664,15],"bytes":[23300,23313]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"665:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@665:8","span":{"start":[665,8],"end":[665,23],"bytes":[23321,23336]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"671:27":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@671:27","span":{"start":[671,27],"end":[671,38],"bytes":[23422,23433]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"678:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@678:13","span":{"start":[678,13],"end":[678,44],"bytes":[23563,23594]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"679:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@679:12","span":{"start":[679,12],"end":[679,28],"bytes":[23606,23622]},"callee":"can://litestream/litestream/@external/os/Open"},"681:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@681:21","span":{"start":[681,21],"end":[681,91],"bytes":[23660,23730]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"681:53":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@681:53","span":{"start":[681,53],"end":[681,68],"bytes":[23692,23707]},"callee":null},"681:70":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@681:70","span":{"start":[681,70],"end":[681,85],"bytes":[23709,23724]},"callee":null},"683:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@683:8","span":{"start":[683,8],"end":[683,34],"bytes":[23741,23767]},"callee":null,"is_deferred":true},"685:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@685:9","span":{"start":[685,9],"end":[685,26],"bytes":[23777,23794]},"callee":null},"686:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@686:12","span":{"start":[686,12],"end":[686,24],"bytes":[23806,23818]},"callee":null},"687:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@687:21","span":{"start":[687,21],"end":[687,132],"bytes":[23853,23964]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"687:55":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@687:55","span":{"start":[687,55],"end":[687,70],"bytes":[23887,23902]},"callee":null},"687:72":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@687:72","span":{"start":[687,72],"end":[687,87],"bytes":[23904,23919]},"callee":null},"687:89":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@687:89","span":{"start":[687,89],"end":[687,131],"bytes":[23921,23963]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"690:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos@690:9","span":{"start":[690,9],"end":[690,27],"bytes":[23977,23995]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos/github.com/benbjohnson/litestream.DB.Pos.closure_1","kind":"function","span":{"start":[683,1],"end":[683,34],"bytes":[23734,23767]},"signature":"github.com/benbjohnson/litestream.DB.Pos.closure_1","parameters":[],"body":{"683:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos/github.com/benbjohnson/litestream.DB.Pos.closure_1@683:21","span":{"start":[683,21],"end":[683,30],"bytes":[23754,23763]},"callee":"can://litestream/litestream/@external/os/File.Close"}}}}},"github.com/benbjohnson/litestream.DB.RecordSuccessfulSync":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","kind":"method","span":{"start":[722,1],"end":[726,2],"bytes":[24843,24993]},"signature":"github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","parameters":[],"metrics":{"cyclomatic":1},"body":{"723:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync@723:2","span":{"start":[723,2],"end":[723,32],"bytes":[24883,24913]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"724:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync@724:8","span":{"start":[724,8],"end":[724,40],"bytes":[24921,24953]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true},"725:28":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync@725:28","span":{"start":[725,28],"end":[725,38],"bytes":[24981,24991]},"callee":"can://litestream/litestream/@external/time/Now"}}},"github.com/benbjohnson/litestream.DB.ResetLocalState":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","kind":"method","span":{"start":[578,1],"end":[597,2],"bytes":[20547,21132]},"signature":"github.com/benbjohnson/litestream.DB.ResetLocalState","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[578,1],"end":[578,59],"bytes":[20547,20605]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"579:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@579:2","span":{"start":[579,2],"end":[581,26],"bytes":[20607,20711]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"581:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@581:14","span":{"start":[581,14],"end":[581,25],"bytes":[20699,20710]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"584:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@584:12","span":{"start":[584,12],"end":[584,37],"bytes":[20749,20774]},"callee":"can://litestream/litestream/@external/os/RemoveAll"},"584:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@584:25","span":{"start":[584,25],"end":[584,36],"bytes":[20762,20773]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir"},"584:54":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@584:54","span":{"start":[584,54],"end":[584,72],"bytes":[20791,20809]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"585:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@585:10","span":{"start":[585,10],"end":[585,53],"bytes":[20821,20864]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"589:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@589:2","span":{"start":[589,2],"end":[589,27],"bytes":[20901,20926]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"590:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@590:25","span":{"start":[590,25],"end":[590,52],"bytes":[20951,20978]},"callee":null},"591:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@591:2","span":{"start":[591,2],"end":[591,29],"bytes":[20980,21007]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"593:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@593:2","span":{"start":[593,2],"end":[593,25],"bytes":[21010,21033]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"595:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState@595:2","span":{"start":[595,2],"end":[595,84],"bytes":[21036,21118]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"}}},"github.com/benbjohnson/litestream.DB.SQLDB":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SQLDB","kind":"method","span":{"start":[433,1],"end":[435,2],"bytes":[16652,16699]},"signature":"github.com/benbjohnson/litestream.DB.SQLDB","parameters":[],"return_type":"*database/sql.DB","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.SetLogger":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","kind":"method","span":{"start":[419,1],"end":[430,2],"bytes":[16254,16584]},"signature":"github.com/benbjohnson/litestream.DB.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[419,1],"end":[419,47],"bytes":[16254,16300]}}],"metrics":{"cyclomatic":4},"body":{"421:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger@421:12","span":{"start":[421,12],"end":[421,26],"bytes":[16332,16346]},"callee":"can://litestream/litestream/@external/log/slog/Default"},"425:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger@425:26","span":{"start":[425,26],"end":[425,77],"bytes":[16421,16472]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"425:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger@425:3","span":{"start":[425,3],"end":[425,78],"bytes":[16398,16473]},"callee":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.setLogger"},"428:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger@428:3","span":{"start":[428,3],"end":[428,51],"bytes":[16531,16579]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger"},"428:31":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger@428:31","span":{"start":[428,31],"end":[428,50],"bytes":[16559,16578]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}}},"github.com/benbjohnson/litestream.DB.SetMetaPath":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetMetaPath","kind":"method","span":{"start":[566,1],"end":[568,2],"bytes":[20158,20220]},"signature":"github.com/benbjohnson/litestream.DB.SetMetaPath","parameters":[{"name":"path","type":"string","span":{"start":[566,1],"end":[566,41],"bytes":[20158,20198]}}],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.Snapshot":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","kind":"method","span":{"start":[3007,1],"end":[3024,2],"bytes":[96361,96783]},"signature":"github.com/benbjohnson/litestream.DB.Snapshot","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[3007,1],"end":[3007,69],"bytes":[96361,96429]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"3008:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot@3008:17","span":{"start":[3008,17],"end":[3008,39],"bytes":[96446,96468]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader"},"3012:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot@3012:8","span":{"start":[3012,8],"end":[3012,34],"bytes":[96514,96540]},"callee":null,"is_deferred":true},"3014:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot@3014:15","span":{"start":[3014,15],"end":[3014,81],"bytes":[96556,96622]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile"},"3019:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot@3019:2","span":{"start":[3019,2],"end":[3019,27],"bytes":[96664,96689]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"3021:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot@3021:2","span":{"start":[3021,2],"end":[3021,29],"bytes":[96735,96762]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot/github.com/benbjohnson/litestream.DB.Snapshot.closure_1","kind":"function","span":{"start":[3012,1],"end":[3012,34],"bytes":[96507,96540]},"signature":"github.com/benbjohnson/litestream.DB.Snapshot.closure_1","parameters":[],"body":{"3012:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot/github.com/benbjohnson/litestream.DB.Snapshot.closure_1@3012:21","span":{"start":[3012,21],"end":[3012,30],"bytes":[96527,96536]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}}}},"github.com/benbjohnson/litestream.DB.SnapshotReader":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","kind":"method","span":{"start":[2782,1],"end":[2794,2],"bytes":[89442,89739]},"signature":"github.com/benbjohnson/litestream.DB.SnapshotReader","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2782,1],"end":[2782,84],"bytes":[89442,89525]}}],"return_type":"(invalid type, io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"2783:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader@2783:14","span":{"start":[2783,14],"end":[2783,38],"bytes":[89539,89563]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition"},"2788:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader@2788:12","span":{"start":[2788,12],"end":[2788,39],"bytes":[89625,89652]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader"},"2790:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader@2790:3","span":{"start":[2790,3],"end":[2790,14],"bytes":[89672,89683]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close"}}},"github.com/benbjohnson/litestream.DB.Sync":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","kind":"method","span":{"start":[1286,1],"end":[1299,2],"bytes":[41251,41557]},"signature":"github.com/benbjohnson/litestream.DB.Sync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1286,1],"end":[1286,48],"bytes":[41251,41298]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"1288:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync@1288:13","span":{"start":[1288,13],"end":[1288,22],"bytes":[41318,41327]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"1289:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync@1289:11","span":{"start":[1289,11],"end":[1289,29],"bytes":[41352,41370]},"callee":"can://litestream/litestream/@external/context/Cause"},"1292:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync@1292:18","span":{"start":[1292,18],"end":[1292,54],"bytes":[41393,41429]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce"}}},"github.com/benbjohnson/litestream.DB.SyncAndWait":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","kind":"method","span":{"start":[769,1],"end":[781,2],"bytes":[26300,26616]},"signature":"github.com/benbjohnson/litestream.DB.SyncAndWait","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[769,1],"end":[769,55],"bytes":[26300,26354]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"771:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait@771:10","span":{"start":[771,10],"end":[771,45],"bytes":[26388,26423]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"774:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait@774:12","span":{"start":[774,12],"end":[774,24],"bytes":[26439,26451]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync"},"775:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait@775:10","span":{"start":[775,10],"end":[775,40],"bytes":[26475,26505]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"777:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait@777:12","span":{"start":[777,12],"end":[777,32],"bytes":[26520,26540]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync"},"778:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait@778:10","span":{"start":[778,10],"end":[778,45],"bytes":[26564,26599]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.DB.SyncDiagnostic":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","kind":"method","span":{"start":[443,1],"end":[482,2],"bytes":[16866,18214]},"signature":"github.com/benbjohnson/litestream.DB.SyncDiagnostic","parameters":[],"return_type":"github.com/benbjohnson/litestream.SyncDiagnostic","metrics":{"cyclomatic":6},"body":{"444:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@444:2","span":{"start":[444,2],"end":[444,21],"bytes":[16915,16934]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"},"445:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@445:8","span":{"start":[445,8],"end":[445,29],"bytes":[16942,16963]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","is_deferred":true},"450:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@450:24","span":{"start":[450,24],"end":[450,53],"bytes":[17088,17117]},"callee":null},"451:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@451:24","span":{"start":[451,24],"end":[451,49],"bytes":[17142,17167]},"callee":null},"452:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@452:24","span":{"start":[452,24],"end":[452,48],"bytes":[17192,17216]},"callee":null},"461:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@461:6","span":{"start":[461,6],"end":[461,46],"bytes":[17565,17605]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"464:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@464:30","span":{"start":[464,30],"end":[464,83],"bytes":[17724,17777]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"464:30/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@464:30/2","span":{"start":[464,30],"end":[464,73],"bytes":[17724,17767]},"callee":"can://litestream/litestream/@external/time/Since"},"466:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@466:6","span":{"start":[466,6],"end":[466,36],"bytes":[17786,17816]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"470:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@470:6","span":{"start":[470,6],"end":[470,36],"bytes":[17894,17924]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"474:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@474:6","span":{"start":[474,6],"end":[474,36],"bytes":[18002,18032]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"476:28":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@476:28","span":{"start":[476,28],"end":[476,40],"bytes":[18093,18105]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"477:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@477:10","span":{"start":[477,10],"end":[477,20],"bytes":[18117,18127]},"callee":"can://litestream/litestream/@external/time/Now"},"479:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@479:25","span":{"start":[479,25],"end":[479,65],"bytes":[18156,18196]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"479:25/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic@479:25/2","span":{"start":[479,25],"end":[479,55],"bytes":[18156,18186]},"callee":"can://litestream/litestream/@external/time/Time.Sub"}}},"github.com/benbjohnson/litestream.DB.SyncStatus":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus","kind":"method","span":{"start":[745,1],"end":[765,2],"bytes":[25625,26171]},"signature":"github.com/benbjohnson/litestream.DB.SyncStatus","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[745,1],"end":[745,68],"bytes":[25625,25692]}}],"return_type":"(github.com/benbjohnson/litestream.SyncStatus, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"747:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus@747:24","span":{"start":[747,24],"end":[747,59],"bytes":[25740,25775]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"750:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus@750:19","span":{"start":[750,19],"end":[750,27],"bytes":[25798,25806]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"752:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus@752:24","span":{"start":[752,24],"end":[752,61],"bytes":[25847,25884]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"755:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus@755:20","span":{"start":[755,20],"end":[755,43],"bytes":[25908,25931]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos"},"757:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus@757:24","span":{"start":[757,24],"end":[757,62],"bytes":[25972,26010]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.DB.WALPath":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","kind":"method","span":{"start":[556,1],"end":[558,2],"bytes":[19934,19993]},"signature":"github.com/benbjohnson/litestream.DB.WALPath","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.DB.acquireReadLock":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","kind":"method","span":{"start":[1244,1],"end":[1267,2],"bytes":[39962,40703]},"signature":"github.com/benbjohnson/litestream.DB.acquireReadLock","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1244,1],"end":[1244,59],"bytes":[39962,40020]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1253:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock@1253:13","span":{"start":[1253,13],"end":[1253,59],"bytes":[40358,40404]},"callee":"can://litestream/litestream/@external/database/sql/DB.BeginTx"},"1253:27":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock@1253:27","span":{"start":[1253,27],"end":[1253,53],"bytes":[40372,40398]},"callee":"can://litestream/litestream/@external/context/WithoutCancel"},"1259:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock@1259:15","span":{"start":[1259,15],"end":[1259,75],"bytes":[40497,40557]},"callee":"can://litestream/litestream/@external/database/sql/Tx.ExecContext"},"1260:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock@1260:7","span":{"start":[1260,7],"end":[1260,20],"bytes":[40578,40591]},"callee":"can://litestream/litestream/@external/database/sql/Tx.Rollback"}}},"github.com/benbjohnson/litestream.DB.applySyncExecutor":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","kind":"method","span":{"start":[2025,1],"end":[2054,2],"bytes":[65496,66196]},"signature":"github.com/benbjohnson/litestream.DB.applySyncExecutor","parameters":[{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[2025,1],"end":[2025,67],"bytes":[65496,65562]}},{"name":"notify","type":"bool","span":{"start":[2025,1],"end":[2025,67],"bytes":[65496,65562]}}],"metrics":{"cyclomatic":5},"body":{"2034:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor@2034:3","span":{"start":[2034,3],"end":[2034,16],"bytes":[65826,65839]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"2037:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor@2037:3","span":{"start":[2037,3],"end":[2037,18],"bytes":[65882,65897]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"2041:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor@2041:3","span":{"start":[2041,3],"end":[2041,28],"bytes":[65933,65958]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"2044:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor@2044:3","span":{"start":[2044,3],"end":[2044,30],"bytes":[66022,66049]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"2047:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor@2047:2","span":{"start":[2047,2],"end":[2047,14],"bytes":[66055,66067]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"2050:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor@2050:3","span":{"start":[2050,3],"end":[2050,19],"bytes":[66125,66141]},"callee":null},"2051:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor@2051:15","span":{"start":[2051,15],"end":[2051,34],"bytes":[66156,66175]},"callee":null},"2053:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor@2053:2","span":{"start":[2053,2],"end":[2053,16],"bytes":[66180,66194]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock"}}},"github.com/benbjohnson/litestream.DB.applySyncResult":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncResult","kind":"method","span":{"start":[1989,1],"end":[2002,2],"bytes":[64732,65122]},"signature":"github.com/benbjohnson/litestream.DB.applySyncResult","parameters":[{"name":"state","type":"*github.com/benbjohnson/litestream.syncState","span":{"start":[1989,1],"end":[1989,69],"bytes":[64732,64800]}},{"name":"result","type":"github.com/benbjohnson/litestream.syncResult","span":{"start":[1989,1],"end":[1989,69],"bytes":[64732,64800]}}],"metrics":{"cyclomatic":3},"body":{"1993:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncResult@1993:3","span":{"start":[1993,3],"end":[1993,16],"bytes":[64920,64933]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"1995:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncResult@1995:3","span":{"start":[1995,3],"end":[1995,18],"bytes":[64964,64979]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"1998:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncResult@1998:3","span":{"start":[1998,3],"end":[1998,28],"bytes":[65016,65041]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"2000:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncResult@2000:3","span":{"start":[2000,3],"end":[2000,30],"bytes":[65090,65117]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}}},"github.com/benbjohnson/litestream.DB.beginSyncDiag":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","kind":"method","span":{"start":[484,1],"end":[502,2],"bytes":[18216,18753]},"signature":"github.com/benbjohnson/litestream.DB.beginSyncDiag","parameters":[{"name":"operation","type":"github.com/benbjohnson/litestream.diagOp","span":{"start":[484,1],"end":[484,48],"bytes":[18216,18263]}}],"metrics":{"cyclomatic":1},"body":{"485:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag@485:9","span":{"start":[485,9],"end":[485,19],"bytes":[18272,18282]},"callee":"can://litestream/litestream/@external/time/Now"},"486:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag@486:16","span":{"start":[486,16],"end":[486,32],"bytes":[18298,18314]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize"},"488:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag@488:2","span":{"start":[488,2],"end":[488,20],"bytes":[18317,18335]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"501:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag@501:2","span":{"start":[501,2],"end":[501,22],"bytes":[18731,18751]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock"}}},"github.com/benbjohnson/litestream.DB.beginSyncExecutorWait":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","kind":"method","span":{"start":[530,1],"end":[537,2],"bytes":[19293,19510]},"signature":"github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","parameters":[],"metrics":{"cyclomatic":2},"body":{"531:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait@531:2","span":{"start":[531,2],"end":[531,20],"bytes":[19334,19352]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"532:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait@532:8","span":{"start":[532,8],"end":[532,28],"bytes":[19360,19380]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true},"534:37":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait@534:37","span":{"start":[534,37],"end":[534,47],"bytes":[19460,19470]},"callee":"can://litestream/litestream/@external/time/Now"}}},"github.com/benbjohnson/litestream.DB.bumpLitestreamSeq":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","kind":"method","span":{"start":[1638,1],"end":[1641,2],"bytes":[53165,53373]},"signature":"github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1638,1],"end":[1638,61],"bytes":[53165,53225]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"1639:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq@1639:12","span":{"start":[1639,12],"end":[1639,134],"bytes":[53237,53359]},"callee":"can://litestream/litestream/@external/database/sql/DB.ExecContext"}}},"github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","kind":"method","span":{"start":[1660,1],"end":[1737,2],"bytes":[54138,56383]},"signature":"github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1660,1],"end":[1660,70],"bytes":[54138,54207]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"1662:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1662:16","span":{"start":[1662,16],"end":[1662,24],"bytes":[54269,54277]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"1664:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1664:10","span":{"start":[1664,10],"end":[1664,54],"bytes":[54304,54348]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1668:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1668:22","span":{"start":[1668,22],"end":[1668,55],"bytes":[54411,54444]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo"},"1670:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1670:10","span":{"start":[1670,10],"end":[1670,53],"bytes":[54471,54514]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1680:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1680:2","span":{"start":[1680,2],"end":[1682,39],"bytes":[54728,54842]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"1685:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1685:11","span":{"start":[1685,11],"end":[1685,28],"bytes":[54879,54896]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir"},"1686:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1686:12","span":{"start":[1686,12],"end":[1686,31],"bytes":[54908,54927]},"callee":"can://litestream/litestream/@external/os/RemoveAll"},"1686:48":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1686:48","span":{"start":[1686,48],"end":[1686,66],"bytes":[54944,54962]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"1687:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1687:10","span":{"start":[1687,10],"end":[1687,52],"bytes":[54974,55016]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1689:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1689:2","span":{"start":[1689,2],"end":[1689,25],"bytes":[55021,55044]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"1690:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1690:12","span":{"start":[1690,12],"end":[1690,48],"bytes":[55056,55092]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"1691:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1691:10","span":{"start":[1691,10],"end":[1691,54],"bytes":[55116,55160]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1696:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1696:17","span":{"start":[1696,17],"end":[1696,78],"bytes":[55285,55346]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"1698:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1698:10","span":{"start":[1698,10],"end":[1698,52],"bytes":[55373,55415]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1700:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1700:8","span":{"start":[1700,8],"end":[1700,39],"bytes":[55426,55457]},"callee":null,"is_deferred":true},"1703:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1703:15","span":{"start":[1703,15],"end":[1703,46],"bytes":[55518,55549]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"1706:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1706:18","span":{"start":[1706,18],"end":[1706,36],"bytes":[55599,55617]},"callee":"can://litestream/litestream/@external/os/Create"},"1708:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1708:10","span":{"start":[1708,10],"end":[1708,52],"bytes":[55644,55686]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1710:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1710:8","span":{"start":[1710,8],"end":[1710,43],"bytes":[55697,55732]},"callee":null,"is_deferred":true},"1712:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1712:15","span":{"start":[1712,15],"end":[1712,39],"bytes":[55779,55803]},"callee":"can://litestream/litestream/@external/io/Copy"},"1713:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1713:7","span":{"start":[1713,7],"end":[1713,22],"bytes":[55824,55839]},"callee":"can://litestream/litestream/@external/os/File.Close"},"1714:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1714:10","span":{"start":[1714,10],"end":[1714,45],"bytes":[55849,55884]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1717:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1717:12","span":{"start":[1717,12],"end":[1717,26],"bytes":[55900,55914]},"callee":"can://litestream/litestream/@external/os/File.Sync"},"1718:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1718:7","span":{"start":[1718,7],"end":[1718,22],"bytes":[55935,55950]},"callee":"can://litestream/litestream/@external/os/File.Close"},"1719:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1719:10","span":{"start":[1719,10],"end":[1719,45],"bytes":[55960,55995]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1722:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1722:12","span":{"start":[1722,12],"end":[1722,27],"bytes":[56011,56026]},"callee":"can://litestream/litestream/@external/os/File.Close"},"1723:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1723:10","span":{"start":[1723,10],"end":[1723,46],"bytes":[56050,56086]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1727:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1727:12","span":{"start":[1727,12],"end":[1727,41],"bytes":[56148,56177]},"callee":"can://litestream/litestream/@external/os/Rename"},"1728:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1728:10","span":{"start":[1728,10],"end":[1728,47],"bytes":[56201,56238]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1730:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1730:2","span":{"start":[1730,2],"end":[1730,25],"bytes":[56243,56266]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"1732:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica@1732:2","span":{"start":[1732,2],"end":[1734,23],"bytes":[56269,56368]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_1","kind":"function","span":{"start":[1700,1],"end":[1700,39],"bytes":[55419,55457]},"signature":"github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_1","parameters":[],"body":{"1700:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_1@1700:21","span":{"start":[1700,21],"end":[1700,35],"bytes":[55439,55453]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}},"closure_2":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_2","kind":"function","span":{"start":[1710,1],"end":[1710,74],"bytes":[55690,55763]},"signature":"github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_2","parameters":[],"body":{"1710:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_2@1710:21","span":{"start":[1710,21],"end":[1710,39],"bytes":[55710,55728]},"callee":"can://litestream/litestream/@external/os/Remove"}}}}},"github.com/benbjohnson/litestream.DB.checkpoint":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","kind":"method","span":{"start":[2491,1],"end":[2517,2],"bytes":[79907,80471]},"signature":"github.com/benbjohnson/litestream.DB.checkpoint","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2491,1],"end":[2491,85],"bytes":[79907,79991]}},{"name":"mode","type":"string","span":{"start":[2491,1],"end":[2491,85],"bytes":[79907,79991]}},{"name":"state","type":"*github.com/benbjohnson/litestream.syncState","span":{"start":[2491,1],"end":[2491,85],"bytes":[79907,79991]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"2492:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint@2492:14","span":{"start":[2492,14],"end":[2492,22],"bytes":[80005,80013]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"2494:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint@2494:10","span":{"start":[2494,10],"end":[2494,36],"bytes":[80040,80066]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2501:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint@2501:15","span":{"start":[2501,15],"end":[2501,57],"bytes":[80143,80185]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"2506:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint@2506:2","span":{"start":[2506,2],"end":[2506,15],"bytes":[80239,80252]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"2509:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint@2509:2","span":{"start":[2509,2],"end":[2509,17],"bytes":[80291,80306]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"2511:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint@2511:3","span":{"start":[2511,3],"end":[2511,28],"bytes":[80338,80363]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"2514:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint@2514:3","span":{"start":[2514,3],"end":[2514,30],"bytes":[80427,80454]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}}},"github.com/benbjohnson/litestream.DB.checkpointIfNeeded":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","kind":"method","span":{"start":[1478,1],"end":[1565,2],"bytes":[47383,50904]},"signature":"github.com/benbjohnson/litestream.DB.checkpointIfNeeded","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1478,1],"end":[1478,113],"bytes":[47383,47495]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[1478,1],"end":[1478,113],"bytes":[47383,47495]}},{"name":"origWALSize","type":"int64","span":{"start":[1478,1],"end":[1478,113],"bytes":[47383,47495]}},{"name":"newWALSize","type":"int64","span":{"start":[1478,1],"end":[1478,113],"bytes":[47383,47495]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":19},"body":{"1482:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1482:6","span":{"start":[1482,6],"end":[1482,65],"bytes":[47540,47599]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1488:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1488:5","span":{"start":[1488,5],"end":[1488,45],"bytes":[47799,47839]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1489:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1489:24","span":{"start":[1489,24],"end":[1489,93],"bytes":[47865,47934]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize"},"1489:36":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1489:36","span":{"start":[1489,36],"end":[1489,55],"bytes":[47877,47896]},"callee":null},"1489:57":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1489:57","span":{"start":[1489,57],"end":[1489,92],"bytes":[47898,47933]},"callee":null},"1489:64":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1489:64","span":{"start":[1489,64],"end":[1489,91],"bytes":[47905,47932]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN"},"1495:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1495:25","span":{"start":[1495,25],"end":[1495,84],"bytes":[48195,48254]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"1496:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1496:9","span":{"start":[1496,9],"end":[1496,31],"bytes":[48277,48299]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError"},"1500:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1500:5","span":{"start":[1500,5],"end":[1500,101],"bytes":[48372,48468]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"1503:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1503:9","span":{"start":[1503,9],"end":[1503,68],"bytes":[48547,48606]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1504:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1504:6","span":{"start":[1504,6],"end":[1506,38],"bytes":[48614,48766]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"1514:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1514:3","span":{"start":[1514,3],"end":[1516,35],"bytes":[48885,48993]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"1517:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1517:21","span":{"start":[1517,21],"end":[1517,81],"bytes":[49014,49074]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"1518:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1518:20","span":{"start":[1518,20],"end":[1518,79],"bytes":[49094,49153]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1525:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1525:19","span":{"start":[1525,19],"end":[1525,82],"bytes":[49306,49369]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize"},"1525:31":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1525:31","span":{"start":[1525,31],"end":[1525,50],"bytes":[49318,49337]},"callee":null},"1525:52":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1525:52","span":{"start":[1525,52],"end":[1525,81],"bytes":[49339,49368]},"callee":null},"1526:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1526:16","span":{"start":[1526,16],"end":[1526,75],"bytes":[49387,49446]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"1529:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1529:7","span":{"start":[1529,7],"end":[1529,29],"bytes":[49618,49640]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError"},"1530:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1530:5","span":{"start":[1530,5],"end":[1530,101],"bytes":[49647,49743]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"1544:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1544:14","span":{"start":[1544,14],"end":[1544,25],"bytes":[50196,50207]},"callee":"can://litestream/litestream/@external/os/File.Stat"},"1546:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1546:11","span":{"start":[1546,11],"end":[1546,47],"bytes":[50236,50272]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1550:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1550:17","span":{"start":[1550,17],"end":[1550,29],"bytes":[50358,50370]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime"},"1550:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1550:6","span":{"start":[1550,6],"end":[1550,30],"bytes":[50347,50371]},"callee":"can://litestream/litestream/@external/time/Since"},"1550:71":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1550:71","span":{"start":[1550,71],"end":[1550,106],"bytes":[50412,50447]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize"},"1550:83":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1550:83","span":{"start":[1550,83],"end":[1550,102],"bytes":[50424,50443]},"callee":null},"1551:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1551:17","span":{"start":[1551,17],"end":[1551,76],"bytes":[50466,50525]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor"},"1554:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1554:8","span":{"start":[1554,8],"end":[1554,30],"bytes":[50700,50722]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError"},"1555:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded@1555:6","span":{"start":[1555,6],"end":[1555,102],"bytes":[50730,50826]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"}}},"github.com/benbjohnson/litestream.DB.checkpointWithExecutor":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","kind":"method","span":{"start":[2522,1],"end":[2706,2],"bytes":[80699,86958]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2522,1],"end":[2522,124],"bytes":[80699,80822]}},{"name":"mode","type":"string","span":{"start":[2522,1],"end":[2522,124],"bytes":[80699,80822]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[2522,1],"end":[2522,124],"bytes":[80699,80822]}}],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":25},"body":{"2524:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2524:2","span":{"start":[2524,2],"end":[2528,5],"bytes":[80858,81015]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2531:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2531:6","span":{"start":[2531,6],"end":[2531,24],"bytes":[81134,81152]},"callee":"can://litestream/litestream/@external/sync/RWMutex.TryLock"},"2533:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2533:4","span":{"start":[2533,4],"end":[2533,76],"bytes":[81196,81268]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"2535:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2535:4","span":{"start":[2535,4],"end":[2535,101],"bytes":[81283,81380]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"2539:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2539:8","span":{"start":[2539,8],"end":[2539,25],"bytes":[81415,81432]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true},"2543:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2543:2","span":{"start":[2543,2],"end":[2547,5],"bytes":[81541,81707]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2548:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2548:14","span":{"start":[2548,14],"end":[2548,41],"bytes":[81721,81748]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"2548:28":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2548:28","span":{"start":[2548,28],"end":[2548,40],"bytes":[81735,81747]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2554:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2554:2","span":{"start":[2554,2],"end":[2558,5],"bytes":[81858,82021]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2559:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2559:17","span":{"start":[2559,17],"end":[2559,65],"bytes":[82038,82086]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"2561:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2561:17","span":{"start":[2561,17],"end":[2561,73],"bytes":[82120,82176]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2563:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2563:2","span":{"start":[2563,2],"end":[2563,30],"bytes":[82181,82209]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2567:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2567:20","span":{"start":[2567,20],"end":[2567,43],"bytes":[82289,82312]},"callee":"can://litestream/litestream/@external/database/sql/DB.BeginTx"},"2569:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2569:18","span":{"start":[2569,18],"end":[2569,73],"bytes":[82348,82403]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2571:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2571:9","span":{"start":[2571,9],"end":[2575,6],"bytes":[82416,82488]},"callee":null,"is_deferred":true},"2577:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2577:16","span":{"start":[2577,16],"end":[2577,91],"bytes":[82505,82580]},"callee":"can://litestream/litestream/@external/database/sql/Tx.ExecContext"},"2578:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2578:18","span":{"start":[2578,18],"end":[2578,57],"bytes":[82612,82651]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2581:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2581:17","span":{"start":[2581,17],"end":[2581,65],"bytes":[82673,82721]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"2583:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2583:18","span":{"start":[2583,18],"end":[2583,82],"bytes":[82757,82821]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2585:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2585:3","span":{"start":[2585,3],"end":[2585,31],"bytes":[82828,82856]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2588:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2588:15","span":{"start":[2588,15],"end":[2588,54],"bytes":[82875,82914]},"callee":null},"2591:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2591:25","span":{"start":[2591,25],"end":[2591,90],"bytes":[83018,83083]},"callee":null},"2596:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2596:2","span":{"start":[2596,2],"end":[2600,5],"bytes":[83190,83347]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2601:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2601:20","span":{"start":[2601,20],"end":[2601,48],"bytes":[83367,83395]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint"},"2607:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2607:12","span":{"start":[2607,12],"end":[2607,31],"bytes":[83471,83490]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback"},"2608:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2608:18","span":{"start":[2608,18],"end":[2608,76],"bytes":[83522,83580]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2613:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2613:11","span":{"start":[2613,11],"end":[2613,36],"bytes":[83617,83642]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq"},"2614:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2614:17","span":{"start":[2614,17],"end":[2614,59],"bytes":[83673,83715]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2618:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2618:2","span":{"start":[2618,2],"end":[2622,5],"bytes":[83761,83927]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2623:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2623:16","span":{"start":[2623,16],"end":[2623,43],"bytes":[83943,83970]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"2623:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2623:30","span":{"start":[2623,30],"end":[2623,42],"bytes":[83957,83969]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2626:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2626:12","span":{"start":[2626,12],"end":[2626,35],"bytes":[84019,84042]},"callee":"can://litestream/litestream/@external/bytes/Equal"},"2633:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2633:17","span":{"start":[2633,17],"end":[2633,65],"bytes":[84206,84254]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"2635:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2635:18","span":{"start":[2635,18],"end":[2635,81],"bytes":[84290,84353]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2637:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2637:3","span":{"start":[2637,3],"end":[2637,31],"bytes":[84360,84388]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2649:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2649:17","span":{"start":[2649,17],"end":[2649,65],"bytes":[84925,84973]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"2651:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2651:18","span":{"start":[2651,18],"end":[2651,73],"bytes":[85009,85064]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2653:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2653:3","span":{"start":[2653,3],"end":[2653,31],"bytes":[85071,85099]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2659:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2659:2","span":{"start":[2659,2],"end":[2663,5],"bytes":[85233,85406]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2664:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2664:13","span":{"start":[2664,13],"end":[2664,36],"bytes":[85419,85442]},"callee":"can://litestream/litestream/@external/database/sql/DB.BeginTx"},"2666:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2666:17","span":{"start":[2666,17],"end":[2666,45],"bytes":[85476,85504]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2668:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2668:8","span":{"start":[2668,8],"end":[2668,37],"bytes":[85515,85544]},"callee":null,"is_deferred":true},"2674:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2674:15","span":{"start":[2674,15],"end":[2674,83],"bytes":[85849,85917]},"callee":"can://litestream/litestream/@external/database/sql/Tx.ExecContext"},"2675:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2675:17","span":{"start":[2675,17],"end":[2675,56],"bytes":[85948,85987]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2679:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2679:2","span":{"start":[2679,2],"end":[2683,5],"bytes":[86056,86225]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2686:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2686:17","span":{"start":[2686,17],"end":[2686,52],"bytes":[86300,86335]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"2687:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2687:17","span":{"start":[2687,17],"end":[2687,52],"bytes":[86353,86388]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"2691:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2691:16","span":{"start":[2691,16],"end":[2691,57],"bytes":[86478,86519]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync"},"2693:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2693:17","span":{"start":[2693,17],"end":[2693,72],"bytes":[86553,86608]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2695:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2695:2","span":{"start":[2695,2],"end":[2695,30],"bytes":[86613,86641]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"2700:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2700:12","span":{"start":[2700,12],"end":[2700,24],"bytes":[86799,86811]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback"},"2701:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor@2701:17","span":{"start":[2701,17],"end":[2701,67],"bytes":[86842,86892]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_1","kind":"function","span":{"start":[2525,1],"end":[2528,5],"bytes":[80903,81015]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_1","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2525,1],"end":[2525,23],"bytes":[80903,80925]}}],"body":{}},"closure_2":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_2","kind":"function","span":{"start":[2544,1],"end":[2547,5],"bytes":[81595,81707]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_2","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2544,1],"end":[2544,23],"bytes":[81595,81617]}}],"body":{}},"closure_3":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_3","kind":"function","span":{"start":[2555,1],"end":[2558,5],"bytes":[81909,82021]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_3","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2555,1],"end":[2555,23],"bytes":[81909,81931]}}],"body":{}},"closure_4":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_4","kind":"function","span":{"start":[2571,1],"end":[2575,6],"bytes":[82408,82488]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_4","parameters":[],"body":{"2573:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_4@2573:9","span":{"start":[2573,9],"end":[2573,28],"bytes":[82458,82477]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback"}}},"closure_5":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_5","kind":"function","span":{"start":[2597,1],"end":[2600,5],"bytes":[83235,83347]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_5","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2597,1],"end":[2597,23],"bytes":[83235,83257]}}],"body":{}},"closure_6":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_6","kind":"function","span":{"start":[2619,1],"end":[2622,5],"bytes":[83815,83927]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_6","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2619,1],"end":[2619,23],"bytes":[83815,83837]}}],"body":{}},"closure_7":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_7","kind":"function","span":{"start":[2660,1],"end":[2663,5],"bytes":[85294,85406]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_7","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2660,1],"end":[2660,23],"bytes":[85294,85316]}}],"body":{}},"closure_8":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_8","kind":"function","span":{"start":[2668,1],"end":[2668,37],"bytes":[85508,85544]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_8","parameters":[],"body":{"2668:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_8@2668:21","span":{"start":[2668,21],"end":[2668,33],"bytes":[85528,85540]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback"}}},"closure_9":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_9","kind":"function","span":{"start":[2680,1],"end":[2683,5],"bytes":[86113,86225]},"signature":"github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_9","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2680,1],"end":[2680,23],"bytes":[86113,86135]}}],"body":{}}}},"github.com/benbjohnson/litestream.DB.deleteLocalLTXFile":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","kind":"method","span":{"start":[620,1],"end":[629,2],"bytes":[22008,22271]},"signature":"github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","parameters":[{"name":"level","type":"int","span":{"start":[620,1],"end":[620,79],"bytes":[22008,22086]}},{"name":"minTXID","type":"invalid type","span":{"start":[620,1],"end":[620,79],"bytes":[22008,22086]}},{"name":"maxTXID","type":"invalid type","span":{"start":[620,1],"end":[620,79],"bytes":[22008,22086]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"621:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile@621:10","span":{"start":[621,10],"end":[621,45],"bytes":[22096,22131]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"622:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile@622:12","span":{"start":[622,12],"end":[622,27],"bytes":[22143,22158]},"callee":"can://litestream/litestream/@external/os/Remove"},"622:44":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile@622:44","span":{"start":[622,44],"end":[622,62],"bytes":[22175,22193]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"626:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile@626:3","span":{"start":[626,3],"end":[626,26],"bytes":[22231,22254]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"}}},"github.com/benbjohnson/litestream.DB.deleteMetrics":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics","kind":"method","span":{"start":[382,1],"end":[416,2],"bytes":[15025,16181]},"signature":"github.com/benbjohnson/litestream.DB.deleteMetrics","parameters":[],"metrics":{"cyclomatic":4},"body":{"383:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@383:2","span":{"start":[383,2],"end":[383,23],"bytes":[15058,15079]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"384:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@384:8","span":{"start":[384,8],"end":[384,31],"bytes":[15087,15110]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"390:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@390:10","span":{"start":[390,10],"end":[390,32],"bytes":[15191,15213]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"393:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@393:3","span":{"start":[393,3],"end":[393,41],"bytes":[15292,15330]},"callee":null},"394:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@394:3","span":{"start":[394,3],"end":[394,81],"bytes":[15333,15411]},"callee":null},"401:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@401:2","span":{"start":[401,2],"end":[401,39],"bytes":[15503,15540]},"callee":null},"404:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@404:2","span":{"start":[404,2],"end":[404,43],"bytes":[15587,15628]},"callee":null},"405:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@405:2","span":{"start":[405,2],"end":[405,44],"bytes":[15630,15672]},"callee":null},"406:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@406:2","span":{"start":[406,2],"end":[406,52],"bytes":[15674,15724]},"callee":null},"407:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@407:2","span":{"start":[407,2],"end":[407,46],"bytes":[15726,15770]},"callee":null},"408:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@408:2","span":{"start":[408,2],"end":[408,44],"bytes":[15772,15814]},"callee":null},"409:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@409:2","span":{"start":[409,2],"end":[409,49],"bytes":[15816,15863]},"callee":null},"410:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@410:2","span":{"start":[410,2],"end":[410,50],"bytes":[15865,15913]},"callee":null},"411:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@411:2","span":{"start":[411,2],"end":[411,45],"bytes":[15915,15958]},"callee":null},"412:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@412:2","span":{"start":[412,2],"end":[412,60],"bytes":[15960,16018]},"callee":null},"413:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@413:2","span":{"start":[413,2],"end":[413,50],"bytes":[16020,16068]},"callee":null},"414:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@414:2","span":{"start":[414,2],"end":[414,55],"bytes":[16070,16123]},"callee":null},"415:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics@415:2","span":{"start":[415,2],"end":[415,56],"bytes":[16125,16179]},"callee":null}}},"github.com/benbjohnson/litestream.DB.detectFullCheckpoint":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","kind":"method","span":{"start":[1939,1],"end":[1967,2],"bytes":[63389,64226]},"signature":"github.com/benbjohnson/litestream.DB.detectFullCheckpoint","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1939,1],"end":[1939,96],"bytes":[63389,63484]}},{"name":"knownSalts","type":"[][2]uint32","span":{"start":[1939,1],"end":[1939,96],"bytes":[63389,63484]}}],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1940:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1940:18","span":{"start":[1940,18],"end":[1940,39],"bytes":[63502,63523]},"callee":"can://litestream/litestream/@external/os/Open"},"1940:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1940:26","span":{"start":[1940,26],"end":[1940,38],"bytes":[63510,63522]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1942:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1942:17","span":{"start":[1942,17],"end":[1942,53],"bytes":[63557,63593]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1944:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1944:8","span":{"start":[1944,8],"end":[1944,23],"bytes":[63604,63619]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"1947:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1947:5","span":{"start":[1947,5],"end":[1947,20],"bytes":[63654,63669]},"callee":null},"1948:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1948:30","span":{"start":[1948,30],"end":[1948,45],"bytes":[63705,63720]},"callee":null},"1951:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1951:13","span":{"start":[1951,13],"end":[1951,90],"bytes":[63740,63817]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader"},"1951:35":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1951:35","span":{"start":[1951,35],"end":[1951,89],"bytes":[63762,63816]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"1953:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1953:17","span":{"start":[1953,17],"end":[1953,54],"bytes":[63851,63888]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1955:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1955:12","span":{"start":[1955,12],"end":[1955,50],"bytes":[63903,63941]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil"},"1957:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1957:17","span":{"start":[1957,17],"end":[1957,57],"bytes":[63975,64015]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1962:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1962:3","span":{"start":[1962,3],"end":[1962,18],"bytes":[64094,64109]},"callee":null},"1966:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint@1966:9","span":{"start":[1966,9],"end":[1966,15],"bytes":[64208,64214]},"callee":null}}},"github.com/benbjohnson/litestream.DB.effectiveTruncatePageN":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN","kind":"method","span":{"start":[1575,1],"end":[1580,2],"bytes":[51251,51383]},"signature":"github.com/benbjohnson/litestream.DB.effectiveTruncatePageN","parameters":[],"return_type":"int","metrics":{"cyclomatic":2},"body":{}},"github.com/benbjohnson/litestream.DB.ensureWALExists":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","kind":"method","span":{"start":[1644,1],"end":[1652,2],"bytes":[53444,53756]},"signature":"github.com/benbjohnson/litestream.DB.ensureWALExists","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1644,1],"end":[1644,65],"bytes":[53444,53508]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1646:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists@1646:16","span":{"start":[1646,16],"end":[1646,37],"bytes":[53561,53582]},"callee":"can://litestream/litestream/@external/os/Stat"},"1646:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists@1646:24","span":{"start":[1646,24],"end":[1646,36],"bytes":[53569,53581]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1646:53":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists@1646:53","span":{"start":[1646,53],"end":[1646,62],"bytes":[53598,53607]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"1651:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists@1651:9","span":{"start":[1651,9],"end":[1651,34],"bytes":[53729,53754]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq"}}},"github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","kind":"method","span":{"start":[1569,1],"end":[1573,2],"bytes":[51023,51249]},"signature":"github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","parameters":[{"name":"walSize","type":"int64","span":{"start":[1569,1],"end":[1569,61],"bytes":[51023,51083]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"1570:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold@1570:19","span":{"start":[1570,19],"end":[1570,46],"bytes":[51102,51129]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN"},"1572:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold@1572:14","span":{"start":[1572,14],"end":[1572,69],"bytes":[51192,51247]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize"},"1572:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold@1572:26","span":{"start":[1572,26],"end":[1572,45],"bytes":[51204,51223]},"callee":null},"1572:47":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold@1572:47","span":{"start":[1572,47],"end":[1572,68],"bytes":[51225,51246]},"callee":null}}},"github.com/benbjohnson/litestream.DB.execCheckpoint":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","kind":"method","span":{"start":[2710,1],"end":[2754,2],"bytes":[87105,88720]},"signature":"github.com/benbjohnson/litestream.DB.execCheckpoint","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2710,1],"end":[2710,92],"bytes":[87105,87196]}},{"name":"mode","type":"string","span":{"start":[2710,1],"end":[2710,92],"bytes":[87105,87196]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"2717:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2717:7","span":{"start":[2717,7],"end":[2717,17],"bytes":[87319,87329]},"callee":"can://litestream/litestream/@external/time/Now"},"2718:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2718:8","span":{"start":[2718,8],"end":[2725,5],"bytes":[87337,87597]},"callee":null,"is_deferred":true},"2729:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2729:12","span":{"start":[2729,12],"end":[2729,32],"bytes":[87754,87774]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock"},"2730:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2730:13","span":{"start":[2730,13],"end":[2730,53],"bytes":[87801,87841]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2732:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2732:8","span":{"start":[2732,8],"end":[2732,48],"bytes":[87852,87892]},"callee":null,"is_deferred":true},"2743:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2743:12","span":{"start":[2743,12],"end":[2743,78],"bytes":[88324,88390]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"2743:12/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2743:12/2","span":{"start":[2743,12],"end":[2743,46],"bytes":[88324,88358]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRowContext"},"2746:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2746:2","span":{"start":[2746,2],"end":[2746,104],"bytes":[88425,88527]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"2746:56":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2746:56","span":{"start":[2746,56],"end":[2746,103],"bytes":[88479,88526]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"2749:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2749:12","span":{"start":[2749,12],"end":[2749,35],"bytes":[88602,88625]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock"},"2750:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint@2750:13","span":{"start":[2750,13],"end":[2750,55],"bytes":[88652,88694]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1","kind":"function","span":{"start":[2718,1],"end":[2725,5],"bytes":[87330,87597]},"signature":"github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1","parameters":[],"body":{"2720:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1@2720:3","span":{"start":[2720,3],"end":[2720,46],"bytes":[87392,87435]},"callee":null},"2720:3/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1@2720:3/2","span":{"start":[2720,3],"end":[2720,40],"bytes":[87392,87429]},"callee":null},"2722:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1@2722:4","span":{"start":[2722,4],"end":[2722,52],"bytes":[87457,87505]},"callee":null},"2722:4/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1@2722:4/2","span":{"start":[2722,4],"end":[2722,46],"bytes":[87457,87499]},"callee":null},"2724:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1@2724:24","span":{"start":[2724,24],"end":[2724,67],"bytes":[87533,87576]},"callee":null},"2724:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1@2724:3","span":{"start":[2724,3],"end":[2724,83],"bytes":[87512,87592]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.addDurationToCounter"},"2724:69":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1@2724:69","span":{"start":[2724,69],"end":[2724,82],"bytes":[87578,87591]},"callee":"can://litestream/litestream/@external/time/Since"}}},"closure_2":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_2","kind":"function","span":{"start":[2732,1],"end":[2732,48],"bytes":[87845,87892]},"signature":"github.com/benbjohnson/litestream.DB.execCheckpoint.closure_2","parameters":[],"body":{"2732:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_2@2732:21","span":{"start":[2732,21],"end":[2732,44],"bytes":[87865,87888]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock"}}}}},"github.com/benbjohnson/litestream.DB.finishSyncDiag":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag","kind":"method","span":{"start":[517,1],"end":[528,2],"bytes":[19046,19291]},"signature":"github.com/benbjohnson/litestream.DB.finishSyncDiag","parameters":[{"name":"err","type":"error","span":{"start":[517,1],"end":[517,42],"bytes":[19046,19087]}}],"metrics":{"cyclomatic":3},"body":{"518:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag@518:2","span":{"start":[518,2],"end":[518,20],"bytes":[19089,19107]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"519:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag@519:8","span":{"start":[519,8],"end":[519,28],"bytes":[19115,19135]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true},"524:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag@524:26","span":{"start":[524,26],"end":[524,36],"bytes":[19227,19237]},"callee":"can://litestream/litestream/@external/time/Now"},"526:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag@526:21","span":{"start":[526,21],"end":[526,32],"bytes":[19275,19286]},"callee":null}}},"github.com/benbjohnson/litestream.DB.finishSyncExecutorWait":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","kind":"method","span":{"start":[539,1],"end":[546,2],"bytes":[19512,19731]},"signature":"github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","parameters":[],"metrics":{"cyclomatic":2},"body":{"540:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait@540:2","span":{"start":[540,2],"end":[540,20],"bytes":[19554,19572]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"541:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait@541:8","span":{"start":[541,8],"end":[541,28],"bytes":[19580,19600]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.DB.init":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","kind":"method","span":{"start":[1085,1],"end":[1199,2],"bytes":[35148,38717]},"signature":"github.com/benbjohnson/litestream.DB.init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1085,1],"end":[1085,54],"bytes":[35148,35201]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":21},"body":{"1092:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1092:13","span":{"start":[1092,13],"end":[1092,29],"bytes":[35320,35336]},"callee":"can://litestream/litestream/@external/os/Stat"},"1093:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1093:5","span":{"start":[1093,5],"end":[1093,23],"bytes":[35341,35359]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"1101:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1101:15","span":{"start":[1101,15],"end":[1101,45],"bytes":[35493,35523]},"callee":"can://litestream/litestream/@external/os/Stat"},"1101:23":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1101:23","span":{"start":[1101,23],"end":[1101,44],"bytes":[35501,35522]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"1106:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1106:9","span":{"start":[1106,9],"end":[1107,42],"bytes":[35580,35699]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1107:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1107:12","span":{"start":[1107,12],"end":[1107,41],"bytes":[35669,35698]},"callee":"can://litestream/litestream/@external/time/Duration.Milliseconds"},"1109:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1109:18","span":{"start":[1109,18],"end":[1109,41],"bytes":[35718,35741]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"1114:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1114:12","span":{"start":[1114,12],"end":[1114,33],"bytes":[35865,35886]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL"},"1115:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1115:10","span":{"start":[1115,10],"end":[1115,48],"bytes":[35910,35948]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1119:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1119:17","span":{"start":[1119,17],"end":[1119,33],"bytes":[36045,36061]},"callee":"can://litestream/litestream/@external/os/Open"},"1120:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1120:10","span":{"start":[1120,10],"end":[1120,56],"bytes":[36085,36131]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1125:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1125:8","span":{"start":[1125,8],"end":[1132,5],"bytes":[36231,36353]},"callee":null,"is_deferred":true},"1137:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1137:12","span":{"start":[1137,12],"end":[1137,80],"bytes":[36519,36587]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"1137:12/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1137:12/2","span":{"start":[1137,12],"end":[1137,68],"bytes":[36519,36575]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRowContext"},"1140:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1140:10","span":{"start":[1140,10],"end":[1140,56],"bytes":[36651,36697]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1145:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1145:15","span":{"start":[1145,15],"end":[1145,122],"bytes":[36823,36930]},"callee":"can://litestream/litestream/@external/database/sql/DB.ExecContext"},"1146:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1146:10","span":{"start":[1146,10],"end":[1146,61],"bytes":[36954,37005]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1151:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1151:15","span":{"start":[1151,15],"end":[1151,98],"bytes":[37167,37250]},"callee":"can://litestream/litestream/@external/database/sql/DB.ExecContext"},"1152:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1152:10","span":{"start":[1152,10],"end":[1152,62],"bytes":[37274,37326]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1157:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1157:12","span":{"start":[1157,12],"end":[1157,35],"bytes":[37438,37461]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock"},"1158:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1158:10","span":{"start":[1158,10],"end":[1158,50],"bytes":[37485,37525]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1162:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1162:12","span":{"start":[1162,12],"end":[1162,78],"bytes":[37561,37627]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"1162:12/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1162:12/2","span":{"start":[1162,12],"end":[1162,59],"bytes":[37561,37608]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRowContext"},"1163:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1163:10","span":{"start":[1163,10],"end":[1163,47],"bytes":[37651,37688]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1165:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1165:10","span":{"start":[1165,10],"end":[1165,61],"bytes":[37728,37779]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1169:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1169:12","span":{"start":[1169,12],"end":[1169,54],"bytes":[37839,37881]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"1174:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1174:12","span":{"start":[1174,12],"end":[1174,35],"bytes":[37969,37992]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists"},"1175:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1175:10","span":{"start":[1175,10],"end":[1175,50],"bytes":[38016,38056]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1181:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1181:13","span":{"start":[1181,13],"end":[1181,47],"bytes":[38224,38258]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica"},"1182:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1182:11","span":{"start":[1182,11],"end":[1182,63],"bytes":[38283,38335]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1195:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init@1195:3","span":{"start":[1195,3],"end":[1195,27],"bytes":[38675,38699]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init/github.com/benbjohnson/litestream.DB.init.closure_1","kind":"function","span":{"start":[1125,1],"end":[1132,5],"bytes":[36224,36353]},"signature":"github.com/benbjohnson/litestream.DB.init.closure_1","parameters":[],"body":{"1127:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init/github.com/benbjohnson/litestream.DB.init.closure_1@1127:8","span":{"start":[1127,8],"end":[1127,28],"bytes":[36265,36285]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock"},"1128:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init/github.com/benbjohnson/litestream.DB.init.closure_1@1128:4","span":{"start":[1128,4],"end":[1128,17],"bytes":[36289,36302]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close"},"1129:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init/github.com/benbjohnson/litestream.DB.init.closure_1@1129:4","span":{"start":[1129,4],"end":[1129,16],"bytes":[36306,36318]},"callee":"can://litestream/litestream/@external/os/File.Close"}}}}},"github.com/benbjohnson/litestream.DB.initMetrics":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","kind":"method","span":{"start":[356,1],"end":[378,2],"bytes":[13702,14876]},"signature":"github.com/benbjohnson/litestream.DB.initMetrics","parameters":[],"metrics":{"cyclomatic":2},"body":{"357:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@357:2","span":{"start":[357,2],"end":[357,23],"bytes":[13733,13754]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"358:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@358:8","span":{"start":[358,8],"end":[358,31],"bytes":[13762,13785]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"364:27":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@364:27","span":{"start":[364,27],"end":[364,49],"bytes":[13913,13935]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"366:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@366:19","span":{"start":[366,19],"end":[366,58],"bytes":[13958,13997]},"callee":null},"367:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@367:20","span":{"start":[367,20],"end":[367,60],"bytes":[14017,14057]},"callee":null},"368:28":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@368:28","span":{"start":[368,28],"end":[368,76],"bytes":[14085,14133]},"callee":null},"369:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@369:17","span":{"start":[369,17],"end":[369,59],"bytes":[14150,14192]},"callee":null},"370:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@370:20","span":{"start":[370,20],"end":[370,60],"bytes":[14212,14252]},"callee":null},"371:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@371:25","span":{"start":[371,25],"end":[371,70],"bytes":[14277,14322]},"callee":null},"372:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@372:26","span":{"start":[372,26],"end":[372,72],"bytes":[14348,14394]},"callee":null},"373:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@373:21","span":{"start":[373,21],"end":[373,62],"bytes":[14415,14456]},"callee":null},"374:29":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@374:29","span":{"start":[374,29],"end":[374,98],"bytes":[14485,14554]},"callee":null},"375:34":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@375:34","span":{"start":[375,34],"end":[375,108],"bytes":[14588,14662]},"callee":null},"376:35":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@376:35","span":{"start":[376,35],"end":[376,110],"bytes":[14697,14772]},"callee":null},"377:46":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics@377:46","span":{"start":[377,46],"end":[377,102],"bytes":[14818,14874]},"callee":null}}},"github.com/benbjohnson/litestream.DB.invalidatePosCache":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","kind":"method","span":{"start":[699,1],"end":[703,2],"bytes":[24221,24311]},"signature":"github.com/benbjohnson/litestream.DB.invalidatePosCache","parameters":[],"metrics":{"cyclomatic":1},"body":{"700:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache@700:2","span":{"start":[700,2],"end":[700,15],"bytes":[24259,24272]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"702:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache@702:2","span":{"start":[702,2],"end":[702,17],"bytes":[24294,24309]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}}},"github.com/benbjohnson/litestream.DB.lastPageMatch":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","kind":"method","span":{"start":[1899,1],"end":[1935,2],"bytes":[62116,63253]},"signature":"github.com/benbjohnson/litestream.DB.lastPageMatch","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1899,1],"end":[1899,115],"bytes":[62116,62230]}},{"name":"dec","type":"invalid type","span":{"start":[1899,1],"end":[1899,115],"bytes":[62116,62230]}},{"name":"prevWALOffset","type":"int64","span":{"start":[1899,1],"end":[1899,115],"bytes":[62116,62230]}},{"name":"frameSize","type":"int64","span":{"start":[1899,1],"end":[1899,115],"bytes":[62116,62230]}}],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"1904:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1904:16","span":{"start":[1904,16],"end":[1904,69],"bytes":[62307,62360]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt"},"1904:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1904:30","span":{"start":[1904,30],"end":[1904,42],"bytes":[62321,62333]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1906:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1906:17","span":{"start":[1906,17],"end":[1906,72],"bytes":[62394,62449]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1908:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1908:10","span":{"start":[1908,10],"end":[1908,44],"bytes":[62462,62496]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"1909:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1909:12","span":{"start":[1909,12],"end":[1909,46],"bytes":[62508,62542]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"1910:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1910:12","span":{"start":[1910,12],"end":[1910,47],"bytes":[62554,62589]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"1913:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1913:15","span":{"start":[1913,15],"end":[1913,27],"bytes":[62641,62653]},"callee":null},"1913:50":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1913:50","span":{"start":[1913,50],"end":[1913,62],"bytes":[62676,62688]},"callee":null},"1918:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1918:22","span":{"start":[1918,22],"end":[1918,34],"bytes":[62815,62827]},"callee":null},"1918:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1918:9","span":{"start":[1918,9],"end":[1918,44],"bytes":[62802,62837]},"callee":null},"1921:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1921:13","span":{"start":[1921,13],"end":[1921,38],"bytes":[62882,62907]},"callee":null},"1921:40":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1921:40","span":{"start":[1921,40],"end":[1921,62],"bytes":[62909,62931]},"callee":"can://litestream/litestream/@external/errors/Is"},"1924:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1924:18","span":{"start":[1924,18],"end":[1924,56],"bytes":[63027,63065]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1930:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch@1930:7","span":{"start":[1930,7],"end":[1930,29],"bytes":[63146,63168]},"callee":"can://litestream/litestream/@external/bytes/Equal"}}},"github.com/benbjohnson/litestream.DB.lockExec":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","kind":"method","span":{"start":[1310,1],"end":[1321,2],"bytes":[41797,42101]},"signature":"github.com/benbjohnson/litestream.DB.lockExec","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1310,1],"end":[1310,52],"bytes":[41797,41848]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1311:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec@1311:5","span":{"start":[1311,5],"end":[1311,29],"bytes":[41853,41877]},"callee":null},"1314:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec@1314:2","span":{"start":[1314,2],"end":[1314,28],"bytes":[41897,41923]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait"},"1315:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec@1315:8","span":{"start":[1315,8],"end":[1315,35],"bytes":[41931,41958]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","is_deferred":true},"1317:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec@1317:12","span":{"start":[1317,12],"end":[1317,38],"bytes":[41971,41997]},"callee":null},"1318:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec@1318:10","span":{"start":[1318,10],"end":[1318,73],"bytes":[42021,42084]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1318:54":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec@1318:54","span":{"start":[1318,54],"end":[1318,72],"bytes":[42065,42083]},"callee":"can://litestream/litestream/@external/context/Cause"}}},"github.com/benbjohnson/litestream.DB.monitor":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","kind":"method","span":{"start":[3227,1],"end":[3311,2],"bytes":[103385,105989]},"signature":"github.com/benbjohnson/litestream.DB.monitor","parameters":[],"metrics":{"cyclomatic":17},"body":{"3228:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3228:12","span":{"start":[3228,12],"end":[3228,46],"bytes":[103422,103456]},"callee":"can://litestream/litestream/@external/time/NewTicker"},"3229:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3229:8","span":{"start":[3229,8],"end":[3229,21],"bytes":[103464,103477]},"callee":"can://litestream/litestream/@external/time/Ticker.Stop","is_deferred":true},"3239:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3239:10","span":{"start":[3239,10],"end":[3239,23],"bytes":[103663,103676]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"3247:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3247:11","span":{"start":[3247,11],"end":[3247,24],"bytes":[103816,103829]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"3249:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3249:11","span":{"start":[3249,11],"end":[3249,30],"bytes":[103852,103871]},"callee":"can://litestream/litestream/@external/time/After"},"3259:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3259:13","span":{"start":[3259,13],"end":[3259,28],"bytes":[104299,104314]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync"},"3259:45":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3259:45","span":{"start":[3259,45],"end":[3259,73],"bytes":[104331,104359]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"3273:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3273:7","span":{"start":[3273,7],"end":[3273,30],"bytes":[104705,104728]},"callee":"can://litestream/litestream/@external/time/Since"},"3275:39":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3275:39","span":{"start":[3275,39],"end":[3275,62],"bytes":[104818,104841]},"callee":"can://litestream/litestream/@external/errors/As"},"3275:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3275:8","span":{"start":[3275,8],"end":[3275,35],"bytes":[104787,104814]},"callee":"can://litestream/litestream/@external/errors/Is"},"3278:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3278:6","span":{"start":[3278,6],"end":[3284,44],"bytes":[104943,105246]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"3281:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3281:15","span":{"start":[3281,15],"end":[3281,48],"bytes":[105097,105130]},"callee":null},"3281:15/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3281:15/2","span":{"start":[3281,15],"end":[3281,39],"bytes":[105097,105121]},"callee":null},"3286:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3286:6","span":{"start":[3286,6],"end":[3289,26],"bytes":[105265,105385]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"3291:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3291:19","span":{"start":[3291,19],"end":[3291,29],"bytes":[105410,105420]},"callee":"can://litestream/litestream/@external/time/Now"},"3295:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3295:7","span":{"start":[3295,7],"end":[3295,27],"bytes":[105502,105522]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"3296:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3296:5","span":{"start":[3296,5],"end":[3296,81],"bytes":[105553,105629]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"3297:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3297:22","span":{"start":[3297,22],"end":[3297,49],"bytes":[105651,105678]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles"},"3298:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3298:6","span":{"start":[3298,6],"end":[3298,70],"bytes":[105705,105769]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"3306:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor@3306:4","span":{"start":[3306,4],"end":[3306,72],"bytes":[105876,105944]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"}}},"github.com/benbjohnson/litestream.DB.newSyncExecutor":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","kind":"method","span":{"start":[2004,1],"end":[2023,2],"bytes":[65124,65494]},"signature":"github.com/benbjohnson/litestream.DB.newSyncExecutor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2004,1],"end":[2004,76],"bytes":[65124,65199]}}],"return_type":"(*github.com/benbjohnson/litestream.syncExecutor, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"2005:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor@2005:2","span":{"start":[2005,2],"end":[2005,14],"bytes":[65201,65213]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"2006:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor@2006:8","span":{"start":[2006,8],"end":[2006,22],"bytes":[65221,65235]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true},"2008:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor@2008:12","span":{"start":[2008,12],"end":[2008,24],"bytes":[65248,65260]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init"},"2014:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor@2014:14","span":{"start":[2014,14],"end":[2014,22],"bytes":[65354,65362]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"2016:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor@2016:15","span":{"start":[2016,15],"end":[2016,41],"bytes":[65394,65420]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.DB.openLocalLTXFile":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.openLocalLTXFile","kind":"method","span":{"start":[614,1],"end":[616,2],"bytes":[21758,21906]},"signature":"github.com/benbjohnson/litestream.DB.openLocalLTXFile","parameters":[{"name":"level","type":"int","span":{"start":[614,1],"end":[614,94],"bytes":[21758,21851]}},{"name":"minTXID","type":"invalid type","span":{"start":[614,1],"end":[614,94],"bytes":[21758,21851]}},{"name":"maxTXID","type":"invalid type","span":{"start":[614,1],"end":[614,94],"bytes":[21758,21851]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"615:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.openLocalLTXFile@615:17","span":{"start":[615,17],"end":[615,52],"bytes":[21868,21903]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"615:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.openLocalLTXFile@615:9","span":{"start":[615,9],"end":[615,53],"bytes":[21860,21904]},"callee":"can://litestream/litestream/@external/os/Open"}}},"github.com/benbjohnson/litestream.DB.releaseReadLock":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","kind":"method","span":{"start":[1270,1],"end":[1283,2],"bytes":[40770,41189]},"signature":"github.com/benbjohnson/litestream.DB.releaseReadLock","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1280:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock@1280:9","span":{"start":[1280,9],"end":[1280,25],"bytes":[41145,41161]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback"}}},"github.com/benbjohnson/litestream.DB.setPersistWAL":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL","kind":"method","span":{"start":[1061,1],"end":[1081,2],"bytes":[34525,35020]},"signature":"github.com/benbjohnson/litestream.DB.setPersistWAL","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1061,1],"end":[1061,57],"bytes":[34525,34581]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1062:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL@1062:15","span":{"start":[1062,15],"end":[1062,30],"bytes":[34596,34611]},"callee":"can://litestream/litestream/@external/database/sql/DB.Conn"},"1064:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL@1064:10","span":{"start":[1064,10],"end":[1064,47],"bytes":[34638,34675]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1066:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL@1066:8","span":{"start":[1066,8],"end":[1066,20],"bytes":[34686,34698]},"callee":"can://litestream/litestream/@external/database/sql/Conn.Close","is_deferred":true},"1068:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL@1068:9","span":{"start":[1068,9],"end":[1080,4],"bytes":[34708,35018]},"callee":"can://litestream/litestream/@external/database/sql/Conn.Raw"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL/github.com/benbjohnson/litestream.DB.setPersistWAL.closure_1","kind":"function","span":{"start":[1068,1],"end":[1080,4],"bytes":[34700,35018]},"signature":"github.com/benbjohnson/litestream.DB.setPersistWAL.closure_1","parameters":[{"name":"driverConn","type":"interface{}","span":{"start":[1068,1],"end":[1068,54],"bytes":[34700,34753]}}],"return_type":"error","error_channel":["error"],"body":{"1071:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL/github.com/benbjohnson/litestream.DB.setPersistWAL.closure_1@1071:11","span":{"start":[1071,11],"end":[1071,62],"bytes":[34819,34870]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1074:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL/github.com/benbjohnson/litestream.DB.setPersistWAL.closure_1@1074:13","span":{"start":[1074,13],"end":[1074,48],"bytes":[34888,34923]},"callee":null},"1076:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL/github.com/benbjohnson/litestream.DB.setPersistWAL.closure_1@1076:11","span":{"start":[1076,11],"end":[1076,55],"bytes":[34952,34996]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}}}},"github.com/benbjohnson/litestream.DB.setSyncDiagPhase":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","kind":"method","span":{"start":[504,1],"end":[515,2],"bytes":[18755,19044]},"signature":"github.com/benbjohnson/litestream.DB.setSyncDiagPhase","parameters":[{"name":"phase","type":"github.com/benbjohnson/litestream.diagPhase","span":{"start":[504,1],"end":[504,79],"bytes":[18755,18833]}},{"name":"updates","type":"[]func(*github.com/benbjohnson/litestream.diagState)","span":{"start":[504,1],"end":[504,79],"bytes":[18755,18833]},"is_variadic":true}],"metrics":{"cyclomatic":3},"body":{"505:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase@505:2","span":{"start":[505,2],"end":[505,20],"bytes":[18835,18853]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"506:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase@506:8","span":{"start":[506,8],"end":[506,28],"bytes":[18861,18881]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true},"511:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase@511:26","span":{"start":[511,26],"end":[511,36],"bytes":[18972,18982]},"callee":"can://litestream/litestream/@external/time/Now"},"513:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase@513:3","span":{"start":[513,3],"end":[513,23],"bytes":[19019,19039]},"callee":null}}},"github.com/benbjohnson/litestream.DB.snapshotPosition":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","kind":"method","span":{"start":[2796,1],"end":[2833,2],"bytes":[89741,90845]},"signature":"github.com/benbjohnson/litestream.DB.snapshotPosition","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2796,1],"end":[2796,85],"bytes":[89741,89825]}}],"return_type":"(*github.com/benbjohnson/litestream.snapshotReadPosition, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"2797:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition@2797:12","span":{"start":[2797,12],"end":[2797,28],"bytes":[89837,89853]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec"},"2800:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition@2800:8","span":{"start":[2800,8],"end":[2800,29],"bytes":[89896,89917]},"callee":null,"is_deferred":true},"2802:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition@2802:14","span":{"start":[2802,14],"end":[2802,27],"bytes":[89932,89945]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize"},"2803:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition@2803:14","span":{"start":[2803,14],"end":[2803,22],"bytes":[89959,89967]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"2806:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition@2806:3","span":{"start":[2806,3],"end":[2806,66],"bytes":[89991,90054]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"2810:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition@2810:15","span":{"start":[2810,15],"end":[2810,41],"bytes":[90157,90183]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2813:23":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition@2813:23","span":{"start":[2813,23],"end":[2813,51],"bytes":[90210,90238]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset"},"2826:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition@2826:2","span":{"start":[2826,2],"end":[2826,18],"bytes":[90691,90707]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"}}},"github.com/benbjohnson/litestream.DB.snapshotReader":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader","kind":"method","span":{"start":[2876,1],"end":[2971,2],"bytes":[92366,95068]},"signature":"github.com/benbjohnson/litestream.DB.snapshotReader","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2876,1],"end":[2876,102],"bytes":[92366,92467]}},{"name":"pos","type":"*github.com/benbjohnson/litestream.snapshotReadPosition","span":{"start":[2876,1],"end":[2876,102],"bytes":[92366,92467]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"2877:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader@2877:2","span":{"start":[2877,2],"end":[2877,94],"bytes":[92469,92561]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"2877:38":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader@2877:38","span":{"start":[2877,38],"end":[2877,59],"bytes":[92505,92526]},"callee":null},"2881:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader@2881:13","span":{"start":[2881,13],"end":[2881,24],"bytes":[92632,92643]},"callee":"can://litestream/litestream/@external/os/File.Stat"},"2885:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader@2885:12","span":{"start":[2885,12],"end":[2885,51],"bytes":[92693,92732]},"callee":null},"2885:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader@2885:19","span":{"start":[2885,19],"end":[2885,28],"bytes":[92700,92709]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"2885:31":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader@2885:31","span":{"start":[2885,31],"end":[2885,50],"bytes":[92712,92731]},"callee":null},"2888:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader@2888:12","span":{"start":[2888,12],"end":[2888,21],"bytes":[92835,92844]},"callee":"can://litestream/litestream/@external/io/Pipe"},"2889:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader@2889:5","span":{"start":[2889,5],"end":[2968,5],"bytes":[92849,95006]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","kind":"function","span":{"start":[2889,1],"end":[2968,5],"bytes":[92845,95006]},"signature":"github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","parameters":[],"body":{"2890:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2890:9","span":{"start":[2890,9],"end":[2890,20],"bytes":[92866,92877]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","is_deferred":true},"2892:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2892:19","span":{"start":[2892,19],"end":[2892,40],"bytes":[92897,92918]},"callee":"can://litestream/litestream/@external/os/Open"},"2892:27":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2892:27","span":{"start":[2892,27],"end":[2892,39],"bytes":[92905,92917]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2894:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2894:4","span":{"start":[2894,4],"end":[2894,26],"bytes":[92940,92962]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"2897:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2897:9","span":{"start":[2897,9],"end":[2897,24],"bytes":[92985,93000]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"2899:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2899:14","span":{"start":[2899,14],"end":[2899,91],"bytes":[93015,93092]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader"},"2899:36":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2899:36","span":{"start":[2899,36],"end":[2899,90],"bytes":[93037,93091]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"2901:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2901:22","span":{"start":[2901,22],"end":[2901,59],"bytes":[93132,93169]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2901:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2901:4","span":{"start":[2901,4],"end":[2901,60],"bytes":[93114,93170]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"2907:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2907:14","span":{"start":[2907,14],"end":[2907,36],"bytes":[93317,93339]},"callee":null},"2911:44":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2911:44","span":{"start":[2911,44],"end":[2911,69],"bytes":[93448,93473]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap"},"2913:23":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2913:23","span":{"start":[2913,23],"end":[2913,54],"bytes":[93515,93546]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2913:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2913:5","span":{"start":[2913,5],"end":[2913,55],"bytes":[93497,93547]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"2922:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2922:22","span":{"start":[2922,22],"end":[2922,128],"bytes":[93673,93779]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2922:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2922:4","span":{"start":[2922,4],"end":[2922,129],"bytes":[93655,93780]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"2925:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2925:25","span":{"start":[2925,25],"end":[2925,98],"bytes":[93819,93892]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotHeaderWALRange"},"2925:59":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2925:59","span":{"start":[2925,59],"end":[2925,97],"bytes":[93853,93891]},"callee":null},"2927:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2927:3","span":{"start":[2927,3],"end":[2934,22],"bytes":[93896,94123]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"2928:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2928:12","span":{"start":[2928,12],"end":[2928,33],"bytes":[93949,93970]},"callee":null},"2936:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2936:15","span":{"start":[2936,15],"end":[2936,33],"bytes":[94139,94157]},"callee":null},"2938:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2938:22","span":{"start":[2938,22],"end":[2938,60],"bytes":[94197,94235]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2938:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2938:4","span":{"start":[2938,4],"end":[2938,61],"bytes":[94179,94236]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"2941:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2941:13","span":{"start":[2941,13],"end":[2953,5],"bytes":[94263,94600]},"callee":null},"2944:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2944:15","span":{"start":[2944,15],"end":[2944,35],"bytes":[94373,94393]},"callee":null},"2948:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2948:15","span":{"start":[2948,15],"end":[2948,37],"bytes":[94476,94498]},"callee":"can://litestream/litestream/@external/time/Time.UnixMilli"},"2948:15/2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2948:15/2","span":{"start":[2948,15],"end":[2948,25],"bytes":[94476,94486]},"callee":"can://litestream/litestream/@external/time/Now"},"2954:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2954:22","span":{"start":[2954,22],"end":[2954,71],"bytes":[94636,94685]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2954:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2954:4","span":{"start":[2954,4],"end":[2954,72],"bytes":[94618,94686]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"2958:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2958:13","span":{"start":[2958,13],"end":[2958,66],"bytes":[94714,94767]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB"},"2959:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2959:22","span":{"start":[2959,22],"end":[2959,63],"bytes":[94803,94844]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2959:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2959:4","span":{"start":[2959,4],"end":[2959,64],"bytes":[94785,94845]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"2963:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2963:13","span":{"start":[2963,13],"end":[2963,24],"bytes":[94873,94884]},"callee":null},"2964:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2964:22","span":{"start":[2964,22],"end":[2964,71],"bytes":[94920,94969]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2964:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2964:4","span":{"start":[2964,4],"end":[2964,72],"bytes":[94902,94970]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"2967:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1@2967:7","span":{"start":[2967,7],"end":[2967,17],"bytes":[94991,95001]},"callee":"can://litestream/litestream/@external/io/PipeWriter.Close"}}}}},"github.com/benbjohnson/litestream.DB.snapshotWALEndOffset":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","kind":"method","span":{"start":[2838,1],"end":[2874,2],"bytes":[91069,92364]},"signature":"github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","parameters":[{"name":"pos","type":"invalid type","span":{"start":[2838,1],"end":[2838,65],"bytes":[91069,91133]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"2846:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2846:13","span":{"start":[2846,13],"end":[2846,46],"bytes":[91291,91324]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"2847:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2847:12","span":{"start":[2847,12],"end":[2847,28],"bytes":[91336,91352]},"callee":"can://litestream/litestream/@external/os/Open"},"2849:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2849:13","span":{"start":[2849,13],"end":[2849,85],"bytes":[91382,91454]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2849:45":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2849:45","span":{"start":[2849,45],"end":[2849,61],"bytes":[91414,91430]},"callee":null},"2849:63":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2849:63","span":{"start":[2849,63],"end":[2849,79],"bytes":[91432,91448]},"callee":null},"2851:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2851:8","span":{"start":[2851,8],"end":[2851,34],"bytes":[91465,91491]},"callee":null,"is_deferred":true},"2853:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2853:9","span":{"start":[2853,9],"end":[2853,26],"bytes":[91501,91518]},"callee":null},"2854:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2854:12","span":{"start":[2854,12],"end":[2854,30],"bytes":[91530,91548]},"callee":null},"2855:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2855:13","span":{"start":[2855,13],"end":[2855,126],"bytes":[91575,91688]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2855:47":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2855:47","span":{"start":[2855,47],"end":[2855,63],"bytes":[91609,91625]},"callee":null},"2855:65":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2855:65","span":{"start":[2855,65],"end":[2855,81],"bytes":[91627,91643]},"callee":null},"2855:83":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2855:83","span":{"start":[2855,83],"end":[2855,125],"bytes":[91645,91687]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2861:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2861:14","span":{"start":[2861,14],"end":[2861,41],"bytes":[91882,91909]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"2861:28":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2861:28","span":{"start":[2861,28],"end":[2861,40],"bytes":[91896,91908]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2862:27":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2862:27","span":{"start":[2862,27],"end":[2862,49],"bytes":[91936,91958]},"callee":"can://litestream/litestream/@external/errors/Is"},"2862:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2862:5","span":{"start":[2862,5],"end":[2862,23],"bytes":[91914,91932]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"2862:53":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2862:53","span":{"start":[2862,53],"end":[2862,88],"bytes":[91962,91997]},"callee":"can://litestream/litestream/@external/errors/Is"},"2865:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2865:13","span":{"start":[2865,13],"end":[2865,58],"bytes":[92064,92109]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2867:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2867:11","span":{"start":[2867,11],"end":[2867,44],"bytes":[92123,92156]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"2868:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2868:11","span":{"start":[2868,11],"end":[2868,44],"bytes":[92167,92200]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"2869:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2869:14","span":{"start":[2869,14],"end":[2869,26],"bytes":[92214,92226]},"callee":null},"2869:48":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2869:48","span":{"start":[2869,48],"end":[2869,60],"bytes":[92248,92260]},"callee":null},"2873:34":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2873:34","span":{"start":[2873,34],"end":[2873,46],"bytes":[92337,92349]},"callee":null},"2873:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset@2873:9","span":{"start":[2873,9],"end":[2873,21],"bytes":[92312,92324]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset.closure_1","kind":"function","span":{"start":[2851,1],"end":[2851,34],"bytes":[91458,91491]},"signature":"github.com/benbjohnson/litestream.DB.snapshotWALEndOffset.closure_1","parameters":[],"body":{"2851:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset.closure_1@2851:21","span":{"start":[2851,21],"end":[2851,30],"bytes":[91478,91487]},"callee":"can://litestream/litestream/@external/os/File.Close"}}}}},"github.com/benbjohnson/litestream.DB.sync":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","kind":"method","span":{"start":[2072,1],"end":[2360,2],"bytes":[66720,75776]},"signature":"github.com/benbjohnson/litestream.DB.sync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}},{"name":"checkpointing","type":"bool","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}},{"name":"info","type":"github.com/benbjohnson/litestream.syncInfo","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}},{"name":"maxSyncWALBytes","type":"int64","span":{"start":[2072,1],"end":[2072,151],"bytes":[66720,66870]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":40},"body":{"2081:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2081:2","span":{"start":[2081,2],"end":[2086,5],"bytes":[67119,67269]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2088:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2088:14","span":{"start":[2088,14],"end":[2088,39],"bytes":[67284,67309]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"2091:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2091:11","span":{"start":[2091,11],"end":[2091,24],"bytes":[67340,67353]},"callee":null},"2095:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2095:13","span":{"start":[2095,13],"end":[2095,45],"bytes":[67415,67447]},"callee":null},"2098:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2098:13","span":{"start":[2098,13],"end":[2098,44],"bytes":[67487,67518]},"callee":null},"2101:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2101:13","span":{"start":[2101,13],"end":[2101,51],"bytes":[67558,67596]},"callee":null},"2103:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2103:2","span":{"start":[2103,2],"end":[2103,37],"bytes":[67601,67636]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"2107:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2107:3","span":{"start":[2107,3],"end":[2107,19],"bytes":[67742,67758]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"},"2108:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2108:9","span":{"start":[2108,9],"end":[2108,27],"bytes":[67767,67785]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","is_deferred":true},"2111:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2111:13","span":{"start":[2111,13],"end":[2111,24],"bytes":[67802,67813]},"callee":"can://litestream/litestream/@external/os/File.Stat"},"2115:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2115:10","span":{"start":[2115,10],"end":[2115,19],"bytes":[67864,67873]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Mode"},"2116:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2116:12","span":{"start":[2116,12],"end":[2116,50],"bytes":[67885,67923]},"callee":null},"2116:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2116:19","span":{"start":[2116,19],"end":[2116,28],"bytes":[67892,67901]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"2116:31":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2116:31","span":{"start":[2116,31],"end":[2116,49],"bytes":[67904,67922]},"callee":null},"2118:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2118:18","span":{"start":[2118,18],"end":[2118,39],"bytes":[67942,67963]},"callee":"can://litestream/litestream/@external/os/Open"},"2118:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2118:26","span":{"start":[2118,26],"end":[2118,38],"bytes":[67950,67962]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"2122:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2122:8","span":{"start":[2122,8],"end":[2122,23],"bytes":[68012,68027]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"2124:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2124:21","span":{"start":[2124,21],"end":[2124,75],"bytes":[68049,68103]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"2127:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2127:16","span":{"start":[2127,16],"end":[2127,54],"bytes":[68173,68211]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader"},"2128:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2128:19","span":{"start":[2128,19],"end":[2128,56],"bytes":[68244,68281]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2133:108":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2133:108","span":{"start":[2133,108],"end":[2133,133],"bytes":[68486,68511]},"callee":"can://litestream/litestream/@external/errors/As"},"2133:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2133:16","span":{"start":[2133,16],"end":[2133,106],"bytes":[68394,68484]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset"},"2134:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2134:4","span":{"start":[2134,4],"end":[2134,101],"bytes":[68517,68614]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"2136:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2136:17","span":{"start":[2136,17],"end":[2136,55],"bytes":[68662,68700]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader"},"2137:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2137:20","span":{"start":[2137,20],"end":[2137,61],"bytes":[68734,68775]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2140:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2140:19","span":{"start":[2140,19],"end":[2140,68],"bytes":[68824,68873]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2145:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2145:2","span":{"start":[2145,2],"end":[2150,5],"bytes":[68953,69103]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2154:49":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2154:49","span":{"start":[2154,49],"end":[2154,81],"bytes":[69201,69233]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap"},"2156:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2156:18","span":{"start":[2156,18],"end":[2156,49],"bytes":[69268,69299]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2166:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2166:18","span":{"start":[2166,18],"end":[2166,123],"bytes":[69458,69563]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"2166:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2166:2","span":{"start":[2166,2],"end":[2166,124],"bytes":[69442,69564]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert"},"2167:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2167:2","span":{"start":[2167,2],"end":[2173,5],"bytes":[69566,69737]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2177:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2177:3","span":{"start":[2177,3],"end":[2177,43],"bytes":[69788,69828]},"callee":null},"2177:31":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2177:31","span":{"start":[2177,31],"end":[2177,42],"bytes":[69816,69827]},"callee":null},"2182:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2182:3","span":{"start":[2182,3],"end":[2182,86],"bytes":[69936,70019]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"2187:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2187:12","span":{"start":[2187,12],"end":[2187,68],"bytes":[70090,70146]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"2187:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2187:30","span":{"start":[2187,30],"end":[2187,55],"bytes":[70108,70133]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"2188:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2188:6","span":{"start":[2188,6],"end":[2188,26],"bytes":[70166,70186]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2189:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2189:19","span":{"start":[2189,19],"end":[2189,129],"bytes":[70207,70317]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2189:62":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2189:62","span":{"start":[2189,62],"end":[2189,74],"bytes":[70250,70262]},"callee":null},"2189:76":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2189:76","span":{"start":[2189,76],"end":[2189,88],"bytes":[70264,70276]},"callee":null},"2189:90":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2189:90","span":{"start":[2189,90],"end":[2189,128],"bytes":[70278,70316]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2194:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2194:18","span":{"start":[2194,18],"end":[2194,85],"bytes":[70364,70431]},"callee":null},"2196:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2196:6","span":{"start":[2196,6],"end":[2196,26],"bytes":[70454,70474]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2197:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2197:19","span":{"start":[2197,19],"end":[2197,128],"bytes":[70495,70604]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2197:61":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2197:61","span":{"start":[2197,61],"end":[2197,73],"bytes":[70537,70549]},"callee":null},"2197:75":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2197:75","span":{"start":[2197,75],"end":[2197,87],"bytes":[70551,70563]},"callee":null},"2197:89":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2197:89","span":{"start":[2197,89],"end":[2197,127],"bytes":[70565,70603]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2199:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2199:18","span":{"start":[2199,18],"end":[2199,59],"bytes":[70626,70667]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2201:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2201:8","span":{"start":[2201,8],"end":[2201,47],"bytes":[70678,70717]},"callee":null,"is_deferred":true},"2202:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2202:8","span":{"start":[2202,8],"end":[2202,40],"bytes":[70725,70757]},"callee":null,"is_deferred":true},"2204:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2204:14","span":{"start":[2204,14],"end":[2204,44],"bytes":[70772,70802]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo"},"2205:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2205:6","span":{"start":[2205,6],"end":[2205,37],"bytes":[70808,70839]},"callee":"can://litestream/litestream/@external/os/Chown"},"2207:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2207:2","span":{"start":[2207,2],"end":[2213,21],"bytes":[70842,71030]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"2208:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2208:11","span":{"start":[2208,11],"end":[2208,24],"bytes":[70909,70922]},"callee":null},"2215:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2215:15","span":{"start":[2215,15],"end":[2215,25],"bytes":[71046,71056]},"callee":"can://litestream/litestream/@external/time/Now"},"2216:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2216:14","span":{"start":[2216,14],"end":[2216,37],"bytes":[71070,71093]},"callee":null},"2218:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2218:18","span":{"start":[2218,18],"end":[2218,56],"bytes":[71128,71166]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2220:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2220:12","span":{"start":[2220,12],"end":[2232,4],"bytes":[71181,71496]},"callee":null},"2223:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2223:14","span":{"start":[2223,14],"end":[2223,33],"bytes":[71288,71307]},"callee":null},"2227:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2227:14","span":{"start":[2227,14],"end":[2227,35],"bytes":[71381,71402]},"callee":"can://litestream/litestream/@external/time/Time.UnixMilli"},"2233:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2233:6","span":{"start":[2233,6],"end":[2233,26],"bytes":[71516,71536]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2234:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2234:19","span":{"start":[2234,19],"end":[2234,129],"bytes":[71557,71667]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2234:62":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2234:62","span":{"start":[2234,62],"end":[2234,74],"bytes":[71600,71612]},"callee":null},"2234:76":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2234:76","span":{"start":[2234,76],"end":[2234,88],"bytes":[71614,71626]},"callee":null},"2234:90":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2234:90","span":{"start":[2234,90],"end":[2234,128],"bytes":[71628,71666]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2236:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2236:18","span":{"start":[2236,18],"end":[2236,58],"bytes":[71689,71729]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2242:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2242:3","span":{"start":[2242,3],"end":[2248,6],"bytes":[71880,72044]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2249:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2249:13","span":{"start":[2249,13],"end":[2249,66],"bytes":[72057,72110]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB"},"2250:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2250:7","span":{"start":[2250,7],"end":[2250,27],"bytes":[72131,72151]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2251:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2251:20","span":{"start":[2251,20],"end":[2251,130],"bytes":[72173,72283]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2251:63":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2251:63","span":{"start":[2251,63],"end":[2251,75],"bytes":[72216,72228]},"callee":null},"2251:77":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2251:77","span":{"start":[2251,77],"end":[2251,89],"bytes":[72230,72242]},"callee":null},"2251:91":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2251:91","span":{"start":[2251,91],"end":[2251,129],"bytes":[72244,72282]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2253:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2253:19","span":{"start":[2253,19],"end":[2253,59],"bytes":[72307,72347]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2256:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2256:3","span":{"start":[2256,3],"end":[2262,6],"bytes":[72364,72530]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2263:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2263:13","span":{"start":[2263,13],"end":[2263,84],"bytes":[72543,72614]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL"},"2264:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2264:7","span":{"start":[2264,7],"end":[2264,27],"bytes":[72635,72655]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2265:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2265:20","span":{"start":[2265,20],"end":[2265,130],"bytes":[72677,72787]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2265:63":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2265:63","span":{"start":[2265,63],"end":[2265,75],"bytes":[72720,72732]},"callee":null},"2265:77":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2265:77","span":{"start":[2265,77],"end":[2265,89],"bytes":[72734,72746]},"callee":null},"2265:91":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2265:91","span":{"start":[2265,91],"end":[2265,129],"bytes":[72748,72786]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2267:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2267:19","span":{"start":[2267,19],"end":[2267,60],"bytes":[72811,72852]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2272:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2272:2","span":{"start":[2272,2],"end":[2275,4],"bytes":[72915,73011]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2276:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2276:12","span":{"start":[2276,12],"end":[2276,23],"bytes":[73023,73034]},"callee":null},"2277:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2277:6","span":{"start":[2277,6],"end":[2277,26],"bytes":[73054,73074]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2278:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2278:19","span":{"start":[2278,19],"end":[2278,129],"bytes":[73095,73205]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2278:62":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2278:62","span":{"start":[2278,62],"end":[2278,74],"bytes":[73138,73150]},"callee":null},"2278:76":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2278:76","span":{"start":[2278,76],"end":[2278,88],"bytes":[73152,73164]},"callee":null},"2278:90":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2278:90","span":{"start":[2278,90],"end":[2278,128],"bytes":[73166,73204]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2280:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2280:18","span":{"start":[2280,18],"end":[2280,58],"bytes":[73227,73267]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2284:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2284:2","span":{"start":[2284,2],"end":[2287,4],"bytes":[73300,73396]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2288:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2288:12","span":{"start":[2288,12],"end":[2288,26],"bytes":[73408,73422]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Sync"},"2289:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2289:6","span":{"start":[2289,6],"end":[2289,26],"bytes":[73442,73462]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2290:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2290:19","span":{"start":[2290,19],"end":[2290,128],"bytes":[73483,73592]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2290:61":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2290:61","span":{"start":[2290,61],"end":[2290,73],"bytes":[73525,73537]},"callee":null},"2290:75":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2290:75","span":{"start":[2290,75],"end":[2290,87],"bytes":[73539,73551]},"callee":null},"2290:89":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2290:89","span":{"start":[2290,89],"end":[2290,127],"bytes":[73553,73591]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2292:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2292:18","span":{"start":[2292,18],"end":[2292,54],"bytes":[73614,73650]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2294:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2294:12","span":{"start":[2294,12],"end":[2294,27],"bytes":[73665,73680]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Close"},"2295:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2295:6","span":{"start":[2295,6],"end":[2295,26],"bytes":[73700,73720]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"2296:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2296:19","span":{"start":[2296,19],"end":[2296,129],"bytes":[73741,73851]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"2296:62":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2296:62","span":{"start":[2296,62],"end":[2296,74],"bytes":[73784,73796]},"callee":null},"2296:76":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2296:76","span":{"start":[2296,76],"end":[2296,88],"bytes":[73798,73810]},"callee":null},"2296:90":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2296:90","span":{"start":[2296,90],"end":[2296,128],"bytes":[73812,73850]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2298:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2298:18","span":{"start":[2298,18],"end":[2298,55],"bytes":[73873,73910]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2302:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2302:2","span":{"start":[2302,2],"end":[2305,4],"bytes":[73958,74055]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2306:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2306:12","span":{"start":[2306,12],"end":[2306,44],"bytes":[74067,74099]},"callee":"can://litestream/litestream/@external/os/Rename"},"2307:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2307:3","span":{"start":[2307,3],"end":[2307,28],"bytes":[74116,74141]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"2308:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2308:3","span":{"start":[2308,3],"end":[2308,34],"bytes":[74144,74175]},"callee":null},"2309:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2309:3","span":{"start":[2309,3],"end":[2309,30],"bytes":[74213,74240]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"2310:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2310:3","span":{"start":[2310,3],"end":[2310,26],"bytes":[74243,74266]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"2311:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2311:18","span":{"start":[2311,18],"end":[2311,56],"bytes":[74284,74322]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2313:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2313:12","span":{"start":[2313,12],"end":[2313,53],"bytes":[74337,74378]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"2313:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2313:30","span":{"start":[2313,30],"end":[2313,52],"bytes":[74355,74377]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"2314:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2314:3","span":{"start":[2314,3],"end":[2314,28],"bytes":[74395,74420]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"2315:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2315:3","span":{"start":[2315,3],"end":[2315,34],"bytes":[74423,74454]},"callee":null},"2316:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2316:3","span":{"start":[2316,3],"end":[2316,30],"bytes":[74492,74519]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"2317:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2317:3","span":{"start":[2317,3],"end":[2317,26],"bytes":[74522,74545]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache"},"2318:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2318:18","span":{"start":[2318,18],"end":[2318,53],"bytes":[74563,74598]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2326:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2326:14","span":{"start":[2326,14],"end":[2326,24],"bytes":[74728,74738]},"callee":"can://litestream/litestream/@external/time/Now"},"2327:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2327:14","span":{"start":[2327,14],"end":[2327,21],"bytes":[74753,74760]},"callee":null},"2330:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2330:12","span":{"start":[2330,12],"end":[2330,30],"bytes":[74777,74795]},"callee":null},"2343:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2343:21","span":{"start":[2343,21],"end":[2343,37],"bytes":[75374,75390]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize"},"2348:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2348:2","span":{"start":[2348,2],"end":[2355,5],"bytes":[75500,75708]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"2357:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync@2357:2","span":{"start":[2357,2],"end":[2357,44],"bytes":[75711,75753]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_1","kind":"function","span":{"start":[2082,1],"end":[2086,5],"bytes":[67161,67269]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_1","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2082,1],"end":[2082,23],"bytes":[67161,67183]}}],"body":{}},"closure_10":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_10","kind":"function","span":{"start":[2302,1],"end":[2305,4],"bytes":[73957,74055]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_10","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2302,1],"end":[2302,62],"bytes":[73957,74018]}}],"body":{}},"closure_11":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_11","kind":"function","span":{"start":[2349,1],"end":[2355,5],"bytes":[75543,75708]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_11","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2349,1],"end":[2349,23],"bytes":[75543,75565]}}],"body":{}},"closure_2":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_2","kind":"function","span":{"start":[2146,1],"end":[2150,5],"bytes":[68995,69103]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_2","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2146,1],"end":[2146,23],"bytes":[68995,69017]}}],"body":{}},"closure_3":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_3","kind":"function","span":{"start":[2168,1],"end":[2173,5],"bytes":[69611,69737]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_3","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2168,1],"end":[2168,23],"bytes":[69611,69633]}}],"body":{}},"closure_4":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_4","kind":"function","span":{"start":[2201,1],"end":[2201,47],"bytes":[70671,70717]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_4","parameters":[],"body":{"2201:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_4@2201:21","span":{"start":[2201,21],"end":[2201,43],"bytes":[70691,70713]},"callee":"can://litestream/litestream/@external/os/Remove"}}},"closure_5":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_5","kind":"function","span":{"start":[2202,1],"end":[2202,40],"bytes":[70718,70757]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_5","parameters":[],"body":{"2202:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_5@2202:21","span":{"start":[2202,21],"end":[2202,36],"bytes":[70738,70753]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Close"}}},"closure_6":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_6","kind":"function","span":{"start":[2243,1],"end":[2248,6],"bytes":[71925,72044]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_6","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2243,1],"end":[2243,24],"bytes":[71925,71948]}}],"body":{}},"closure_7":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_7","kind":"function","span":{"start":[2257,1],"end":[2262,6],"bytes":[72410,72530]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_7","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2257,1],"end":[2257,24],"bytes":[72410,72433]}}],"body":{}},"closure_8":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_8","kind":"function","span":{"start":[2272,1],"end":[2275,4],"bytes":[72914,73011]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_8","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2272,1],"end":[2272,61],"bytes":[72914,72974]}}],"body":{}},"closure_9":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_9","kind":"function","span":{"start":[2284,1],"end":[2287,4],"bytes":[73299,73396]},"signature":"github.com/benbjohnson/litestream.DB.sync.closure_9","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[2284,1],"end":[2284,61],"bytes":[73299,73359]}}],"body":{}}}},"github.com/benbjohnson/litestream.DB.syncLocked":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","kind":"method","span":{"start":[1331,1],"end":[1410,2],"bytes":[42342,44853]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1331,1],"end":[1331,102],"bytes":[42342,42443]}},{"name":"maxSyncWALBytes","type":"int64","span":{"start":[1331,1],"end":[1331,102],"bytes":[42342,42443]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1332:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1332:2","span":{"start":[1332,2],"end":[1332,30],"bytes":[42445,42473]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag"},"1333:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1333:8","span":{"start":[1333,8],"end":[1333,43],"bytes":[42481,42516]},"callee":null,"is_deferred":true},"1336:7":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1336:7","span":{"start":[1336,7],"end":[1336,17],"bytes":[42554,42564]},"callee":"can://litestream/litestream/@external/time/Now"},"1337:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1337:8","span":{"start":[1337,8],"end":[1348,5],"bytes":[42572,42819]},"callee":null,"is_deferred":true},"1350:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1350:15","span":{"start":[1350,15],"end":[1350,38],"bytes":[42835,42858]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor"},"1354:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1354:3","span":{"start":[1354,3],"end":[1354,45],"bytes":[42924,42966]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1357:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1357:8","span":{"start":[1357,8],"end":[1357,40],"bytes":[42998,43030]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","is_deferred":true},"1360:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1360:2","span":{"start":[1360,2],"end":[1362,4],"bytes":[43078,43199]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1363:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1363:12","span":{"start":[1363,12],"end":[1363,35],"bytes":[43211,43234]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists"},"1364:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1364:18","span":{"start":[1364,18],"end":[1364,58],"bytes":[43266,43306]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1367:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1367:2","span":{"start":[1367,2],"end":[1369,4],"bytes":[43312,43409]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1370:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1370:16","span":{"start":[1370,16],"end":[1370,79],"bytes":[43425,43488]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"},"1374:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1374:2","span":{"start":[1374,2],"end":[1374,30],"bytes":[43531,43559]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult"},"1385:49":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1385:49","span":{"start":[1385,49],"end":[1385,96],"bytes":[44031,44078]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold"},"1386:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1386:3","span":{"start":[1386,3],"end":[1389,5],"bytes":[44083,44241]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1390:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1390:13","span":{"start":[1390,13],"end":[1390,84],"bytes":[44254,44325]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded"},"1391:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1391:19","span":{"start":[1391,19],"end":[1391,52],"bytes":[44358,44391]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1395:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1395:2","span":{"start":[1395,2],"end":[1398,4],"bytes":[44401,44551]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1401:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1401:19","span":{"start":[1401,19],"end":[1401,41],"bytes":[44624,44646]},"callee":null},"1401:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1401:2","span":{"start":[1401,2],"end":[1401,42],"bytes":[44607,44647]},"callee":null},"1404:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1404:16","span":{"start":[1404,16],"end":[1404,32],"bytes":[44694,44710]},"callee":"can://litestream/litestream/@external/os/Stat"},"1405:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1405:22","span":{"start":[1405,22],"end":[1405,40],"bytes":[44746,44764]},"callee":null},"1405:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1405:3","span":{"start":[1405,3],"end":[1405,41],"bytes":[44727,44765]},"callee":null},"1405:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1405:30","span":{"start":[1405,30],"end":[1405,39],"bytes":[44754,44763]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"1407:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1407:2","span":{"start":[1407,2],"end":[1407,62],"bytes":[44770,44830]},"callee":null},"1407:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked@1407:22","span":{"start":[1407,22],"end":[1407,61],"bytes":[44790,44829]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_1","kind":"function","span":{"start":[1333,1],"end":[1333,43],"bytes":[42474,42516]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_1","parameters":[],"body":{"1333:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_1@1333:17","span":{"start":[1333,17],"end":[1333,39],"bytes":[42490,42512]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag"}}},"closure_2":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2","kind":"function","span":{"start":[1337,1],"end":[1348,5],"bytes":[42565,42819]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_2","parameters":[],"body":{"1338:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2@1338:3","span":{"start":[1338,3],"end":[1338,24],"bytes":[42583,42604]},"callee":null},"1340:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2@1340:4","span":{"start":[1340,4],"end":[1340,30],"bytes":[42626,42652]},"callee":null},"1342:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2@1342:6","span":{"start":[1342,6],"end":[1342,26],"bytes":[42662,42682]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError"},"1343:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2@1343:4","span":{"start":[1343,4],"end":[1343,27],"bytes":[42688,42711]},"callee":null},"1345:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2@1345:4","span":{"start":[1345,4],"end":[1345,27],"bytes":[42726,42749]},"callee":null},"1347:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2@1347:3","span":{"start":[1347,3],"end":[1347,61],"bytes":[42756,42814]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.addDurationToCounter"},"1347:47":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2@1347:47","span":{"start":[1347,47],"end":[1347,60],"bytes":[42800,42813]},"callee":"can://litestream/litestream/@external/time/Since"}}},"closure_3":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_3","kind":"function","span":{"start":[1360,1],"end":[1362,4],"bytes":[43077,43199]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_3","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1360,1],"end":[1360,62],"bytes":[43077,43138]}}],"body":{}},"closure_4":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_4","kind":"function","span":{"start":[1367,1],"end":[1369,4],"bytes":[43311,43409]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_4","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1367,1],"end":[1367,66],"bytes":[43311,43376]}}],"body":{}},"closure_5":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_5","kind":"function","span":{"start":[1386,1],"end":[1389,5],"bytes":[44081,44241]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_5","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1386,1],"end":[1386,72],"bytes":[44081,44152]}}],"body":{}},"closure_6":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_6","kind":"function","span":{"start":[1395,1],"end":[1398,4],"bytes":[44400,44551]},"signature":"github.com/benbjohnson/litestream.DB.syncLocked.closure_6","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1395,1],"end":[1395,66],"bytes":[44400,44465]}}],"body":{}}}},"github.com/benbjohnson/litestream.DB.syncOnce":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce","kind":"method","span":{"start":[1301,1],"end":[1308,2],"bytes":[41559,41795]},"signature":"github.com/benbjohnson/litestream.DB.syncOnce","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1301,1],"end":[1301,89],"bytes":[41559,41647]}},{"name":"maxSyncWALBytes","type":"int64","span":{"start":[1301,1],"end":[1301,89],"bytes":[41559,41647]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1302:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce@1302:12","span":{"start":[1302,12],"end":[1302,28],"bytes":[41659,41675]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec"},"1305:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce@1305:8","span":{"start":[1305,8],"end":[1305,29],"bytes":[41727,41748]},"callee":null,"is_deferred":true},"1307:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce@1307:9","span":{"start":[1307,9],"end":[1307,44],"bytes":[41758,41793]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked"}}},"github.com/benbjohnson/litestream.DB.syncReplicaWithRetry":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","kind":"method","span":{"start":[944,1],"end":[1057,2],"bytes":[31215,34369]},"signature":"github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[944,1],"end":[944,64],"bytes":[31215,31278]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":24},"body":{"1002:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1002:13","span":{"start":[1002,13],"end":[1002,37],"bytes":[32598,32622]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync"},"1004:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1004:5","span":{"start":[1004,5],"end":[1006,40],"bytes":[32661,32780]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"1006:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1006:18","span":{"start":[1006,18],"end":[1006,39],"bytes":[32758,32779]},"callee":"can://litestream/litestream/@external/time/Since"},"1015:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1015:10","span":{"start":[1015,10],"end":[1015,28],"bytes":[32916,32934]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"1016:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1016:4","span":{"start":[1016,4],"end":[1019,22],"bytes":[32939,33078]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"1018:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1018:17","span":{"start":[1018,17],"end":[1018,38],"bytes":[33034,33055]},"callee":"can://litestream/litestream/@external/time/Since"},"1020:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1020:11","span":{"start":[1020,11],"end":[1020,86],"bytes":[33089,33164]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1022:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1022:4","span":{"start":[1022,4],"end":[1025,22],"bytes":[33186,33325]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"1024:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1024:17","span":{"start":[1024,17],"end":[1024,38],"bytes":[33281,33302]},"callee":"can://litestream/litestream/@external/time/Since"},"1026:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1026:11","span":{"start":[1026,11],"end":[1026,79],"bytes":[33336,33404]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1032:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1032:4","span":{"start":[1032,4],"end":[1036,53],"bytes":[33508,33723]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"1035:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1035:16","span":{"start":[1035,16],"end":[1035,37],"bytes":[33648,33669]},"callee":"can://litestream/litestream/@external/time/Since"},"1036:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1036:18","span":{"start":[1036,18],"end":[1036,52],"bytes":[33688,33722]},"callee":"can://litestream/litestream/@external/time/Until"},"1036:29":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1036:29","span":{"start":[1036,29],"end":[1036,51],"bytes":[33699,33721]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"1038:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1038:4","span":{"start":[1038,4],"end":[1042,53],"bytes":[33738,33924]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"1041:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1041:16","span":{"start":[1041,16],"end":[1041,37],"bytes":[33849,33870]},"callee":"can://litestream/litestream/@external/time/Since"},"1042:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1042:18","span":{"start":[1042,18],"end":[1042,52],"bytes":[33889,33923]},"callee":"can://litestream/litestream/@external/time/Until"},"1042:29":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1042:29","span":{"start":[1042,29],"end":[1042,51],"bytes":[33900,33922]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"1047:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1047:10","span":{"start":[1047,10],"end":[1047,30],"bytes":[34006,34026]},"callee":"can://litestream/litestream/@external/time/After"},"1048:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1048:10","span":{"start":[1048,10],"end":[1048,28],"bytes":[34037,34055]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"1049:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1049:11","span":{"start":[1049,11],"end":[1049,86],"bytes":[34067,34142]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1051:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1051:4","span":{"start":[1051,4],"end":[1053,39],"bytes":[34164,34281]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"1053:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1053:17","span":{"start":[1053,17],"end":[1053,38],"bytes":[34259,34280]},"callee":"can://litestream/litestream/@external/time/Since"},"1054:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@1054:11","span":{"start":[1054,11],"end":[1054,79],"bytes":[34292,34360]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"954:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@954:10","span":{"start":[954,10],"end":[954,30],"bytes":[31470,31490]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync"},"963:33":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@963:33","span":{"start":[963,33],"end":[963,66],"bytes":[31682,31715]},"callee":"can://litestream/litestream/@external/context/WithTimeout"},"964:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@964:8","span":{"start":[964,8],"end":[964,24],"bytes":[31723,31739]},"callee":null,"is_deferred":true},"971:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@971:25","span":{"start":[971,25],"end":[971,56],"bytes":[31989,32020]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"972:6":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@972:6","span":{"start":[972,6],"end":[979,6],"bytes":[32026,32140]},"callee":null,"is_goroutine":true},"984:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@984:15","span":{"start":[984,15],"end":[984,25],"bytes":[32192,32202]},"callee":"can://litestream/litestream/@external/time/Now"},"991:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@991:5","span":{"start":[991,5],"end":[993,40],"bytes":[32328,32456]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"993:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@993:18","span":{"start":[993,18],"end":[993,39],"bytes":[32434,32455]},"callee":"can://litestream/litestream/@external/time/Since"},"994:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry@994:12","span":{"start":[994,12],"end":[994,80],"bytes":[32468,32536]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry.closure_1","kind":"function","span":{"start":[972,1],"end":[979,6],"bytes":[32021,32140]},"signature":"github.com/benbjohnson/litestream.DB.syncReplicaWithRetry.closure_1","parameters":[],"body":{"975:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry.closure_1@975:5","span":{"start":[975,5],"end":[975,17],"bytes":[32070,32082]},"callee":null},"976:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry.closure_1@976:11","span":{"start":[976,11],"end":[976,29],"bytes":[32093,32111]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"977:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry.closure_1@977:5","span":{"start":[977,5],"end":[977,17],"bytes":[32117,32129]},"callee":null}}}}},"github.com/benbjohnson/litestream.DB.verify":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify","kind":"method","span":{"start":[1741,1],"end":[1751,2],"bytes":[56519,56779]},"signature":"github.com/benbjohnson/litestream.DB.verify","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1741,1],"end":[1741,89],"bytes":[56519,56607]}},{"name":"state","type":"*github.com/benbjohnson/litestream.syncState","span":{"start":[1741,1],"end":[1741,89],"bytes":[56519,56607]}}],"return_type":"(github.com/benbjohnson/litestream.syncInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1742:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify@1742:14","span":{"start":[1742,14],"end":[1742,22],"bytes":[56621,56629]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"1744:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify@1744:16","span":{"start":[1744,16],"end":[1744,42],"bytes":[56662,56688]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1747:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify@1747:9","span":{"start":[1747,9],"end":[1750,4],"bytes":[56701,56777]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor"}}},"github.com/benbjohnson/litestream.DB.verifyAndSync":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync","kind":"method","span":{"start":[1412,1],"end":[1422,2],"bytes":[44855,45168]},"signature":"github.com/benbjohnson/litestream.DB.verifyAndSync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1412,1],"end":[1412,109],"bytes":[44855,44963]}},{"name":"checkpointing","type":"bool","span":{"start":[1412,1],"end":[1412,109],"bytes":[44855,44963]}},{"name":"state","type":"*github.com/benbjohnson/litestream.syncState","span":{"start":[1412,1],"end":[1412,109],"bytes":[44855,44963]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1413:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync@1413:14","span":{"start":[1413,14],"end":[1413,22],"bytes":[44977,44985]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"1415:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync@1415:24","span":{"start":[1415,24],"end":[1415,50],"bytes":[45026,45052]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1418:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync@1418:9","span":{"start":[1418,9],"end":[1421,7],"bytes":[45065,45166]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor"}}},"github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","kind":"method","span":{"start":[1424,1],"end":[1465,2],"bytes":[45170,46694]},"signature":"github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1424,1],"end":[1424,146],"bytes":[45170,45315]}},{"name":"checkpointing","type":"bool","span":{"start":[1424,1],"end":[1424,146],"bytes":[45170,45315]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[1424,1],"end":[1424,146],"bytes":[45170,45315]}},{"name":"maxSyncWALBytes","type":"int64","span":{"start":[1424,1],"end":[1424,146],"bytes":[45170,45315]}}],"return_type":"(github.com/benbjohnson/litestream.syncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"1425:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1425:2","span":{"start":[1425,2],"end":[1428,4],"bytes":[45317,45465]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1437:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1437:22","span":{"start":[1437,22],"end":[1437,38],"bytes":[45823,45839]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize"},"1439:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1439:25","span":{"start":[1439,25],"end":[1439,68],"bytes":[45882,45925]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1446:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1446:2","span":{"start":[1446,2],"end":[1446,38],"bytes":[46107,46143]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1447:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1447:15","span":{"start":[1447,15],"end":[1447,47],"bytes":[46158,46190]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor"},"1449:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1449:24","span":{"start":[1449,24],"end":[1449,70],"bytes":[46231,46277]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1452:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1452:2","span":{"start":[1452,2],"end":[1457,4],"bytes":[46283,46493]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase"},"1458:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1458:17","span":{"start":[1458,17],"end":[1458,73],"bytes":[46510,46566]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync"},"1460:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor@1460:24","span":{"start":[1460,24],"end":[1460,51],"bytes":[46607,46634]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor.closure_1","kind":"function","span":{"start":[1425,1],"end":[1428,4],"bytes":[45316,45465]},"signature":"github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor.closure_1","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1425,1],"end":[1425,60],"bytes":[45316,45375]}}],"body":{}},"closure_2":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor.closure_2","kind":"function","span":{"start":[1452,1],"end":[1457,4],"bytes":[46282,46493]},"signature":"github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor.closure_2","parameters":[{"name":"s","type":"*github.com/benbjohnson/litestream.diagState","span":{"start":[1452,1],"end":[1452,60],"bytes":[46282,46341]}}],"body":{}}}},"github.com/benbjohnson/litestream.DB.verifyWithExecutor":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","kind":"method","span":{"start":[1753,1],"end":[1896,2],"bytes":[56781,62028]},"signature":"github.com/benbjohnson/litestream.DB.verifyWithExecutor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1753,1],"end":[1753,103],"bytes":[56781,56883]}},{"name":"exec","type":"*github.com/benbjohnson/litestream.syncExecutor","span":{"start":[1753,1],"end":[1753,103],"bytes":[56781,56883]}}],"return_type":"(github.com/benbjohnson/litestream.syncInfo, error)","error_channel":["error"],"metrics":{"cyclomatic":20},"body":{"1754:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1754:15","span":{"start":[1754,15],"end":[1754,54],"bytes":[56898,56937]},"callee":null},"1763:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1763:13","span":{"start":[1763,13],"end":[1763,56],"bytes":[57113,57156]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"1764:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1764:18","span":{"start":[1764,18],"end":[1764,34],"bytes":[57174,57190]},"callee":"can://litestream/litestream/@external/os/Open"},"1766:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1766:16","span":{"start":[1766,16],"end":[1766,98],"bytes":[57223,57305]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"1766:48":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1766:48","span":{"start":[1766,48],"end":[1766,69],"bytes":[57255,57276]},"callee":null},"1766:71":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1766:71","span":{"start":[1766,71],"end":[1766,92],"bytes":[57278,57299]},"callee":null},"1768:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1768:8","span":{"start":[1768,8],"end":[1768,40],"bytes":[57316,57348]},"callee":null,"is_deferred":true},"1770:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1770:9","span":{"start":[1770,9],"end":[1770,32],"bytes":[57358,57381]},"callee":null},"1771:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1771:12","span":{"start":[1771,12],"end":[1771,30],"bytes":[57393,57411]},"callee":null},"1773:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1773:13","span":{"start":[1773,13],"end":[1773,136],"bytes":[57479,57602]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"1773:47":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1773:47","span":{"start":[1773,47],"end":[1773,68],"bytes":[57513,57534]},"callee":null},"1773:70":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1773:70","span":{"start":[1773,70],"end":[1773,91],"bytes":[57536,57557]},"callee":null},"1773:93":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1773:93","span":{"start":[1773,93],"end":[1773,135],"bytes":[57559,57601]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1776:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1776:16","span":{"start":[1776,16],"end":[1776,28],"bytes":[57643,57655]},"callee":null},"1776:41":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1776:41","span":{"start":[1776,41],"end":[1776,53],"bytes":[57668,57680]},"callee":null},"1777:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1777:15","span":{"start":[1777,15],"end":[1777,27],"bytes":[57703,57715]},"callee":null},"1778:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1778:15","span":{"start":[1778,15],"end":[1778,27],"bytes":[57739,57751]},"callee":null},"1779:20":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1779:20","span":{"start":[1779,20],"end":[1779,32],"bytes":[57780,57792]},"callee":null},"1782:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1782:16","span":{"start":[1782,16],"end":[1782,37],"bytes":[57895,57916]},"callee":"can://litestream/litestream/@external/os/Stat"},"1782:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1782:24","span":{"start":[1782,24],"end":[1782,36],"bytes":[57903,57915]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1783:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1783:16","span":{"start":[1783,16],"end":[1783,52],"bytes":[57946,57982]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1784:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1784:26","span":{"start":[1784,26],"end":[1784,35],"bytes":[58008,58017]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"1792:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1792:16","span":{"start":[1792,16],"end":[1792,43],"bytes":[58389,58416]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"1792:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1792:30","span":{"start":[1792,30],"end":[1792,42],"bytes":[58403,58415]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1794:18":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1794:18","span":{"start":[1794,18],"end":[1794,82],"bytes":[58453,58517]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1798:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1798:17","span":{"start":[1798,17],"end":[1798,50],"bytes":[58571,58604]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"1799:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1799:17","span":{"start":[1799,17],"end":[1799,50],"bytes":[58621,58654]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"1804:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1804:4","span":{"start":[1804,4],"end":[1806,29],"bytes":[58743,58897]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"1816:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1816:15","span":{"start":[1816,15],"end":[1816,42],"bytes":[59081,59108]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader"},"1816:29":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1816:29","span":{"start":[1816,29],"end":[1816,41],"bytes":[59095,59107]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1818:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1818:16","span":{"start":[1818,16],"end":[1818,61],"bytes":[59141,59186]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1820:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1820:11","span":{"start":[1820,11],"end":[1820,45],"bytes":[59200,59234]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"1821:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1821:11","span":{"start":[1821,11],"end":[1821,45],"bytes":[59245,59279]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"1822:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1822:24","span":{"start":[1822,24],"end":[1822,36],"bytes":[59303,59315]},"callee":null},"1822:58":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1822:58","span":{"start":[1822,58],"end":[1822,70],"bytes":[59337,59349]},"callee":null},"1833:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1833:3","span":{"start":[1833,3],"end":[1833,73],"bytes":[59806,59876]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1844:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1844:2","span":{"start":[1844,2],"end":[1844,83],"bytes":[60154,60235]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1855:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1855:16","span":{"start":[1855,16],"end":[1855,93],"bytes":[60608,60685]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1859:24":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1859:24","span":{"start":[1859,24],"end":[1859,76],"bytes":[60801,60853]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch"},"1861:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1861:16","span":{"start":[1861,16],"end":[1861,54],"bytes":[60886,60924]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1870:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1870:2","span":{"start":[1870,2],"end":[1870,61],"bytes":[61217,61276]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1875:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1875:3","span":{"start":[1875,3],"end":[1877,19],"bytes":[61450,61544]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"1882:104":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1882:104","span":{"start":[1882,104],"end":[1882,116],"bytes":[61720,61732]},"callee":null},"1882:23":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1882:23","span":{"start":[1882,23],"end":[1882,128],"bytes":[61639,61744]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint"},"1882:81":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1882:81","span":{"start":[1882,81],"end":[1882,93],"bytes":[61697,61709]},"callee":null},"1883:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor@1883:17","span":{"start":[1883,17],"end":[1883,62],"bytes":[61775,61820]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor/github.com/benbjohnson/litestream.DB.verifyWithExecutor.closure_1","kind":"function","span":{"start":[1768,1],"end":[1768,40],"bytes":[57309,57348]},"signature":"github.com/benbjohnson/litestream.DB.verifyWithExecutor.closure_1","parameters":[],"body":{"1768:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor/github.com/benbjohnson/litestream.DB.verifyWithExecutor.closure_1@1768:21","span":{"start":[1768,21],"end":[1768,36],"bytes":[57329,57344]},"callee":"can://litestream/litestream/@external/os/File.Close"}}}}},"github.com/benbjohnson/litestream.DB.walFileSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","kind":"method","span":{"start":[1622,1],"end":[1630,2],"bytes":[52670,52857]},"signature":"github.com/benbjohnson/litestream.DB.walFileSize","parameters":[],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1623:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize@1623:13","span":{"start":[1623,13],"end":[1623,34],"bytes":[52727,52748]},"callee":"can://litestream/litestream/@external/os/Stat"},"1623:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize@1623:21","span":{"start":[1623,21],"end":[1623,33],"bytes":[52735,52747]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath"},"1624:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize@1624:5","span":{"start":[1624,5],"end":[1624,23],"bytes":[52753,52771]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"1629:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize@1629:9","span":{"start":[1629,9],"end":[1629,18],"bytes":[52841,52850]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"}}},"github.com/benbjohnson/litestream.DB.writeLTXFromDB":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","kind":"method","span":{"start":[2362,1],"end":[2407,2],"bytes":[75778,77350]},"signature":"github.com/benbjohnson/litestream.DB.writeLTXFromDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}},{"name":"enc","type":"invalid type","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}},{"name":"walFile","type":"*os.File","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}},{"name":"commit","type":"uint32","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}},{"name":"pageMap","type":"map[uint32]int64","span":{"start":[2362,1],"end":[2362,135],"bytes":[75778,75912]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"2363:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2363:14","span":{"start":[2363,14],"end":[2363,47],"bytes":[75926,75959]},"callee":null},"2363:27":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2363:27","span":{"start":[2363,27],"end":[2363,46],"bytes":[75939,75958]},"callee":null},"2364:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2364:10","span":{"start":[2364,10],"end":[2364,35],"bytes":[75969,75994]},"callee":null},"2366:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2366:14","span":{"start":[2366,14],"end":[2366,23],"bytes":[76009,76018]},"callee":null},"2373:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2373:10","span":{"start":[2373,10],"end":[2373,20],"bytes":[76163,76173]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"2374:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2374:11","span":{"start":[2374,11],"end":[2374,29],"bytes":[76185,76203]},"callee":"can://litestream/litestream/@external/context/Cause"},"2380:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2380:4","span":{"start":[2380,4],"end":[2380,147],"bytes":[76311,76454]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"2380:76":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2380:76","span":{"start":[2380,76],"end":[2380,88],"bytes":[76383,76395]},"callee":null},"2382:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2382:17","span":{"start":[2382,17],"end":[2382,64],"bytes":[76472,76519]},"callee":"can://litestream/litestream/@external/os/File.ReadAt"},"2383:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2383:12","span":{"start":[2383,12],"end":[2383,66],"bytes":[76545,76599]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2384:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2384:19","span":{"start":[2384,19],"end":[2384,28],"bytes":[76618,76627]},"callee":null},"2385:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2385:12","span":{"start":[2385,12],"end":[2385,63],"bytes":[76641,76692]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2388:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2388:14","span":{"start":[2388,14],"end":[2388,62],"bytes":[76712,76760]},"callee":null},"2389:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2389:12","span":{"start":[2389,12],"end":[2389,67],"bytes":[76786,76841]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2394:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2394:13","span":{"start":[2394,13],"end":[2394,26],"bytes":[76876,76889]},"callee":null},"2394:29":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2394:29","span":{"start":[2394,29],"end":[2394,47],"bytes":[76892,76910]},"callee":null},"2395:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2395:3","span":{"start":[2395,3],"end":[2395,103],"bytes":[76913,77013]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"2398:16":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2398:16","span":{"start":[2398,16],"end":[2398,41],"bytes":[77083,77108]},"callee":"can://litestream/litestream/@external/os/File.ReadAt"},"2399:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2399:11","span":{"start":[2399,11],"end":[2399,61],"bytes":[77133,77183]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2401:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2401:13","span":{"start":[2401,13],"end":[2401,61],"bytes":[77200,77248]},"callee":null},"2402:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB@2402:11","span":{"start":[2402,11],"end":[2402,66],"bytes":[77273,77328]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.DB.writeLTXFromWAL":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","kind":"method","span":{"start":[2409,1],"end":[2466,2],"bytes":[77352,79300]},"signature":"github.com/benbjohnson/litestream.DB.writeLTXFromWAL","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"enc","type":"invalid type","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"walFile","type":"*os.File","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"prevCommit","type":"uint32","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"commit","type":"uint32","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}},{"name":"pageMap","type":"map[uint32]int64","span":{"start":[2409,1],"end":[2409,148],"bytes":[77352,77499]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":16},"body":{"2411:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2411:11","span":{"start":[2411,11],"end":[2411,42],"bytes":[77588,77619]},"callee":null},"2411:29":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2411:29","span":{"start":[2411,29],"end":[2411,41],"bytes":[77606,77618]},"callee":null},"2413:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2413:11","span":{"start":[2413,11],"end":[2413,30],"bytes":[77659,77678]},"callee":null},"2415:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2415:14","span":{"start":[2415,14],"end":[2415,47],"bytes":[77695,77728]},"callee":null},"2415:27":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2415:27","span":{"start":[2415,27],"end":[2415,46],"bytes":[77708,77727]},"callee":null},"2417:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2417:15","span":{"start":[2417,15],"end":[2417,25],"bytes":[77769,77779]},"callee":null},"2425:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2425:12","span":{"start":[2425,12],"end":[2425,31],"bytes":[77942,77961]},"callee":null},"2427:21":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2427:21","span":{"start":[2427,21],"end":[2427,31],"bytes":[77986,77996]},"callee":null},"2428:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2428:4","span":{"start":[2428,4],"end":[2432,22],"bytes":[78030,78196]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"2429:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2429:13","span":{"start":[2429,13],"end":[2429,25],"bytes":[78100,78112]},"callee":null},"2435:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2435:2","span":{"start":[2435,2],"end":[2435,20],"bytes":[78205,78223]},"callee":"can://litestream/litestream/@external/slices/Sort"},"2437:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2437:10","span":{"start":[2437,10],"end":[2437,35],"bytes":[78234,78259]},"callee":null},"2440:10":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2440:10","span":{"start":[2440,10],"end":[2440,20],"bytes":[78310,78320]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"2441:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2441:11","span":{"start":[2441,11],"end":[2441,29],"bytes":[78332,78350]},"callee":"can://litestream/litestream/@external/context/Cause"},"2445:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2445:4","span":{"start":[2445,4],"end":[2445,148],"bytes":[78408,78552]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"2445:76":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2445:76","span":{"start":[2445,76],"end":[2445,88],"bytes":[78480,78492]},"callee":null},"2447:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2447:17","span":{"start":[2447,17],"end":[2447,64],"bytes":[78570,78617]},"callee":"can://litestream/litestream/@external/os/File.ReadAt"},"2448:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2448:12","span":{"start":[2448,12],"end":[2448,66],"bytes":[78643,78697]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2449:19":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2449:19","span":{"start":[2449,19],"end":[2449,28],"bytes":[78716,78725]},"callee":null},"2450:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2450:12","span":{"start":[2450,12],"end":[2450,63],"bytes":[78739,78790]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2453:14":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2453:14","span":{"start":[2453,14],"end":[2453,27],"bytes":[78820,78833]},"callee":null},"2453:30":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2453:30","span":{"start":[2453,30],"end":[2453,48],"bytes":[78836,78854]},"callee":null},"2454:4":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2454:4","span":{"start":[2454,4],"end":[2454,155],"bytes":[78858,79009]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"2454:81":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2454:81","span":{"start":[2454,81],"end":[2454,93],"bytes":[78935,78947]},"callee":null},"2456:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2456:17","span":{"start":[2456,17],"end":[2456,42],"bytes":[79027,79052]},"callee":"can://litestream/litestream/@external/os/File.ReadAt"},"2457:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2457:12","span":{"start":[2457,12],"end":[2457,62],"bytes":[79078,79128]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"2461:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2461:13","span":{"start":[2461,13],"end":[2461,61],"bytes":[79151,79199]},"callee":null},"2462:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL@2462:11","span":{"start":[2462,11],"end":[2462,66],"bytes":[79224,79279]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}}},"fields":{"BusyTimeout":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/BusyTimeout","kind":"field","type":"time.Duration","span":{"start":[157,1],"end":[157,27],"bytes":[5538,5564]}},"CheckpointInterval":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/CheckpointInterval","kind":"field","type":"time.Duration","span":{"start":[145,1],"end":[145,34],"bytes":[5123,5156]}},"Done":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/Done","kind":"field","type":"\u003c-chan struct{}","span":{"start":[105,1],"end":[105,24],"bytes":[3368,3391]}},"L0Retention":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/L0Retention","kind":"field","type":"time.Duration","span":{"start":[160,1],"end":[160,27],"bytes":[5642,5668]}},"Logger":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/Logger","kind":"field","type":"*log/slog.Logger","span":{"start":[192,1],"end":[192,21],"bytes":[6903,6923]}},"MaxSyncWALBytes":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/MaxSyncWALBytes","kind":"field","type":"int64","span":{"start":[154,1],"end":[154,23],"bytes":[5467,5489]}},"MinCheckpointPageN":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/MinCheckpointPageN","kind":"field","type":"int","span":{"start":[127,1],"end":[127,24],"bytes":[4322,4345]}},"MonitorInterval":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/MonitorInterval","kind":"field","type":"time.Duration","span":{"start":[148,1],"end":[148,31],"bytes":[5201,5231]}},"Replica":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/Replica","kind":"field","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[174,1],"end":[174,18],"bytes":[6207,6224]}},"RetentionEnabled":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/RetentionEnabled","kind":"field","type":"bool","span":{"start":[170,1],"end":[170,23],"bytes":[6107,6129]}},"ShutdownSyncInterval":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/ShutdownSyncInterval","kind":"field","type":"time.Duration","span":{"start":[184,1],"end":[184,36],"bytes":[6584,6619]}},"ShutdownSyncTimeout":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/ShutdownSyncTimeout","kind":"field","type":"time.Duration","span":{"start":[183,1],"end":[183,36],"bytes":[6548,6583]}},"TruncatePageN":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/TruncatePageN","kind":"field","type":"int","span":{"start":[137,1],"end":[137,19],"bytes":[4817,4835]}},"VerifyCompaction":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/VerifyCompaction","kind":"field","type":"bool","span":{"start":[165,1],"end":[165,23],"bytes":[5864,5886]}},"cancel":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/cancel","kind":"field","type":"func()","span":{"start":[103,1],"end":[103,15],"bytes":[3330,3344]}},"checkpointErrorNCounterVec":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/checkpointErrorNCounterVec","kind":"field","type":"invalid type","span":{"start":[118,1],"end":[118,52],"bytes":[3867,3918]}},"checkpointNCounterVec":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/checkpointNCounterVec","kind":"field","type":"invalid type","span":{"start":[117,1],"end":[117,52],"bytes":[3815,3866]}},"checkpointSecondsCounterVec":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/checkpointSecondsCounterVec","kind":"field","type":"invalid type","span":{"start":[119,1],"end":[119,52],"bytes":[3919,3970]}},"chkMu":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/chkMu","kind":"field","type":"sync.RWMutex","span":{"start":[77,1],"end":[77,44],"bytes":[2567,2610]}},"compactor":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/compactor","kind":"field","type":"*github.com/benbjohnson/litestream.Compactor","span":{"start":[178,1],"end":[178,22],"bytes":[6358,6379]}},"ctx":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/ctx","kind":"field","type":"context.Context","span":{"start":[102,1],"end":[102,24],"bytes":[3306,3329]}},"db":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/db","kind":"field","type":"*database/sql.DB","span":{"start":[72,1],"end":[72,44],"bytes":[2308,2351]}},"dbSizeGauge":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/dbSizeGauge","kind":"field","type":"invalid type","span":{"start":[109,1],"end":[109,46],"bytes":[3439,3484]}},"dirInfo":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/dirInfo","kind":"field","type":"os.FileInfo","span":{"start":[96,1],"end":[96,60],"bytes":[3051,3110]}},"diskFullGauge":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/diskFullGauge","kind":"field","type":"invalid type","span":{"start":[116,1],"end":[116,46],"bytes":[3769,3814]}},"execSem":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/execSem","kind":"field","type":"invalid type","span":{"start":[69,1],"end":[69,31],"bytes":[2173,2203]}},"f":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/f","kind":"field","type":"*os.File","span":{"start":[73,1],"end":[73,60],"bytes":[2352,2411]}},"fileInfo":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/fileInfo","kind":"field","type":"os.FileInfo","span":{"start":[95,1],"end":[95,52],"bytes":[2999,3050]}},"lastSuccessfulSyncAt":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/lastSuccessfulSyncAt","kind":"field","type":"time.Time","span":{"start":[189,1],"end":[189,32],"bytes":[6793,6824]}},"lastSuccessfulSyncMu":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/lastSuccessfulSyncMu","kind":"field","type":"sync.RWMutex","span":{"start":[188,1],"end":[188,35],"bytes":[6758,6792]}},"maxLTXFileInfos":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/maxLTXFileInfos","kind":"field","type":"struct{sync.Mutex; m map[int]invalid type}","span":{"start":[83,1],"end":[86,3],"bytes":[2769,2836]}},"metaPath":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/metaPath","kind":"field","type":"string","span":{"start":[71,1],"end":[71,59],"bytes":[2249,2307]}},"metricsRegistered":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/metricsRegistered","kind":"field","type":"bool","span":{"start":[108,1],"end":[108,34],"bytes":[3405,3438]}},"mu":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/mu","kind":"field","type":"sync.RWMutex","span":{"start":[68,1],"end":[68,24],"bytes":[2149,2172]}},"notify":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/notify","kind":"field","type":"chan struct{}","span":{"start":[76,1],"end":[76,49],"bytes":[2518,2566]}},"openLTXFile":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/openLTXFile","kind":"field","type":"func(name string, flag int, perm os.FileMode) (github.com/benbjohnson/litestream.ltxStagingFile, error)","span":{"start":[100,1],"end":[100,83],"bytes":[3222,3304]}},"opened":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/opened","kind":"field","type":"bool","span":{"start":[78,1],"end":[78,81],"bytes":[2611,2691]}},"pageSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/pageSize","kind":"field","type":"int","span":{"start":[75,1],"end":[75,48],"bytes":[2470,2517]}},"path":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/path","kind":"field","type":"string","span":{"start":[70,1],"end":[70,45],"bytes":[2204,2248]}},"pos":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/pos","kind":"field","type":"struct{sync.Mutex; value invalid type}","span":{"start":[90,1],"end":[93,3],"bytes":[2951,2997]}},"rtx":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/rtx","kind":"field","type":"*database/sql.Tx","span":{"start":[74,1],"end":[74,58],"bytes":[2412,2469]}},"syncDiag":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/syncDiag","kind":"field","type":"github.com/benbjohnson/litestream.diagState","span":{"start":[80,1],"end":[80,21],"bytes":[2713,2733]}},"syncErrorNCounter":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/syncErrorNCounter","kind":"field","type":"invalid type","span":{"start":[114,1],"end":[114,48],"bytes":[3673,3720]}},"syncNCounter":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/syncNCounter","kind":"field","type":"invalid type","span":{"start":[113,1],"end":[113,48],"bytes":[3625,3672]}},"syncSecondsCounter":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/syncSecondsCounter","kind":"field","type":"invalid type","span":{"start":[115,1],"end":[115,48],"bytes":[3721,3768]}},"syncState":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/syncState","kind":"field","type":"github.com/benbjohnson/litestream.syncState","span":{"start":[79,1],"end":[79,21],"bytes":[2692,2712]}},"totalWALBytesCounter":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/totalWALBytesCounter","kind":"field","type":"invalid type","span":{"start":[111,1],"end":[111,48],"bytes":[3531,3578]}},"txIDGauge":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/txIDGauge","kind":"field","type":"invalid type","span":{"start":[112,1],"end":[112,46],"bytes":[3579,3624]}},"walSizeGauge":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/walSizeGauge","kind":"field","type":"invalid type","span":{"start":[110,1],"end":[110,46],"bytes":[3485,3530]}},"wg":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[104,1],"end":[104,23],"bytes":[3345,3367]}}}},"IntegrityCheckMode":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.IntegrityCheckMode","kind":"defined","span":{"start":[3376,1],"end":[3376,28],"bytes":[108196,108223]},"callables":{}},"RestoreOptions":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.RestoreOptions","kind":"struct","span":{"start":[3385,1],"end":[3411,2],"bytes":[108378,109263]},"callables":{},"fields":{"Follow":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.RestoreOptions/Follow","kind":"field","type":"bool","span":{"start":[3403,1],"end":[3403,13],"bytes":[108945,108957]}},"FollowInterval":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.RestoreOptions/FollowInterval","kind":"field","type":"time.Duration","span":{"start":[3406,1],"end":[3406,30],"bytes":[109040,109069]}},"IntegrityCheck":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.RestoreOptions/IntegrityCheck","kind":"field","type":"github.com/benbjohnson/litestream.IntegrityCheckMode","span":{"start":[3410,1],"end":[3410,35],"bytes":[109227,109261]}},"OutputPath":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.RestoreOptions/OutputPath","kind":"field","type":"string","span":{"start":[3388,1],"end":[3388,19],"bytes":[108484,108502]}},"Parallelism":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.RestoreOptions/Parallelism","kind":"field","type":"int","span":{"start":[3399,1],"end":[3399,17],"bytes":[108789,108805]}},"TXID":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.RestoreOptions/TXID","kind":"field","type":"invalid type","span":{"start":[3392,1],"end":[3392,15],"bytes":[108574,108588]}},"Timestamp":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.RestoreOptions/Timestamp","kind":"field","type":"time.Time","span":{"start":[3396,1],"end":[3396,21],"bytes":[108691,108711]}}}},"SyncDiagnostic":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic","kind":"struct","span":{"start":[287,1],"end":[305,2],"bytes":[10852,11943]},"callables":{},"fields":{"Active":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Active","kind":"field","type":"bool","span":{"start":[289,1],"end":[289,48],"bytes":[10927,10974]}},"CheckpointMode":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/CheckpointMode","kind":"field","type":"string","span":{"start":[299,1],"end":[299,67],"bytes":[11538,11604]}},"ElapsedSeconds":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/ElapsedSeconds","kind":"field","type":"float64","span":{"start":[294,1],"end":[294,67],"bytes":[11217,11283]}},"Error":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Error","kind":"field","type":"string","span":{"start":[301,1],"end":[301,57],"bytes":[11663,11719]}},"ExecutorWaitSeconds":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/ExecutorWaitSeconds","kind":"field","type":"float64","span":{"start":[304,1],"end":[304,73],"bytes":[11869,11941]}},"ExecutorWaitStarted":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/ExecutorWaitStarted","kind":"field","type":"*time.Time","span":{"start":[303,1],"end":[303,76],"bytes":[11793,11868]}},"ExecutorWaiterCount":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/ExecutorWaiterCount","kind":"field","type":"int","span":{"start":[302,1],"end":[302,73],"bytes":[11720,11792]}},"LastSyncedWALOffset":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/LastSyncedWALOffset","kind":"field","type":"int64","span":{"start":[297,1],"end":[297,74],"bytes":[11400,11473]}},"Operation":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Operation","kind":"field","type":"string","span":{"start":[290,1],"end":[290,61],"bytes":[10975,11035]}},"Path":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Path","kind":"field","type":"string","span":{"start":[288,1],"end":[288,46],"bytes":[10881,10926]}},"Phase":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Phase","kind":"field","type":"string","span":{"start":[291,1],"end":[291,57],"bytes":[11036,11092]}},"Reason":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Reason","kind":"field","type":"string","span":{"start":[300,1],"end":[300,58],"bytes":[11605,11662]}},"Snapshotting":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/Snapshotting","kind":"field","type":"bool","span":{"start":[298,1],"end":[298,64],"bytes":[11474,11537]}},"StartedAt":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/StartedAt","kind":"field","type":"*time.Time","span":{"start":[292,1],"end":[292,62],"bytes":[11093,11154]}},"TXID":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/TXID","kind":"field","type":"uint64","span":{"start":[295,1],"end":[295,56],"bytes":[11284,11339]}},"UpdatedAt":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/UpdatedAt","kind":"field","type":"*time.Time","span":{"start":[293,1],"end":[293,62],"bytes":[11155,11216]}},"WALSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncDiagnostic/WALSize","kind":"field","type":"int64","span":{"start":[296,1],"end":[296,60],"bytes":[11340,11399]}}}},"SyncStatus":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncStatus","kind":"struct","span":{"start":[736,1],"end":[740,2],"bytes":[25295,25380]},"callables":{},"fields":{"InSync":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncStatus/InSync","kind":"field","type":"bool","span":{"start":[739,1],"end":[739,17],"bytes":[25362,25378]}},"LocalTXID":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncStatus/LocalTXID","kind":"field","type":"invalid type","span":{"start":[737,1],"end":[737,21],"bytes":[25320,25340]}},"RemoteTXID":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.SyncStatus/RemoteTXID","kind":"field","type":"invalid type","span":{"start":[738,1],"end":[738,21],"bytes":[25341,25361]}}}},"diagOp":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagOp","kind":"defined","span":{"start":[232,1],"end":[232,19],"bytes":[8494,8512]},"callables":{}},"diagPhase":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagPhase","kind":"defined","span":{"start":[239,1],"end":[239,22],"bytes":[8599,8620]},"callables":{}},"diagState":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState","kind":"struct","span":{"start":[268,1],"end":[284,2],"bytes":[10348,10784]},"base_types":["sync.RWMutex"],"callables":{},"fields":{"active":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/active","kind":"field","type":"bool","span":{"start":[270,1],"end":[270,26],"bytes":[10386,10411]}},"checkpointMode":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/checkpointMode","kind":"field","type":"string","span":{"start":[279,1],"end":[279,28],"bytes":[10643,10670]}},"err":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/err","kind":"field","type":"string","span":{"start":[281,1],"end":[281,28],"bytes":[10699,10726]}},"executorWaitStarted":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/executorWaitStarted","kind":"field","type":"time.Time","span":{"start":[283,1],"end":[283,31],"bytes":[10752,10782]}},"executorWaiterCount":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/executorWaiterCount","kind":"field","type":"int","span":{"start":[282,1],"end":[282,25],"bytes":[10727,10751]}},"lastSyncedWALOffset":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/lastSyncedWALOffset","kind":"field","type":"int64","span":{"start":[277,1],"end":[277,27],"bytes":[10590,10616]}},"operation":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/operation","kind":"field","type":"github.com/benbjohnson/litestream.diagOp","span":{"start":[271,1],"end":[271,28],"bytes":[10412,10439]}},"phase":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/phase","kind":"field","type":"github.com/benbjohnson/litestream.diagPhase","span":{"start":[272,1],"end":[272,31],"bytes":[10440,10470]}},"reason":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/reason","kind":"field","type":"string","span":{"start":[280,1],"end":[280,28],"bytes":[10671,10698]}},"snapshotting":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/snapshotting","kind":"field","type":"bool","span":{"start":[278,1],"end":[278,26],"bytes":[10617,10642]}},"startedAt":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/startedAt","kind":"field","type":"time.Time","span":{"start":[273,1],"end":[273,31],"bytes":[10471,10501]}},"sync.RWMutex":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/sync.RWMutex","kind":"field","type":"sync.RWMutex","span":{"start":[269,1],"end":[269,14],"bytes":[10372,10385]}},"txID":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/txID","kind":"field","type":"invalid type","span":{"start":[275,1],"end":[275,30],"bytes":[10533,10562]}},"updatedAt":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/updatedAt","kind":"field","type":"time.Time","span":{"start":[274,1],"end":[274,31],"bytes":[10502,10532]}},"walSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.diagState/walSize","kind":"field","type":"int64","span":{"start":[276,1],"end":[276,27],"bytes":[10563,10589]}}}},"ltxStagingFile":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile","kind":"interface","span":{"start":[1611,1],"end":[1615,2],"bytes":[52405,52478]},"base_types":["io.Writer"],"callables":{"github.com/benbjohnson/litestream.ltxStagingFile.Close":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Close","kind":"method","span":{"start":[1614,1],"end":[1614,15],"bytes":[52462,52476]},"signature":"github.com/benbjohnson/litestream.ltxStagingFile.Close","parameters":[],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ltxStagingFile.Sync":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Sync","kind":"method","span":{"start":[1613,1],"end":[1613,14],"bytes":[52448,52461]},"signature":"github.com/benbjohnson/litestream.ltxStagingFile.Sync","parameters":[],"return_type":"error","error_channel":["error"],"body":{}}}},"snapshotReadCloser":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadCloser","kind":"struct","span":{"start":[2768,1],"end":[2771,2],"bytes":[88955,89032]},"base_types":["*io.PipeReader"],"callables":{"github.com/benbjohnson/litestream.snapshotReadCloser.Close":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/github.com/benbjohnson/litestream.snapshotReadCloser.Close","kind":"method","span":{"start":[2773,1],"end":[2776,2],"bytes":[89034,89130]},"signature":"github.com/benbjohnson/litestream.snapshotReadCloser.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"2774:8":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/github.com/benbjohnson/litestream.snapshotReadCloser.Close@2774:8","span":{"start":[2774,8],"end":[2774,21],"bytes":[89086,89099]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","is_deferred":true},"2775:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/github.com/benbjohnson/litestream.snapshotReadCloser.Close@2775:9","span":{"start":[2775,9],"end":[2775,29],"bytes":[89108,89128]},"callee":"can://litestream/litestream/@external/io/PipeReader.Close"}}}},"fields":{"*io.PipeReader":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/*io.PipeReader","kind":"field","type":"*io.PipeReader","span":{"start":[2769,1],"end":[2769,16],"bytes":[88988,89003]}},"pos":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/pos","kind":"field","type":"*github.com/benbjohnson/litestream.snapshotReadPosition","span":{"start":[2770,1],"end":[2770,27],"bytes":[89004,89030]}}}},"snapshotReadPosition":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition","kind":"struct","span":{"start":[2756,1],"end":[2762,2],"bytes":[88722,88860]},"callables":{"github.com/benbjohnson/litestream.snapshotReadPosition.close":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","kind":"method","span":{"start":[2764,1],"end":[2766,2],"bytes":[88862,88953]},"signature":"github.com/benbjohnson/litestream.snapshotReadPosition.close","parameters":[],"metrics":{"cyclomatic":1},"body":{"2765:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close@2765:2","span":{"start":[2765,2],"end":[2765,49],"bytes":[88904,88951]},"callee":"can://litestream/litestream/@external/sync/Once.Do"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close/github.com/benbjohnson/litestream.snapshotReadPosition.close.closure_1","kind":"function","span":{"start":[2765,1],"end":[2765,49],"bytes":[88903,88951]},"signature":"github.com/benbjohnson/litestream.snapshotReadPosition.close.closure_1","parameters":[],"body":{"2765:26":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close/github.com/benbjohnson/litestream.snapshotReadPosition.close.closure_1@2765:26","span":{"start":[2765,26],"end":[2765,46],"bytes":[88928,88948]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock"}}}}}},"fields":{"closeOnce":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/closeOnce","kind":"field","type":"sync.Once","span":{"start":[2761,1],"end":[2761,24],"bytes":[88835,88858]}},"db":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/db","kind":"field","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[2760,1],"end":[2760,18],"bytes":[88817,88834]}},"pageSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/pageSize","kind":"field","type":"int","span":{"start":[2758,1],"end":[2758,18],"bytes":[88779,88796]}},"pos":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/pos","kind":"field","type":"invalid type","span":{"start":[2757,1],"end":[2757,22],"bytes":[88757,88778]}},"walEndOffset":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/walEndOffset","kind":"field","type":"int64","span":{"start":[2759,1],"end":[2759,20],"bytes":[88797,88816]}}}},"syncExecutor":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor","kind":"struct","span":{"start":[223,1],"end":[230,2],"bytes":[8291,8492]},"callables":{"github.com/benbjohnson/litestream.syncExecutor.applySyncResult":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult","kind":"method","span":{"start":[2056,1],"end":[2068,2],"bytes":[66198,66575]},"signature":"github.com/benbjohnson/litestream.syncExecutor.applySyncResult","parameters":[{"name":"result","type":"github.com/benbjohnson/litestream.syncResult","span":{"start":[2056,1],"end":[2056,63],"bytes":[66198,66260]}}],"metrics":{"cyclomatic":3},"body":{}}},"fields":{"checkpointAttempted":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/checkpointAttempted","kind":"field","type":"bool","span":{"start":[229,1],"end":[229,26],"bytes":[8465,8490]}},"l0FileInfo":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/l0FileInfo","kind":"field","type":"invalid type","span":{"start":[227,1],"end":[227,35],"bytes":[8404,8438]}},"pos":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/pos","kind":"field","type":"invalid type","span":{"start":[225,1],"end":[225,29],"bytes":[8349,8377]}},"posChanged":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/posChanged","kind":"field","type":"bool","span":{"start":[226,1],"end":[226,26],"bytes":[8378,8403]}},"state":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/state","kind":"field","type":"github.com/benbjohnson/litestream.syncState","span":{"start":[224,1],"end":[224,31],"bytes":[8318,8348]}},"synced":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/synced","kind":"field","type":"bool","span":{"start":[228,1],"end":[228,26],"bytes":[8439,8464]}}}},"syncInfo":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncInfo","kind":"struct","span":{"start":[1969,1],"end":[1977,2],"bytes":[64228,64540]},"callables":{},"fields":{"clearSyncedToWALEnd":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncInfo/clearSyncedToWALEnd","kind":"field","type":"bool","span":{"start":[1976,1],"end":[1976,26],"bytes":[64513,64538]}},"offset":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncInfo/offset","kind":"field","type":"int64","span":{"start":[1970,1],"end":[1970,59],"bytes":[64251,64309]}},"prevCommit":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncInfo/prevCommit","kind":"field","type":"uint32","span":{"start":[1973,1],"end":[1973,28],"bytes":[64366,64393]}},"reason":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncInfo/reason","kind":"field","type":"string","span":{"start":[1975,1],"end":[1975,51],"bytes":[64462,64512]}},"salt1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncInfo/salt1","kind":"field","type":"uint32","span":{"start":[1971,1],"end":[1971,28],"bytes":[64310,64337]}},"salt2":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncInfo/salt2","kind":"field","type":"uint32","span":{"start":[1972,1],"end":[1972,28],"bytes":[64338,64365]}},"snapshotting":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncInfo/snapshotting","kind":"field","type":"bool","span":{"start":[1974,1],"end":[1974,68],"bytes":[64394,64461]}}}},"syncResult":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncResult","kind":"struct","span":{"start":[1979,1],"end":[1987,2],"bytes":[64542,64730]},"callables":{},"fields":{"l0FileInfo":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncResult/l0FileInfo","kind":"field","type":"invalid type","span":{"start":[1986,1],"end":[1986,30],"bytes":[64699,64728]}},"limited":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncResult/limited","kind":"field","type":"bool","span":{"start":[1983,1],"end":[1983,21],"bytes":[64632,64652]}},"newWALSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncResult/newWALSize","kind":"field","type":"int64","span":{"start":[1981,1],"end":[1981,22],"bytes":[64589,64610]}},"origWALSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncResult/origWALSize","kind":"field","type":"int64","span":{"start":[1980,1],"end":[1980,22],"bytes":[64567,64588]}},"pos":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncResult/pos","kind":"field","type":"invalid type","span":{"start":[1985,1],"end":[1985,25],"bytes":[64674,64698]}},"synced":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncResult/synced","kind":"field","type":"bool","span":{"start":[1982,1],"end":[1982,21],"bytes":[64611,64631]}},"syncedToWALEnd":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncResult/syncedToWALEnd","kind":"field","type":"bool","span":{"start":[1984,1],"end":[1984,21],"bytes":[64653,64673]}}}},"syncState":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncState","kind":"struct","span":{"start":[197,1],"end":[221,2],"bytes":[7068,8289]},"callables":{},"fields":{"lastSyncedWALOffset":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncState/lastSyncedWALOffset","kind":"field","type":"int64","span":{"start":[220,1],"end":[220,27],"bytes":[8261,8287]}},"syncedSinceCheckpoint":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncState/syncedSinceCheckpoint","kind":"field","type":"bool","span":{"start":[204,1],"end":[204,28],"bytes":[7392,7419]}},"syncedToWALEnd":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncState/syncedToWALEnd","kind":"field","type":"bool","span":{"start":[212,1],"end":[212,21],"bytes":[7813,7833]}},"truncatePassiveFailed":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncState/truncatePassiveFailed","kind":"field","type":"bool","span":{"start":[198,1],"end":[198,28],"bytes":[7092,7119]}}}}},"functions":{"github.com/benbjohnson/litestream.NewDB":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","kind":"function","span":{"start":[308,1],"end":[352,2],"bytes":[12001,13590]},"signature":"github.com/benbjohnson/litestream.NewDB","parameters":[{"name":"path","type":"string","span":{"start":[308,1],"end":[308,30],"bytes":[12001,12030]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":1},"body":{"309:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@309:15","span":{"start":[309,15],"end":[309,35],"bytes":[12045,12065]},"callee":"can://litestream/litestream/@external/path/filepath/Split"},"313:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@313:13","span":{"start":[313,13],"end":[313,55],"bytes":[12109,12151]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"314:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@314:13","span":{"start":[314,13],"end":[314,37],"bytes":[12165,12189]},"callee":null},"315:13":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@315:13","span":{"start":[315,13],"end":[315,32],"bytes":[12203,12222]},"callee":null},"327:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@327:25","span":{"start":[327,25],"end":[327,65],"bytes":[12716,12756]},"callee":"can://litestream/litestream/@external/log/slog/With"},"327:45":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@327:45","span":{"start":[327,45],"end":[327,64],"bytes":[12736,12755]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"329:25":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@329:25","span":{"start":[329,25],"end":[329,52],"bytes":[12785,12812]},"callee":null},"332:22":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@332:22","span":{"start":[332,22],"end":[332,62],"bytes":[12872,12912]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"332:41":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@332:41","span":{"start":[332,41],"end":[332,61],"bytes":[12891,12911]},"callee":"can://litestream/litestream/@external/context/Background"},"335:17":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@335:17","span":{"start":[335,17],"end":[335,90],"bytes":[13013,13086]},"callee":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.NewCompactor"},"335:35":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@335:35","span":{"start":[335,35],"end":[335,89],"bytes":[13031,13085]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"338:2":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB@338:2","span":{"start":[338,2],"end":[338,18],"bytes":[13195,13211]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_1","kind":"function","span":{"start":[339,1],"end":[344,3],"bytes":[13212,13406]},"signature":"github.com/benbjohnson/litestream.NewDB.closure_1","parameters":[{"name":"level","type":"int","span":{"start":[339,1],"end":[339,68],"bytes":[13212,13279]}}],"return_type":"(invalid type, bool)","body":{"340:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_1@340:3","span":{"start":[340,3],"end":[340,28],"bytes":[13282,13307]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"341:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_1@341:9","span":{"start":[341,9],"end":[341,36],"bytes":[13316,13343]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"closure_2":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_2","kind":"function","span":{"start":[345,1],"end":[349,3],"bytes":[13407,13576]},"signature":"github.com/benbjohnson/litestream.NewDB.closure_2","parameters":[{"name":"level","type":"int","span":{"start":[345,1],"end":[345,66],"bytes":[13407,13472]}},{"name":"info","type":"invalid type","span":{"start":[345,1],"end":[345,66],"bytes":[13407,13472]}}],"body":{"346:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_2@346:3","span":{"start":[346,3],"end":[346,28],"bytes":[13475,13500]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"347:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_2@347:9","span":{"start":[347,9],"end":[347,36],"bytes":[13509,13536]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}}}},"github.com/benbjohnson/litestream.NewRestoreOptions":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewRestoreOptions","kind":"function","span":{"start":[3414,1],"end":[3419,2],"bytes":[109342,109498]},"signature":"github.com/benbjohnson/litestream.NewRestoreOptions","parameters":[],"return_type":"github.com/benbjohnson/litestream.RestoreOptions","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.addDurationToCounter":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.addDurationToCounter","kind":"function","span":{"start":[1325,1],"end":[1329,2],"bytes":[42224,42340]},"signature":"github.com/benbjohnson/litestream.addDurationToCounter","parameters":[{"name":"counter","type":"invalid type","span":{"start":[1325,1],"end":[1325,73],"bytes":[42224,42296]}},{"name":"d","type":"time.Duration","span":{"start":[1325,1],"end":[1325,73],"bytes":[42224,42296]}}],"metrics":{"cyclomatic":2},"body":{"1327:15":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.addDurationToCounter@1327:15","span":{"start":[1327,15],"end":[1327,26],"bytes":[42323,42334]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"1327:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.addDurationToCounter@1327:3","span":{"start":[1327,3],"end":[1327,27],"bytes":[42311,42335]},"callee":null}}},"github.com/benbjohnson/litestream.calcWALSize":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize","kind":"function","span":{"start":[1634,1],"end":[1636,2],"bytes":[53023,53163]},"signature":"github.com/benbjohnson/litestream.calcWALSize","parameters":[{"name":"pageSize","type":"uint32","span":{"start":[1634,1],"end":[1634,56],"bytes":[53023,53078]}},{"name":"pageN","type":"uint32","span":{"start":[1634,1],"end":[1634,56],"bytes":[53023,53078]}}],"return_type":"int64","metrics":{"cyclomatic":1},"body":{"1635:33":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize@1635:33","span":{"start":[1635,33],"end":[1635,67],"bytes":[53111,53145]},"callee":null},"1635:70":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize@1635:70","span":{"start":[1635,70],"end":[1635,82],"bytes":[53148,53160]},"callee":null},"1635:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize@1635:9","span":{"start":[1635,9],"end":[1635,29],"bytes":[53087,53107]},"callee":null}}},"github.com/benbjohnson/litestream.defaultOpenLTXFile":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.defaultOpenLTXFile","kind":"function","span":{"start":[1617,1],"end":[1619,2],"bytes":[52480,52610]},"signature":"github.com/benbjohnson/litestream.defaultOpenLTXFile","parameters":[{"name":"name","type":"string","span":{"start":[1617,1],"end":[1617,91],"bytes":[52480,52570]}},{"name":"flag","type":"int","span":{"start":[1617,1],"end":[1617,91],"bytes":[52480,52570]}},{"name":"perm","type":"os.FileMode","span":{"start":[1617,1],"end":[1617,91],"bytes":[52480,52570]}}],"return_type":"(github.com/benbjohnson/litestream.ltxStagingFile, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"1618:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.defaultOpenLTXFile@1618:9","span":{"start":[1618,9],"end":[1618,38],"bytes":[52579,52608]},"callee":"can://litestream/litestream/@external/os/OpenFile"}}},"github.com/benbjohnson/litestream.isDiskFullError":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError","kind":"function","span":{"start":[1595,1],"end":[1609,2],"bytes":[51890,52403]},"signature":"github.com/benbjohnson/litestream.isDiskFullError","parameters":[{"name":"err","type":"error","span":{"start":[1595,1],"end":[1595,39],"bytes":[51890,51928]}}],"return_type":"bool","metrics":{"cyclomatic":3},"body":{"1599:36":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1599:36","span":{"start":[1599,36],"end":[1599,66],"bytes":[51999,52029]},"callee":"can://litestream/litestream/@external/errors/Is"},"1599:5":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1599:5","span":{"start":[1599,5],"end":[1599,32],"bytes":[51968,51995]},"callee":"can://litestream/litestream/@external/errors/Is"},"1602:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1602:12","span":{"start":[1602,12],"end":[1602,40],"bytes":[52060,52088]},"callee":"can://litestream/litestream/@external/strings/ToLower"},"1602:28":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1602:28","span":{"start":[1602,28],"end":[1602,39],"bytes":[52076,52087]},"callee":null},"1603:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1603:9","span":{"start":[1603,9],"end":[1603,60],"bytes":[52097,52148]},"callee":"can://litestream/litestream/@external/strings/Contains"},"1604:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1604:3","span":{"start":[1604,3],"end":[1604,50],"bytes":[52154,52201]},"callee":"can://litestream/litestream/@external/strings/Contains"},"1605:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1605:3","span":{"start":[1605,3],"end":[1605,59],"bytes":[52207,52263]},"callee":"can://litestream/litestream/@external/strings/Contains"},"1606:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1606:3","span":{"start":[1606,3],"end":[1606,55],"bytes":[52269,52321]},"callee":"can://litestream/litestream/@external/strings/Contains"},"1607:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1607:3","span":{"start":[1607,3],"end":[1607,37],"bytes":[52327,52361]},"callee":"can://litestream/litestream/@external/strings/Contains"},"1608:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError@1608:3","span":{"start":[1608,3],"end":[1608,37],"bytes":[52367,52401]},"callee":"can://litestream/litestream/@external/strings/Contains"}}},"github.com/benbjohnson/litestream.isSQLiteBusyError":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError","kind":"function","span":{"start":[1583,1],"end":[1591,2],"bytes":[51457,51726]},"signature":"github.com/benbjohnson/litestream.isSQLiteBusyError","parameters":[{"name":"err","type":"error","span":{"start":[1583,1],"end":[1583,41],"bytes":[51457,51497]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"1588:12":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError@1588:12","span":{"start":[1588,12],"end":[1588,23],"bytes":[51613,51624]},"callee":null},"1589:9":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError@1589:9","span":{"start":[1589,9],"end":[1589,55],"bytes":[51633,51679]},"callee":"can://litestream/litestream/@external/strings/Contains"},"1590:3":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError@1590:3","span":{"start":[1590,3],"end":[1590,42],"bytes":[51685,51724]},"callee":"can://litestream/litestream/@external/strings/Contains"}}},"github.com/benbjohnson/litestream.snapshotHeaderWALRange":{"id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotHeaderWALRange","kind":"function","span":{"start":[2973,1],"end":[2979,2],"bytes":[95070,95315]},"signature":"github.com/benbjohnson/litestream.snapshotHeaderWALRange","parameters":[{"name":"maxOffset","type":"int64","span":{"start":[2973,1],"end":[2973,79],"bytes":[95070,95148]}},{"name":"frameSize","type":"int64","span":{"start":[2973,1],"end":[2973,79],"bytes":[95070,95148]}}],"return_type":"(int64, int64)","metrics":{"cyclomatic":2},"body":{"2977:11":{"kind":"call","id":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotHeaderWALRange@2977:11","span":{"start":[2977,11],"end":[2977,50],"bytes":[95239,95278]},"callee":null}}}},"content_hash":"95d34cde5d76f1f6f683c38ec01b4dcf5e5167059935a0816889d1c72c7944fd"},"file/replica_client.go":{"id":"can://litestream/litestream/go/file/replica_client.go","kind":"module","span":{"start":[1,1],"end":[379,1],"bytes":[0,10820]},"package":"file","source":"package file\n\nimport (\n\t\"bytes\"\n\t\"cmp\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"time\"\n\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"file\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"file\"\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\nvar _ litestream.ReplicaClientV3 = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to disk.\ntype ReplicaClient struct {\n\tpath string // destination path\n\n\tReplica *litestream.Replica\n\tlogger *slog.Logger\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient(path string) *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tpath: path,\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\t// For file URLs, the path is the full path\n\tif urlPath == \"\" {\n\t\treturn nil, fmt.Errorf(\"file replica path required\")\n\t}\n\treturn NewReplicaClient(urlPath), nil\n}\n\n// db returns the database, if available.\nfunc (c *ReplicaClient) db() *litestream.DB {\n\tif c.Replica == nil {\n\t\treturn nil\n\t}\n\treturn c.Replica.DB()\n}\n\n// Type returns \"file\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init is a no-op for file replica client as no initialization is required.\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\treturn nil\n}\n\n// Path returns the destination path to replicate the database to.\nfunc (c *ReplicaClient) Path() string {\n\treturn c.path\n}\n\n// LTXLevelDir returns the path to a given level.\nfunc (c *ReplicaClient) LTXLevelDir(level int) string {\n\treturn filepath.FromSlash(litestream.LTXLevelDir(c.path, level))\n}\n\n// LTXFilePath returns the path to an LTX file.\nfunc (c *ReplicaClient) LTXFilePath(level int, minTXID, maxTXID ltx.TXID) string {\n\treturn filepath.FromSlash(litestream.LTXFilePath(c.path, level, minTXID, maxTXID))\n}\n\n// LTXFiles returns an iterator over all LTX files on the replica for the given level.\n// The useMetadata parameter is ignored for file backend as ModTime is always available from readdir.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tf, err := os.Open(c.LTXLevelDir(level))\n\tif os.IsNotExist(err) {\n\t\treturn ltx.NewFileInfoSliceIterator(nil), nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\tdefer f.Close()\n\n\tfis, err := f.Readdir(-1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Iterate over every file and convert to metadata.\n\t// ModTime contains the accurate timestamp set by Chtimes in WriteLTXFile.\n\tinfos := make([]*ltx.FileInfo, 0, len(fis))\n\tfor _, fi := range fis {\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(fi.Name())\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t} else if minTXID \u003c seek {\n\t\t\tcontinue\n\t\t}\n\n\t\tinfos = append(infos, \u0026ltx.FileInfo{\n\t\t\tLevel: level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: fi.Size(),\n\t\t\tCreatedAt: fi.ModTime().UTC(),\n\t\t})\n\t}\n\n\treturn ltx.NewFileInfoSliceIterator(infos), nil\n}\n\n// OpenLTXFile returns a reader for an LTX file at the given position.\n// Returns os.ErrNotExist if no matching index/offset is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tpath := c.LTXFilePath(level, minTXID, maxTXID)\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, litestream.NewLTXError(\"open\", path, level, uint64(minTXID), uint64(maxTXID), err)\n\t}\n\n\tif offset \u003e 0 {\n\t\tif _, err := f.Seek(offset, io.SeekStart); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif size \u003e 0 {\n\t\treturn internal.LimitReadCloser(f, size), nil\n\t}\n\n\treturn f, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\n// Extracts timestamp from LTX header and sets it as the file's ModTime to preserve original creation time.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tvar fileInfo, dirInfo os.FileInfo\n\tif db := c.db(); db != nil {\n\t\tfileInfo, dirInfo = db.FileInfo(), db.DirInfo()\n\t}\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\tfullReader := io.MultiReader(\u0026buf, rd)\n\n\t// Ensure parent directory exists.\n\tfilename := c.LTXFilePath(level, minTXID, maxTXID)\n\tif err := internal.MkdirAll(filepath.Dir(filename), dirInfo); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Write LTX file to temporary file next to destination path.\n\ttmpFilename := filename + \".tmp\"\n\tf, err := internal.CreateFile(tmpFilename, fileInfo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Clean up temp file on error. On successful rename, the temp file\n\t// becomes the final file and should not be removed.\n\tdefer func() {\n\t\t_ = f.Close()\n\t\tif err != nil {\n\t\t\t_ = os.Remove(tmpFilename)\n\t\t}\n\t}()\n\n\tif _, err := io.Copy(f, fullReader); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := f.Sync(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Build metadata.\n\tfi, err := f.Stat()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tinfo = \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: fi.Size(),\n\t\tCreatedAt: timestamp,\n\t}\n\n\tif err := f.Close(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Move LTX file to final path when it has been written \u0026 synced to disk.\n\tif err := os.Rename(tmpFilename, filename); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := internal.FsyncDir(filepath.Dir(filename)); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Set file ModTime to preserve original timestamp\n\tif err := os.Chtimes(filename, timestamp, timestamp); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn info, nil\n}\n\n// DeleteLTXFiles deletes LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tfor _, info := range a {\n\t\tfilename := c.LTXFilePath(info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", filename)\n\n\t\tif err := os.Remove(filename); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// DeleteAll deletes all LTX files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := os.RemoveAll(c.path); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// GenerationsV3 returns a list of v0.3.x generation IDs in the replica.\nfunc (c *ReplicaClient) GenerationsV3(ctx context.Context) ([]string, error) {\n\tgenPath := filepath.Join(c.path, litestream.GenerationsDirV3)\n\tentries, err := os.ReadDir(genPath)\n\tif os.IsNotExist(err) {\n\t\treturn nil, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar generations []string\n\tfor _, entry := range entries {\n\t\tif entry.IsDir() \u0026\u0026 litestream.IsGenerationIDV3(entry.Name()) {\n\t\t\tgenerations = append(generations, entry.Name())\n\t\t}\n\t}\n\tslices.Sort(generations)\n\treturn generations, nil\n}\n\n// SnapshotsV3 returns snapshots for a generation, sorted by index.\nfunc (c *ReplicaClient) SnapshotsV3(ctx context.Context, generation string) ([]litestream.SnapshotInfoV3, error) {\n\tsnapshotsPath := filepath.Join(c.path, litestream.GenerationsDirV3, generation, litestream.SnapshotsDirV3)\n\tentries, err := os.ReadDir(snapshotsPath)\n\tif os.IsNotExist(err) {\n\t\treturn nil, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar snapshots []litestream.SnapshotInfoV3\n\tfor _, entry := range entries {\n\t\tif entry.IsDir() {\n\t\t\tcontinue\n\t\t}\n\t\tindex, err := litestream.ParseSnapshotFilenameV3(entry.Name())\n\t\tif err != nil {\n\t\t\tcontinue // skip invalid filenames\n\t\t}\n\t\tinfo, err := entry.Info()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tsnapshots = append(snapshots, litestream.SnapshotInfoV3{\n\t\t\tGeneration: generation,\n\t\t\tIndex: index,\n\t\t\tSize: info.Size(),\n\t\t\tCreatedAt: info.ModTime(),\n\t\t})\n\t}\n\tslices.SortFunc(snapshots, func(a, b litestream.SnapshotInfoV3) int {\n\t\treturn a.Index - b.Index\n\t})\n\treturn snapshots, nil\n}\n\n// WALSegmentsV3 returns WAL segments for a generation, sorted by index then offset.\nfunc (c *ReplicaClient) WALSegmentsV3(ctx context.Context, generation string) ([]litestream.WALSegmentInfoV3, error) {\n\twalPath := filepath.Join(c.path, litestream.GenerationsDirV3, generation, litestream.WALDirV3)\n\tentries, err := os.ReadDir(walPath)\n\tif os.IsNotExist(err) {\n\t\treturn nil, nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar segments []litestream.WALSegmentInfoV3\n\tfor _, entry := range entries {\n\t\tif entry.IsDir() {\n\t\t\tcontinue\n\t\t}\n\t\tindex, offset, err := litestream.ParseWALSegmentFilenameV3(entry.Name())\n\t\tif err != nil {\n\t\t\tcontinue // skip invalid filenames\n\t\t}\n\t\tinfo, err := entry.Info()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tsegments = append(segments, litestream.WALSegmentInfoV3{\n\t\t\tGeneration: generation,\n\t\t\tIndex: index,\n\t\t\tOffset: offset,\n\t\t\tSize: info.Size(),\n\t\t\tCreatedAt: info.ModTime(),\n\t\t})\n\t}\n\tslices.SortFunc(segments, func(a, b litestream.WALSegmentInfoV3) int {\n\t\tif a.Index != b.Index {\n\t\t\treturn a.Index - b.Index\n\t\t}\n\t\treturn cmp.Compare(a.Offset, b.Offset)\n\t})\n\treturn segments, nil\n}\n\n// OpenSnapshotV3 opens a v0.3.x snapshot file for reading.\n// The returned reader provides LZ4-decompressed data.\nfunc (c *ReplicaClient) OpenSnapshotV3(ctx context.Context, generation string, index int) (io.ReadCloser, error) {\n\tpath := filepath.Join(c.path, litestream.GenerationsDirV3, generation, litestream.SnapshotsDirV3, litestream.FormatSnapshotFilenameV3(index))\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn internal.NewLZ4Reader(f), nil\n}\n\n// OpenWALSegmentV3 opens a v0.3.x WAL segment file for reading.\n// The returned reader provides LZ4-decompressed data.\nfunc (c *ReplicaClient) OpenWALSegmentV3(ctx context.Context, generation string, index int, offset int64) (io.ReadCloser, error) {\n\tpath := filepath.Join(c.path, litestream.GenerationsDirV3, generation, litestream.WALDirV3, litestream.FormatWALSegmentFilenameV3(index, offset))\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn internal.NewLZ4Reader(f), nil\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"cmp","path":"cmp","span":{"start":[5,1],"end":[5,7],"bytes":[32,38]}},{"name":"context","path":"context","span":{"start":[6,1],"end":[6,11],"bytes":[39,49]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[50,56]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[57,62]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[63,74]}},{"name":"url","path":"net/url","span":{"start":[10,1],"end":[10,11],"bytes":[75,85]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[86,91]}},{"name":"filepath","path":"path/filepath","span":{"start":[12,1],"end":[12,17],"bytes":[92,108]}},{"name":"slices","path":"slices","span":{"start":[13,1],"end":[13,10],"bytes":[109,118]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[119,126]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[16,1],"end":[16,27],"bytes":[128,154]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[18,1],"end":[18,37],"bytes":[156,192]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[19,1],"end":[19,46],"bytes":[193,238]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient","kind":"struct","span":{"start":[33,1],"end":[38,2],"bytes":[598,712]},"callables":{"github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll","kind":"method","span":{"start":[255,1],"end":[260,2],"bytes":[6926,7087]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[255,1],"end":[255,63],"bytes":[6926,6988]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"256:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll@256:12","span":{"start":[256,12],"end":[256,32],"bytes":[7000,7020]},"callee":"can://litestream/litestream/@external/os/RemoveAll"},"256:49":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll@256:49","span":{"start":[256,49],"end":[256,67],"bytes":[7037,7055]},"callee":"can://litestream/litestream/@external/os/IsNotExist"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[241,1],"end":[252,2],"bytes":[6475,6888]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[241,1],"end":[241,87],"bytes":[6475,6561]}},{"name":"a","type":"[]invalid type","span":{"start":[241,1],"end":[241,87],"bytes":[6475,6561]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"243:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles@243:15","span":{"start":[243,15],"end":[243,68],"bytes":[6602,6655]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath"},"245:3":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles@245:3","span":{"start":[245,3],"end":[245,127],"bytes":[6659,6783]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"247:13":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles@247:13","span":{"start":[247,13],"end":[247,32],"bytes":[6797,6816]},"callee":"can://litestream/litestream/@external/os/Remove"},"247:49":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles@247:49","span":{"start":[247,49],"end":[247,67],"bytes":[6833,6851]},"callee":"can://litestream/litestream/@external/os/IsNotExist"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","kind":"method","span":{"start":[263,1],"end":[280,2],"bytes":[7162,7665]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[263,1],"end":[263,79],"bytes":[7162,7240]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"264:13":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@264:13","span":{"start":[264,13],"end":[264,63],"bytes":[7253,7303]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"265:18":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@265:18","span":{"start":[265,18],"end":[265,37],"bytes":[7321,7340]},"callee":"can://litestream/litestream/@external/os/ReadDir"},"266:5":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@266:5","span":{"start":[266,5],"end":[266,23],"bytes":[7345,7363]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"274:23":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@274:23","span":{"start":[274,23],"end":[274,64],"bytes":[7511,7552]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3"},"274:51":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@274:51","span":{"start":[274,51],"end":[274,63],"bytes":[7539,7551]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.Name"},"274:6":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@274:6","span":{"start":[274,6],"end":[274,19],"bytes":[7494,7507]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir"},"275:18":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@275:18","span":{"start":[275,18],"end":[275,51],"bytes":[7572,7605]},"callee":null},"275:38":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@275:38","span":{"start":[275,38],"end":[275,50],"bytes":[7592,7604]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.Name"},"278:2":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3@278:2","span":{"start":[278,2],"end":[278,26],"bytes":[7614,7638]},"callee":"can://litestream/litestream/@external/slices/Sort"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.Init":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Init","kind":"method","span":{"start":[76,1],"end":[78,2],"bytes":[1816,1887]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[76,1],"end":[76,58],"bytes":[1816,1873]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","kind":"method","span":{"start":[91,1],"end":[93,2],"bytes":[2237,2405]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","parameters":[{"name":"level","type":"int","span":{"start":[91,1],"end":[91,83],"bytes":[2237,2319]}},{"name":"minTXID","type":"invalid type","span":{"start":[91,1],"end":[91,83],"bytes":[2237,2319]}},{"name":"maxTXID","type":"invalid type","span":{"start":[91,1],"end":[91,83],"bytes":[2237,2319]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"92:28":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath@92:28","span":{"start":[92,28],"end":[92,83],"bytes":[2347,2402]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"92:9":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath@92:9","span":{"start":[92,9],"end":[92,84],"bytes":[2328,2403]},"callee":"can://litestream/litestream/@external/path/filepath/FromSlash"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","kind":"method","span":{"start":[97,1],"end":[132,2],"bytes":[2596,3521]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[97,1],"end":[97,126],"bytes":[2596,2721]}},{"name":"level","type":"int","span":{"start":[97,1],"end":[97,126],"bytes":[2596,2721]}},{"name":"seek","type":"invalid type","span":{"start":[97,1],"end":[97,126],"bytes":[2596,2721]}},{"name":"useMetadata","type":"bool","span":{"start":[97,1],"end":[97,126],"bytes":[2596,2721]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"100:10":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@100:10","span":{"start":[100,10],"end":[100,43],"bytes":[2797,2830]},"callee":null},"104:8":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@104:8","span":{"start":[104,8],"end":[104,17],"bytes":[2888,2897]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"106:14":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@106:14","span":{"start":[106,14],"end":[106,27],"bytes":[2912,2925]},"callee":"can://litestream/litestream/@external/os/File.Readdir"},"113:11":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@113:11","span":{"start":[113,11],"end":[113,45],"bytes":[3104,3138]},"callee":null},"113:36":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@113:36","span":{"start":[113,36],"end":[113,44],"bytes":[3129,3137]},"callee":null},"115:28":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@115:28","span":{"start":[115,28],"end":[115,56],"bytes":[3192,3220]},"callee":null},"115:46":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@115:46","span":{"start":[115,46],"end":[115,55],"bytes":[3210,3219]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Name"},"122:11":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@122:11","span":{"start":[122,11],"end":[128,5],"bytes":[3307,3466]},"callee":null},"126:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@126:15","span":{"start":[126,15],"end":[126,24],"bytes":[3417,3426]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"127:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@127:15","span":{"start":[127,15],"end":[127,33],"bytes":[3442,3460]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"127:15/2":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@127:15/2","span":{"start":[127,15],"end":[127,27],"bytes":[3442,3454]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime"},"131:9":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@131:9","span":{"start":[131,9],"end":[131,44],"bytes":[3479,3514]},"callee":null},"98:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@98:12","span":{"start":[98,12],"end":[98,41],"bytes":[2733,2762]},"callee":"can://litestream/litestream/@external/os/Open"},"98:20":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@98:20","span":{"start":[98,20],"end":[98,40],"bytes":[2741,2761]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir"},"99:5":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles@99:5","span":{"start":[99,5],"end":[99,23],"bytes":[2767,2785]},"callee":"can://litestream/litestream/@external/os/IsNotExist"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","kind":"method","span":{"start":[86,1],"end":[88,2],"bytes":[2064,2187]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","parameters":[{"name":"level","type":"int","span":{"start":[86,1],"end":[86,56],"bytes":[2064,2119]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"87:28":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir@87:28","span":{"start":[87,28],"end":[87,65],"bytes":[2147,2184]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"87:9":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir@87:9","span":{"start":[87,9],"end":[87,66],"bytes":[2128,2185]},"callee":"can://litestream/litestream/@external/path/filepath/FromSlash"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[136,1],"end":[154,2],"bytes":[3658,4174]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"level","type":"int","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"minTXID","type":"invalid type","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"maxTXID","type":"invalid type","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"offset","type":"int64","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}},{"name":"size","type":"int64","span":{"start":[136,1],"end":[136,140],"bytes":[3658,3797]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"137:10":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile@137:10","span":{"start":[137,10],"end":[137,48],"bytes":[3807,3845]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath"},"138:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile@138:12","span":{"start":[138,12],"end":[138,25],"bytes":[3857,3870]},"callee":"can://litestream/litestream/@external/os/Open"},"140:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile@140:15","span":{"start":[140,15],"end":[140,97],"bytes":[3902,3984]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"140:59":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile@140:59","span":{"start":[140,59],"end":[140,74],"bytes":[3946,3961]},"callee":null},"140:76":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile@140:76","span":{"start":[140,76],"end":[140,91],"bytes":[3963,3978]},"callee":null},"144:16":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile@144:16","span":{"start":[144,16],"end":[144,44],"bytes":[4021,4049]},"callee":"can://litestream/litestream/@external/os/File.Seek"},"150:10":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile@150:10","span":{"start":[150,10],"end":[150,43],"bytes":[4115,4148]},"callee":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","kind":"method","span":{"start":[360,1],"end":[367,2],"bytes":[9957,10317]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[360,1],"end":[360,115],"bytes":[9957,10071]}},{"name":"generation","type":"string","span":{"start":[360,1],"end":[360,115],"bytes":[9957,10071]}},{"name":"index","type":"int","span":{"start":[360,1],"end":[360,115],"bytes":[9957,10071]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"361:10":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3@361:10","span":{"start":[361,10],"end":[361,143],"bytes":[10081,10214]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"361:100":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3@361:100","span":{"start":[361,100],"end":[361,142],"bytes":[10171,10213]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3"},"362:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3@362:12","span":{"start":[362,12],"end":[362,25],"bytes":[10226,10239]},"callee":"can://litestream/litestream/@external/os/Open"},"366:9":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3@366:9","span":{"start":[366,9],"end":[366,33],"bytes":[10286,10310]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","kind":"method","span":{"start":[371,1],"end":[378,2],"bytes":[10439,10819]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[371,1],"end":[371,131],"bytes":[10439,10569]}},{"name":"generation","type":"string","span":{"start":[371,1],"end":[371,131],"bytes":[10439,10569]}},{"name":"index","type":"int","span":{"start":[371,1],"end":[371,131],"bytes":[10439,10569]}},{"name":"offset","type":"int64","span":{"start":[371,1],"end":[371,131],"bytes":[10439,10569]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"372:10":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3@372:10","span":{"start":[372,10],"end":[372,147],"bytes":[10579,10716]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"372:94":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3@372:94","span":{"start":[372,94],"end":[372,146],"bytes":[10663,10715]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3"},"373:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3@373:12","span":{"start":[373,12],"end":[373,25],"bytes":[10728,10741]},"callee":"can://litestream/litestream/@external/os/Open"},"377:9":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3@377:9","span":{"start":[377,9],"end":[377,33],"bytes":[10788,10812]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.Path":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Path","kind":"method","span":{"start":[81,1],"end":[83,2],"bytes":[1956,2012]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.Path","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/file.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SetLogger","kind":"method","span":{"start":[48,1],"end":[50,2],"bytes":[928,1034]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[48,1],"end":[48,57],"bytes":[928,984]}}],"metrics":{"cyclomatic":1},"body":{"49:13":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SetLogger@49:13","span":{"start":[49,13],"end":[49,48],"bytes":[997,1032]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","kind":"method","span":{"start":[283,1],"end":[316,2],"bytes":[7735,8698]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[283,1],"end":[283,115],"bytes":[7735,7849]}},{"name":"generation","type":"string","span":{"start":[283,1],"end":[283,115],"bytes":[7735,7849]}}],"return_type":"([]github.com/benbjohnson/litestream.SnapshotInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"284:19":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@284:19","span":{"start":[284,19],"end":[284,108],"bytes":[7868,7957]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"285:18":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@285:18","span":{"start":[285,18],"end":[285,43],"bytes":[7975,8000]},"callee":"can://litestream/litestream/@external/os/ReadDir"},"286:5":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@286:5","span":{"start":[286,5],"end":[286,23],"bytes":[8005,8023]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"294:6":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@294:6","span":{"start":[294,6],"end":[294,19],"bytes":[8171,8184]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir"},"297:17":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@297:17","span":{"start":[297,17],"end":[297,65],"bytes":[8219,8267]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3"},"297:52":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@297:52","span":{"start":[297,52],"end":[297,64],"bytes":[8254,8266]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.Name"},"301:16":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@301:16","span":{"start":[301,16],"end":[301,28],"bytes":[8343,8355]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.Info"},"305:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@305:15","span":{"start":[305,15],"end":[310,5],"bytes":[8411,8568]},"callee":null},"308:16":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@308:16","span":{"start":[308,16],"end":[308,27],"bytes":[8520,8531]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"309:16":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@309:16","span":{"start":[309,16],"end":[309,30],"bytes":[8548,8562]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime"},"312:2":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3@312:2","span":{"start":[312,2],"end":[314,4],"bytes":[8573,8673]},"callee":"can://litestream/litestream/@external/slices/SortFunc"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3.closure_1","kind":"function","span":{"start":[312,1],"end":[314,4],"bytes":[8572,8673]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3.closure_1","parameters":[{"name":"a","type":"github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[312,1],"end":[312,71],"bytes":[8572,8642]}},{"name":"b","type":"github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[312,1],"end":[312,71],"bytes":[8572,8642]}}],"return_type":"int","body":{}}}},"github.com/benbjohnson/litestream/file.ReplicaClient.Type":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Type","kind":"method","span":{"start":[71,1],"end":[73,2],"bytes":[1670,1737]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","kind":"method","span":{"start":[319,1],"end":[356,2],"bytes":[8785,9840]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[319,1],"end":[319,119],"bytes":[8785,8903]}},{"name":"generation","type":"string","span":{"start":[319,1],"end":[319,119],"bytes":[8785,8903]}}],"return_type":"([]github.com/benbjohnson/litestream.WALSegmentInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"320:13":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@320:13","span":{"start":[320,13],"end":[320,96],"bytes":[8916,8999]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"321:18":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@321:18","span":{"start":[321,18],"end":[321,37],"bytes":[9017,9036]},"callee":"can://litestream/litestream/@external/os/ReadDir"},"322:5":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@322:5","span":{"start":[322,5],"end":[322,23],"bytes":[9041,9059]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"330:6":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@330:6","span":{"start":[330,6],"end":[330,19],"bytes":[9208,9221]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir"},"333:25":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@333:25","span":{"start":[333,25],"end":[333,75],"bytes":[9264,9314]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3"},"333:62":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@333:62","span":{"start":[333,62],"end":[333,74],"bytes":[9301,9313]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.Name"},"337:16":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@337:16","span":{"start":[337,16],"end":[337,28],"bytes":[9390,9402]},"callee":"can://litestream/litestream/@external/io/fs/DirEntry.Info"},"341:14":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@341:14","span":{"start":[341,14],"end":[347,5],"bytes":[9457,9638]},"callee":null},"345:16":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@345:16","span":{"start":[345,16],"end":[345,27],"bytes":[9590,9601]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"346:16":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@346:16","span":{"start":[346,16],"end":[346,30],"bytes":[9618,9632]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime"},"349:2":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3@349:2","span":{"start":[349,2],"end":[354,4],"bytes":[9643,9816]},"callee":"can://litestream/litestream/@external/slices/SortFunc"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3.closure_1","kind":"function","span":{"start":[349,1],"end":[354,4],"bytes":[9642,9816]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3.closure_1","parameters":[{"name":"a","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[349,1],"end":[349,72],"bytes":[9642,9713]}},{"name":"b","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[349,1],"end":[349,72],"bytes":[9642,9713]}}],"return_type":"int","body":{"353:10":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3.closure_1@353:10","span":{"start":[353,10],"end":[353,41],"bytes":[9781,9812]},"callee":"can://litestream/litestream/@external/cmp/Compare"}}}}},"github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[158,1],"end":[238,2],"bytes":[4335,6436]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}},{"name":"level","type":"int","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}},{"name":"minTXID","type":"invalid type","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}},{"name":"maxTXID","type":"invalid type","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}},{"name":"rd","type":"io.Reader","span":{"start":[158,1],"end":[158,144],"bytes":[4335,4478]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"160:11":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@160:11","span":{"start":[160,11],"end":[160,17],"bytes":[4524,4530]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db"},"161:23":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@161:23","span":{"start":[161,23],"end":[161,36],"bytes":[4566,4579]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.FileInfo"},"161:38":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@161:38","span":{"start":[161,38],"end":[161,50],"bytes":[4581,4593]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo"},"166:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@166:15","span":{"start":[166,15],"end":[166,37],"bytes":[4707,4729]},"callee":"can://litestream/litestream/@external/io/TeeReader"},"169:17":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@169:17","span":{"start":[169,17],"end":[169,42],"bytes":[4785,4810]},"callee":null},"171:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@171:15","span":{"start":[171,15],"end":[171,71],"bytes":[4842,4898]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"173:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@173:15","span":{"start":[173,15],"end":[173,50],"bytes":[4916,4951]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"173:15/2":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@173:15/2","span":{"start":[173,15],"end":[173,44],"bytes":[4916,4945]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"176:16":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@176:16","span":{"start":[176,16],"end":[176,40],"bytes":[5014,5038]},"callee":"can://litestream/litestream/@external/io/MultiReader"},"179:14":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@179:14","span":{"start":[179,14],"end":[179,52],"bytes":[5089,5127]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath"},"180:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@180:12","span":{"start":[180,12],"end":[180,62],"bytes":[5139,5189]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"180:30":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@180:30","span":{"start":[180,30],"end":[180,52],"bytes":[5157,5179]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"186:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@186:12","span":{"start":[186,12],"end":[186,54],"bytes":[5334,5376]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile"},"193:8":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@193:8","span":{"start":[193,8],"end":[198,5],"bytes":[5546,5627]},"callee":null,"is_deferred":true},"200:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@200:15","span":{"start":[200,15],"end":[200,37],"bytes":[5643,5665]},"callee":"can://litestream/litestream/@external/io/Copy"},"203:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@203:12","span":{"start":[203,12],"end":[203,20],"bytes":[5712,5720]},"callee":"can://litestream/litestream/@external/os/File.Sync"},"208:13":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@208:13","span":{"start":[208,13],"end":[208,21],"bytes":[5789,5797]},"callee":"can://litestream/litestream/@external/os/File.Stat"},"216:14":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@216:14","span":{"start":[216,14],"end":[216,23],"bytes":[5936,5945]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Size"},"220:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@220:12","span":{"start":[220,12],"end":[220,21],"bytes":[5986,5995]},"callee":"can://litestream/litestream/@external/os/File.Close"},"225:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@225:12","span":{"start":[225,12],"end":[225,44],"bytes":[6118,6150]},"callee":"can://litestream/litestream/@external/os/Rename"},"228:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@228:12","span":{"start":[228,12],"end":[228,53],"bytes":[6197,6238]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"228:30":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@228:30","span":{"start":[228,30],"end":[228,52],"bytes":[6215,6237]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"233:12":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile@233:12","span":{"start":[233,12],"end":[233,54],"bytes":[6338,6380]},"callee":"can://litestream/litestream/@external/os/Chtimes"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile.closure_1","kind":"function","span":{"start":[193,1],"end":[198,5],"bytes":[5539,5627]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile.closure_1","parameters":[],"body":{"194:7":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile.closure_1@194:7","span":{"start":[194,7],"end":[194,16],"bytes":[5561,5570]},"callee":"can://litestream/litestream/@external/os/File.Close"},"196:8":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile.closure_1@196:8","span":{"start":[196,8],"end":[196,30],"bytes":[5596,5618]},"callee":"can://litestream/litestream/@external/os/Remove"}}}}},"github.com/benbjohnson/litestream/file.ReplicaClient.db":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db","kind":"method","span":{"start":[63,1],"end":[68,2],"bytes":[1516,1625]},"signature":"github.com/benbjohnson/litestream/file.ReplicaClient.db","parameters":[],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":2},"body":{"67:9":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db@67:9","span":{"start":[67,9],"end":[67,23],"bytes":[1609,1623]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB"}}}},"fields":{"Replica":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/Replica","kind":"field","type":"*github.com/benbjohnson/litestream.Replica","span":{"start":[36,1],"end":[36,29],"bytes":[660,688]}},"logger":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[37,1],"end":[37,22],"bytes":[689,710]}},"path":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/path","kind":"field","type":"string","span":{"start":[34,1],"end":[34,33],"bytes":[626,658]}}}}},"functions":{"github.com/benbjohnson/litestream/file.NewReplicaClient":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","kind":"function","span":{"start":[41,1],"end":[46,2],"bytes":[775,926]},"signature":"github.com/benbjohnson/litestream/file.NewReplicaClient","parameters":[{"name":"path","type":"string","span":{"start":[41,1],"end":[41,52],"bytes":[775,826]}}],"return_type":"*github.com/benbjohnson/litestream/file.ReplicaClient","metrics":{"cyclomatic":1},"body":{"43:11":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient@43:11","span":{"start":[43,11],"end":[43,54],"bytes":[861,904]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"43:11/2":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient@43:11/2","span":{"start":[43,11],"end":[43,25],"bytes":[861,875]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/file.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClientFromURL","kind":"function","span":{"start":[54,1],"end":[60,2],"bytes":[1172,1472]},"signature":"github.com/benbjohnson/litestream/file.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}},{"name":"host","type":"string","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}},{"name":"urlPath","type":"string","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}},{"name":"query","type":"net/url.Values","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[54,1],"end":[54,137],"bytes":[1172,1308]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"57:15":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClientFromURL@57:15","span":{"start":[57,15],"end":[57,55],"bytes":[1388,1428]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"59:9":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClientFromURL@59:9","span":{"start":[59,9],"end":[59,34],"bytes":[1440,1465]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient"}}},"github.com/benbjohnson/litestream/file.init":{"id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.init","kind":"function","span":{"start":[22,1],"end":[24,2],"bytes":[242,331]},"signature":"github.com/benbjohnson/litestream/file.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"23:2":{"kind":"call","id":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.init@23:2","span":{"start":[23,2],"end":[23,74],"bytes":[257,329]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}}},"content_hash":"e962698493a721417236820987741a07fae6650a57f81bb5de664b58fc1300df"},"gs/replica_client.go":{"id":"can://litestream/litestream/go/gs/replica_client.go","kind":"module","span":{"start":[1,1],"end":[316,1],"bytes":[0,8672]},"package":"gs","source":"package gs\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"sync\"\n\t\"time\"\n\n\t\"cloud.google.com/go/storage\"\n\t\"github.com/superfly/ltx\"\n\t\"google.golang.org/api/iterator\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"gs\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"gs\"\n\n// MetadataKeyTimestamp is the metadata key for storing LTX file timestamps in GCS.\nconst MetadataKeyTimestamp = \"litestream-timestamp\"\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to Google Cloud Storage.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tclient *storage.Client // gs client\n\tbkt *storage.BucketHandle // gs bucket handle\n\tlogger *slog.Logger\n\n\t// GS bucket information\n\tBucket string\n\tPath string\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tif host == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for gs replica URL\")\n\t}\n\n\tclient := NewReplicaClient()\n\tclient.Bucket = host\n\tclient.Path = urlPath\n\treturn client, nil\n}\n\n// Type returns \"gs\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to GS. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) (err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.client != nil {\n\t\treturn nil\n\t}\n\n\tif c.client, err = storage.NewClient(ctx); err != nil {\n\t\treturn fmt.Errorf(\"failed to create GCS client (bucket: %s): %w\", c.Bucket, err)\n\t}\n\tc.bkt = c.client.Bucket(c.Bucket)\n\n\treturn nil\n}\n\n// DeleteAll deletes all LTX files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t// Iterate over every object and delete it.\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"LIST\").Inc()\n\tfor it := c.bkt.Objects(ctx, \u0026storage.Query{Prefix: c.Path + \"/\"}); ; {\n\t\tattrs, err := it.Next()\n\t\tif errors.Is(err, iterator.Done) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"failed to list objects in GCS bucket %s (path: %s): %w\", c.Bucket, c.Path, err)\n\t\t}\n\n\t\tif err := c.bkt.Object(attrs.Name).Delete(ctx); isNotExists(err) {\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"gs: cannot delete object %q: %w\", attrs.Name, err)\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\t// log.Printf(\"%s(%s): retainer: deleting\", r.db.Path(), r.Name())\n\n\treturn nil\n}\n\n// LTXFiles returns an iterator over all available LTX files for a level.\n// GCS always uses accurate timestamps from metadata since they're included in LIST operations at zero cost.\n// The useMetadata parameter is ignored.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tdir := litestream.LTXLevelDir(c.Path, level)\n\tquery := \u0026storage.Query{Prefix: dir + \"/\"}\n\tif seek != 0 {\n\t\tquery.StartOffset = query.Prefix + seek.String()\n\t}\n\n\treturn newLTXFileIterator(c.bkt.Objects(ctx, query), c, level), nil\n}\n\n// WriteLTXFile writes an LTX file from rd to a remote path.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn info, err\n\t}\n\n\tkey := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\tfullReader := io.MultiReader(\u0026buf, rd)\n\n\twriteCtx, cancel := context.WithCancel(ctx)\n\tdefer cancel()\n\tw := c.bkt.Object(key).NewWriter(writeCtx)\n\n\t// Store timestamp in GCS metadata for accurate timestamp retrieval\n\tw.Metadata = map[string]string{\n\t\tMetadataKeyTimestamp: timestamp.Format(time.RFC3339Nano),\n\t}\n\n\tn, err := io.Copy(w, fullReader)\n\tif err != nil {\n\t\tcancel()\n\t\treturn info, err\n\t} else if err := w.Close(); err != nil {\n\t\treturn info, err\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(n))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: n,\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// OpenLTXFile returns a reader for a given LTX file.\n// Returns os.ErrNotExist if no matching index/offset is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\t// In the GCS client, a length of -1 reads to EOF while 0 returns no data.\n\t// Callers pass size=0 to indicate \"entire object\" so translate that here.\n\t// See: https://pkg.go.dev/cloud.google.com/go/storage#ObjectHandle.NewRangeReader\n\tlength := size\n\tif length \u003c= 0 {\n\t\tlength = -1\n\t}\n\n\tr, err := c.bkt.Object(key).NewRangeReader(ctx, offset, length)\n\tif isNotExists(err) {\n\t\treturn nil, os.ErrNotExist\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Add(float64(r.Attrs.Size))\n\n\treturn r, nil\n}\n\n// DeleteLTXFiles deletes a set of LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, info := range a {\n\t\tkey := litestream.LTXFilePath(c.Path, info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"key\", key)\n\n\t\tif err := c.bkt.Object(key).Delete(ctx); err != nil \u0026\u0026 !isNotExists(err) {\n\t\t\treturn fmt.Errorf(\"gs: cannot delete ltx file %q: %w\", key, err)\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\ntype ltxFileIterator struct {\n\tit *storage.ObjectIterator\n\tclient *ReplicaClient\n\tlevel int\n\tinfo *ltx.FileInfo\n\terr error\n}\n\nfunc newLTXFileIterator(it *storage.ObjectIterator, client *ReplicaClient, level int) *ltxFileIterator {\n\treturn \u0026ltxFileIterator{\n\t\tit: it,\n\t\tclient: client,\n\t\tlevel: level,\n\t}\n}\n\nfunc (itr *ltxFileIterator) Close() (err error) {\n\treturn itr.err\n}\n\nfunc (itr *ltxFileIterator) Next() bool {\n\t// Exit if an error has already occurred.\n\tif itr.err != nil {\n\t\treturn false\n\t}\n\n\tfor {\n\t\t// Fetch next object.\n\t\tattrs, err := itr.it.Next()\n\t\tif errors.Is(err, iterator.Done) {\n\t\t\treturn false\n\t\t} else if err != nil {\n\t\t\titr.err = err\n\t\t\treturn false\n\t\t}\n\n\t\t// Parse index \u0026 offset, otherwise skip to the next object.\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(path.Base(attrs.Name))\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Always use accurate timestamp from metadata since it's zero-cost\n\t\t// GCS includes metadata in LIST operations, so no extra API call needed\n\t\tcreatedAt := attrs.Created.UTC()\n\t\tif attrs.Metadata != nil {\n\t\t\tif ts, ok := attrs.Metadata[MetadataKeyTimestamp]; ok {\n\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, ts); err == nil {\n\t\t\t\t\tcreatedAt = parsed\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Store current snapshot and return.\n\t\titr.info = \u0026ltx.FileInfo{\n\t\t\tLevel: itr.level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: attrs.Size,\n\t\t\tCreatedAt: createdAt,\n\t\t}\n\n\t\treturn true\n\t}\n}\n\nfunc (itr *ltxFileIterator) Err() error { return itr.err }\n\nfunc (itr *ltxFileIterator) Item() *ltx.FileInfo {\n\treturn itr.info\n}\n\nfunc isNotExists(err error) bool {\n\treturn errors.Is(err, storage.ErrObjectNotExist)\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[21,29]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[30,40]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[41,50]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[51,57]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[58,63]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[64,75]}},{"name":"url","path":"net/url","span":{"start":[10,1],"end":[10,11],"bytes":[76,86]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[87,92]}},{"name":"path","path":"path","span":{"start":[12,1],"end":[12,8],"bytes":[93,100]}},{"name":"sync","path":"sync","span":{"start":[13,1],"end":[13,8],"bytes":[101,108]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[109,116]}},{"name":"storage","path":"cloud.google.com/go/storage","span":{"start":[16,1],"end":[16,31],"bytes":[118,148]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[17,1],"end":[17,27],"bytes":[149,175]}},{"name":"iterator","path":"google.golang.org/api/iterator","span":{"start":[18,1],"end":[18,34],"bytes":[176,209]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[20,1],"end":[20,37],"bytes":[211,247]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[21,1],"end":[21,46],"bytes":[248,293]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient","kind":"struct","span":{"start":[37,1],"end":[46,2],"bytes":[745,964]},"callables":{"github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","kind":"method","span":{"start":[95,1],"end":[121,2],"bytes":[2266,3145]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[95,1],"end":[95,63],"bytes":[2266,2328]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"101:2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@101:2","span":{"start":[101,2],"end":[101,84],"bytes":[2429,2511]},"callee":null},"101:2/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@101:2/2","span":{"start":[101,2],"end":[101,78],"bytes":[2429,2505]},"callee":null},"102:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@102:12","span":{"start":[102,12],"end":[102,68],"bytes":[2523,2579]},"callee":null},"103:17":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@103:17","span":{"start":[103,17],"end":[103,26],"bytes":[2601,2610]},"callee":null},"104:6":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@104:6","span":{"start":[104,6],"end":[104,35],"bytes":[2616,2645]},"callee":"can://litestream/litestream/@external/errors/Is"},"107:11":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@107:11","span":{"start":[107,11],"end":[107,102],"bytes":[2692,2783]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"110:13":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@110:13","span":{"start":[110,13],"end":[110,49],"bytes":[2801,2837]},"callee":null},"110:13/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@110:13/2","span":{"start":[110,13],"end":[110,37],"bytes":[2801,2825]},"callee":null},"110:51":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@110:51","span":{"start":[110,51],"end":[110,67],"bytes":[2839,2855]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists"},"113:11":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@113:11","span":{"start":[113,11],"end":[113,73],"bytes":[2905,2967]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"115:3":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@115:3","span":{"start":[115,3],"end":[115,87],"bytes":[2974,3058]},"callee":null},"115:3/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@115:3/2","span":{"start":[115,3],"end":[115,81],"bytes":[2974,3052]},"callee":null},"96:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll@96:12","span":{"start":[96,12],"end":[96,23],"bytes":[2340,2351]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[222,1],"end":[239,2],"bytes":[6379,7002]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[222,1],"end":[222,87],"bytes":[6379,6465]}},{"name":"a","type":"[]invalid type","span":{"start":[222,1],"end":[222,87],"bytes":[6379,6465]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"223:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@223:12","span":{"start":[223,12],"end":[223,23],"bytes":[6477,6488]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"228:10":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@228:10","span":{"start":[228,10],"end":[228,80],"bytes":[6555,6625]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"230:3":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@230:3","span":{"start":[230,3],"end":[230,121],"bytes":[6629,6747]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"232:13":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@232:13","span":{"start":[232,13],"end":[232,42],"bytes":[6761,6790]},"callee":null},"232:13/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@232:13/2","span":{"start":[232,13],"end":[232,30],"bytes":[6761,6778]},"callee":null},"232:59":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@232:59","span":{"start":[232,59],"end":[232,75],"bytes":[6807,6823]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists"},"233:11":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@233:11","span":{"start":[233,11],"end":[233,68],"bytes":[6836,6893]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"235:3":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@235:3","span":{"start":[235,3],"end":[235,87],"bytes":[6900,6984]},"callee":null},"235:3/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles@235:3/2","span":{"start":[235,3],"end":[235,81],"bytes":[6900,6978]},"callee":null}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.Init":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","kind":"method","span":{"start":[78,1],"end":[92,2],"bytes":[1898,2228]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[78,1],"end":[78,64],"bytes":[1898,1961]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"79:2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init@79:2","span":{"start":[79,2],"end":[79,13],"bytes":[1963,1974]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"80:8":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init@80:8","span":{"start":[80,8],"end":[80,21],"bytes":[1982,1995]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"86:21":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init@86:21","span":{"start":[86,21],"end":[86,43],"bytes":[2056,2078]},"callee":null},"87:10":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init@87:10","span":{"start":[87,10],"end":[87,83],"bytes":[2102,2175]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"89:10":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init@89:10","span":{"start":[89,10],"end":[89,35],"bytes":[2188,2213]},"callee":null}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","kind":"method","span":{"start":[126,1],"end":[138,2],"bytes":[3371,3787]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[126,1],"end":[126,126],"bytes":[3371,3496]}},{"name":"level","type":"int","span":{"start":[126,1],"end":[126,126],"bytes":[3371,3496]}},{"name":"seek","type":"invalid type","span":{"start":[126,1],"end":[126,126],"bytes":[3371,3496]}},{"name":"useMetadata","type":"bool","span":{"start":[126,1],"end":[126,126],"bytes":[3371,3496]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"127:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles@127:12","span":{"start":[127,12],"end":[127,23],"bytes":[3508,3519]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"131:9":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles@131:9","span":{"start":[131,9],"end":[131,46],"bytes":[3564,3601]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"134:38":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles@134:38","span":{"start":[134,38],"end":[134,51],"bytes":[3699,3712]},"callee":null},"137:28":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles@137:28","span":{"start":[137,28],"end":[137,53],"bytes":[3744,3769]},"callee":null},"137:9":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles@137:9","span":{"start":[137,9],"end":[137,64],"bytes":[3725,3780]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.newLTXFileIterator"}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[193,1],"end":[219,2],"bytes":[5412,6331]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"level","type":"int","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"minTXID","type":"invalid type","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"maxTXID","type":"invalid type","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"offset","type":"int64","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}},{"name":"size","type":"int64","span":{"start":[193,1],"end":[193,140],"bytes":[5412,5551]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"194:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@194:12","span":{"start":[194,12],"end":[194,23],"bytes":[5563,5574]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"198:9":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@198:9","span":{"start":[198,9],"end":[198,64],"bytes":[5619,5674]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"208:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@208:12","span":{"start":[208,12],"end":[208,65],"bytes":[5975,6028]},"callee":null},"208:12/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@208:12/2","span":{"start":[208,12],"end":[208,29],"bytes":[5975,5992]},"callee":null},"209:5":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@209:5","span":{"start":[209,5],"end":[209,21],"bytes":[6033,6049]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists"},"215:2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@215:2","span":{"start":[215,2],"end":[215,83],"bytes":[6128,6209]},"callee":null},"215:2/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@215:2/2","span":{"start":[215,2],"end":[215,77],"bytes":[6128,6203]},"callee":null},"216:2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@216:2","span":{"start":[216,2],"end":[216,104],"bytes":[6211,6313]},"callee":null},"216:2/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@216:2/2","span":{"start":[216,2],"end":[216,77],"bytes":[6211,6286]},"callee":null},"216:82":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile@216:82","span":{"start":[216,82],"end":[216,103],"bytes":[6291,6312]},"callee":null}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.SetLogger","kind":"method","span":{"start":[55,1],"end":[57,2],"bytes":[1153,1259]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[55,1],"end":[55,57],"bytes":[1153,1209]}}],"metrics":{"cyclomatic":1},"body":{"56:13":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.SetLogger@56:13","span":{"start":[56,13],"end":[56,48],"bytes":[1222,1257]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/gs.ReplicaClient.Type":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Type","kind":"method","span":{"start":[73,1],"end":[75,2],"bytes":[1757,1824]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[141,1],"end":[189,2],"bytes":[3850,5292]},"signature":"github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}},{"name":"level","type":"int","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}},{"name":"minTXID","type":"invalid type","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}},{"name":"maxTXID","type":"invalid type","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}},{"name":"rd","type":"io.Reader","span":{"start":[141,1],"end":[141,144],"bytes":[3850,3993]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"142:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@142:12","span":{"start":[142,12],"end":[142,23],"bytes":[4005,4016]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"146:9":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@146:9","span":{"start":[146,9],"end":[146,64],"bytes":[4062,4117]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"150:15":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@150:15","span":{"start":[150,15],"end":[150,37],"bytes":[4228,4250]},"callee":"can://litestream/litestream/@external/io/TeeReader"},"153:17":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@153:17","span":{"start":[153,17],"end":[153,42],"bytes":[4306,4331]},"callee":null},"155:15":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@155:15","span":{"start":[155,15],"end":[155,71],"bytes":[4363,4419]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"157:15":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@157:15","span":{"start":[157,15],"end":[157,50],"bytes":[4437,4472]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"157:15/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@157:15/2","span":{"start":[157,15],"end":[157,44],"bytes":[4437,4466]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"160:16":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@160:16","span":{"start":[160,16],"end":[160,40],"bytes":[4535,4559]},"callee":"can://litestream/litestream/@external/io/MultiReader"},"162:22":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@162:22","span":{"start":[162,22],"end":[162,45],"bytes":[4582,4605]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"163:8":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@163:8","span":{"start":[163,8],"end":[163,16],"bytes":[4613,4621]},"callee":null,"is_deferred":true},"164:7":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@164:7","span":{"start":[164,7],"end":[164,44],"bytes":[4628,4665]},"callee":null},"164:7/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@164:7/2","span":{"start":[164,7],"end":[164,24],"bytes":[4628,4645]},"callee":null},"168:25":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@168:25","span":{"start":[168,25],"end":[168,59],"bytes":[4793,4827]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"171:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@171:12","span":{"start":[171,12],"end":[171,34],"bytes":[4844,4866]},"callee":"can://litestream/litestream/@external/io/Copy"},"173:3":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@173:3","span":{"start":[173,3],"end":[173,11],"bytes":[4886,4894]},"callee":null},"175:19":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@175:19","span":{"start":[175,19],"end":[175,28],"bytes":[4932,4941]},"callee":null},"179:2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@179:2","span":{"start":[179,2],"end":[179,83],"bytes":[4980,5061]},"callee":null},"179:2/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@179:2/2","span":{"start":[179,2],"end":[179,77],"bytes":[4980,5055]},"callee":null},"180:2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@180:2","span":{"start":[180,2],"end":[180,93],"bytes":[5063,5154]},"callee":null},"180:2/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@180:2/2","span":{"start":[180,2],"end":[180,77],"bytes":[5063,5138]},"callee":null},"180:82":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile@180:82","span":{"start":[180,82],"end":[180,92],"bytes":[5143,5153]},"callee":null}}}},"fields":{"Bucket":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/Bucket","kind":"field","type":"string","span":{"start":[44,1],"end":[44,15],"bytes":[933,947]}},"Path":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[45,1],"end":[45,15],"bytes":[948,962]}},"bkt":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/bkt","kind":"field","type":"invalid type","span":{"start":[40,1],"end":[40,50],"bytes":[835,884]}},"client":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/client","kind":"field","type":"invalid type","span":{"start":[39,1],"end":[39,43],"bytes":[792,834]}},"logger":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[41,1],"end":[41,21],"bytes":[885,905]}},"mu":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[38,1],"end":[38,19],"bytes":[773,791]}}}},"ltxFileIterator":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator","kind":"struct","span":{"start":[241,1],"end":[247,2],"bytes":[7004,7138]},"callables":{"github.com/benbjohnson/litestream/gs.ltxFileIterator.Close":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Close","kind":"method","span":{"start":[257,1],"end":[259,2],"bytes":[7326,7393]},"signature":"github.com/benbjohnson/litestream/gs.ltxFileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/gs.ltxFileIterator.Err":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Err","kind":"method","span":{"start":[307,1],"end":[307,59],"bytes":[8454,8512]},"signature":"github.com/benbjohnson/litestream/gs.ltxFileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/gs.ltxFileIterator.Item":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Item","kind":"method","span":{"start":[309,1],"end":[311,2],"bytes":[8514,8583]},"signature":"github.com/benbjohnson/litestream/gs.ltxFileIterator.Item","parameters":[],"return_type":"invalid type","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/gs.ltxFileIterator.Next":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next","kind":"method","span":{"start":[261,1],"end":[305,2],"bytes":[7395,8452]},"signature":"github.com/benbjohnson/litestream/gs.ltxFileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":9},"body":{"269:17":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next@269:17","span":{"start":[269,17],"end":[269,30],"bytes":[7567,7580]},"callee":null},"270:6":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next@270:6","span":{"start":[270,6],"end":[270,35],"bytes":[7586,7615]},"callee":"can://litestream/litestream/@external/errors/Is"},"278:28":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next@278:28","span":{"start":[278,28],"end":[278,68],"bytes":[7786,7826]},"callee":null},"278:46":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next@278:46","span":{"start":[278,46],"end":[278,67],"bytes":[7804,7825]},"callee":"can://litestream/litestream/@external/path/Base"},"285:16":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next@285:16","span":{"start":[285,16],"end":[285,35],"bytes":[8022,8041]},"callee":null},"288:23":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next@288:23","span":{"start":[288,23],"end":[288,55],"bytes":[8152,8184]},"callee":"can://litestream/litestream/@external/time/Parse"}}}},"fields":{"client":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/client","kind":"field","type":"*github.com/benbjohnson/litestream/gs.ReplicaClient","span":{"start":[243,1],"end":[243,23],"bytes":[7066,7088]}},"err":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/err","kind":"field","type":"error","span":{"start":[246,1],"end":[246,14],"bytes":[7123,7136]}},"info":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/info","kind":"field","type":"invalid type","span":{"start":[245,1],"end":[245,22],"bytes":[7101,7122]}},"it":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/it","kind":"field","type":"invalid type","span":{"start":[242,1],"end":[242,32],"bytes":[7034,7065]}},"level":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/level","kind":"field","type":"int","span":{"start":[244,1],"end":[244,12],"bytes":[7089,7100]}}}}},"functions":{"github.com/benbjohnson/litestream/gs.NewReplicaClient":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","kind":"function","span":{"start":[49,1],"end":[53,2],"bytes":[1027,1151]},"signature":"github.com/benbjohnson/litestream/gs.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/gs.ReplicaClient","metrics":{"cyclomatic":1},"body":{"51:11":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient@51:11","span":{"start":[51,11],"end":[51,54],"bytes":[1102,1145]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"51:11/2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient@51:11/2","span":{"start":[51,11],"end":[51,25],"bytes":[1102,1116]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL","kind":"function","span":{"start":[61,1],"end":[70,2],"bytes":[1397,1714]},"signature":"github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}},{"name":"host","type":"string","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}},{"name":"urlPath","type":"string","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}},{"name":"query","type":"net/url.Values","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[61,1],"end":[61,137],"bytes":[1397,1533]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"63:15":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL@63:15","span":{"start":[63,15],"end":[63,63],"bytes":[1565,1613]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"66:12":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL@66:12","span":{"start":[66,12],"end":[66,30],"bytes":[1629,1647]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient"}}},"github.com/benbjohnson/litestream/gs.init":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.init","kind":"function","span":{"start":[24,1],"end":[26,2],"bytes":[297,384]},"signature":"github.com/benbjohnson/litestream/gs.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"25:2":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.init@25:2","span":{"start":[25,2],"end":[25,72],"bytes":[312,382]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/gs.isNotExists":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","kind":"function","span":{"start":[313,1],"end":[315,2],"bytes":[8585,8671]},"signature":"github.com/benbjohnson/litestream/gs.isNotExists","parameters":[{"name":"err","type":"error","span":{"start":[313,1],"end":[313,35],"bytes":[8585,8619]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"314:9":{"kind":"call","id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists@314:9","span":{"start":[314,9],"end":[314,50],"bytes":[8628,8669]},"callee":"can://litestream/litestream/@external/errors/Is"}}},"github.com/benbjohnson/litestream/gs.newLTXFileIterator":{"id":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.newLTXFileIterator","kind":"function","span":{"start":[249,1],"end":[255,2],"bytes":[7140,7324]},"signature":"github.com/benbjohnson/litestream/gs.newLTXFileIterator","parameters":[{"name":"it","type":"invalid type","span":{"start":[249,1],"end":[249,105],"bytes":[7140,7244]}},{"name":"client","type":"*github.com/benbjohnson/litestream/gs.ReplicaClient","span":{"start":[249,1],"end":[249,105],"bytes":[7140,7244]}},{"name":"level","type":"int","span":{"start":[249,1],"end":[249,105],"bytes":[7140,7244]}}],"return_type":"*github.com/benbjohnson/litestream/gs.ltxFileIterator","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"1bc094d2a506f33e506545d5cebb40caf43ad4fec91331d27bbb588fdf9df78b"},"heartbeat.go":{"id":"can://litestream/litestream/go/heartbeat.go","kind":"module","span":{"start":[1,1],"end":[85,1],"bytes":[0,1575]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst (\n\tDefaultHeartbeatInterval = 5 * time.Minute\n\tDefaultHeartbeatTimeout = 30 * time.Second\n\tMinHeartbeatInterval = 1 * time.Minute\n)\n\ntype HeartbeatClient struct {\n\tmu sync.Mutex\n\thttpClient *http.Client\n\n\tURL string\n\tInterval time.Duration\n\tTimeout time.Duration\n\n\tlastPingAt time.Time\n}\n\nfunc NewHeartbeatClient(url string, interval time.Duration) *HeartbeatClient {\n\tif interval \u003c MinHeartbeatInterval {\n\t\tinterval = MinHeartbeatInterval\n\t}\n\n\ttimeout := DefaultHeartbeatTimeout\n\n\treturn \u0026HeartbeatClient{\n\t\tURL: url,\n\t\tInterval: interval,\n\t\tTimeout: timeout,\n\t\thttpClient: \u0026http.Client{\n\t\t\tTimeout: timeout,\n\t\t},\n\t}\n}\n\nfunc (c *HeartbeatClient) Ping(ctx context.Context) error {\n\tif c.URL == \"\" {\n\t\treturn nil\n\t}\n\n\treq, err := http.NewRequestWithContext(ctx, http.MethodGet, c.URL, nil)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create request: %w\", err)\n\t}\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"http request: %w\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode \u003c 200 || resp.StatusCode \u003e= 300 {\n\t\treturn fmt.Errorf(\"unexpected status code: %d\", resp.StatusCode)\n\t}\n\n\treturn nil\n}\n\nfunc (c *HeartbeatClient) ShouldPing() bool {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\treturn time.Since(c.lastPingAt) \u003e= c.Interval\n}\n\nfunc (c *HeartbeatClient) LastPingAt() time.Time {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\treturn c.lastPingAt\n}\n\nfunc (c *HeartbeatClient) RecordPing() {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tc.lastPingAt = time.Now()\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"fmt","path":"fmt","span":{"start":[5,1],"end":[5,7],"bytes":[40,46]}},{"name":"http","path":"net/http","span":{"start":[6,1],"end":[6,12],"bytes":[47,58]}},{"name":"sync","path":"sync","span":{"start":[7,1],"end":[7,8],"bytes":[59,66]}},{"name":"time","path":"time","span":{"start":[8,1],"end":[8,8],"bytes":[67,74]}}],"types":{"HeartbeatClient":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient","kind":"struct","span":{"start":[17,1],"end":[26,2],"bytes":[222,390]},"callables":{"github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt","kind":"method","span":{"start":[74,1],"end":[78,2],"bytes":[1362,1469]},"signature":"github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt","parameters":[],"return_type":"time.Time","metrics":{"cyclomatic":1},"body":{"75:2":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt@75:2","span":{"start":[75,2],"end":[75,13],"bytes":[1414,1425]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"76:8":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt@76:8","span":{"start":[76,8],"end":[76,21],"bytes":[1433,1446]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.HeartbeatClient.Ping":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping","kind":"method","span":{"start":[45,1],"end":[66,2],"bytes":[730,1230]},"signature":"github.com/benbjohnson/litestream.HeartbeatClient.Ping","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[45,1],"end":[45,60],"bytes":[730,789]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"50:14":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping@50:14","span":{"start":[50,14],"end":[50,73],"bytes":[838,897]},"callee":"can://litestream/litestream/@external/net/http/NewRequestWithContext"},"52:10":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping@52:10","span":{"start":[52,10],"end":[52,47],"bytes":[924,961]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"55:15":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping@55:15","span":{"start":[55,15],"end":[55,35],"bytes":[980,1000]},"callee":"can://litestream/litestream/@external/net/http/Client.Do"},"57:10":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping@57:10","span":{"start":[57,10],"end":[57,45],"bytes":[1027,1062]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"59:8":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping@59:8","span":{"start":[59,8],"end":[59,25],"bytes":[1073,1090]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"62:10":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping@62:10","span":{"start":[62,10],"end":[62,67],"bytes":[1155,1212]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.HeartbeatClient.RecordPing":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","kind":"method","span":{"start":[80,1],"end":[84,2],"bytes":[1471,1574]},"signature":"github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","parameters":[],"metrics":{"cyclomatic":1},"body":{"81:2":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing@81:2","span":{"start":[81,2],"end":[81,13],"bytes":[1513,1524]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"82:8":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing@82:8","span":{"start":[82,8],"end":[82,21],"bytes":[1532,1545]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"83:17":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing@83:17","span":{"start":[83,17],"end":[83,27],"bytes":[1562,1572]},"callee":"can://litestream/litestream/@external/time/Now"}}},"github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","kind":"method","span":{"start":[68,1],"end":[72,2],"bytes":[1232,1360]},"signature":"github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"69:2":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing@69:2","span":{"start":[69,2],"end":[69,13],"bytes":[1279,1290]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"70:8":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing@70:8","span":{"start":[70,8],"end":[70,21],"bytes":[1298,1311]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"71:9":{"kind":"call","id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing@71:9","span":{"start":[71,9],"end":[71,33],"bytes":[1320,1344]},"callee":"can://litestream/litestream/@external/time/Since"}}}},"fields":{"Interval":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/Interval","kind":"field","type":"time.Duration","span":{"start":[22,1],"end":[22,24],"bytes":[318,341]}},"Timeout":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/Timeout","kind":"field","type":"time.Duration","span":{"start":[23,1],"end":[23,24],"bytes":[342,365]}},"URL":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/URL","kind":"field","type":"string","span":{"start":[21,1],"end":[21,17],"bytes":[301,317]}},"httpClient":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/httpClient","kind":"field","type":"*net/http.Client","span":{"start":[19,1],"end":[19,25],"bytes":[275,299]}},"lastPingAt":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/lastPingAt","kind":"field","type":"time.Time","span":{"start":[25,1],"end":[25,22],"bytes":[367,388]}},"mu":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[18,1],"end":[18,23],"bytes":[252,274]}}}}},"functions":{"github.com/benbjohnson/litestream.NewHeartbeatClient":{"id":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.NewHeartbeatClient","kind":"function","span":{"start":[28,1],"end":[43,2],"bytes":[392,728]},"signature":"github.com/benbjohnson/litestream.NewHeartbeatClient","parameters":[{"name":"url","type":"string","span":{"start":[28,1],"end":[28,79],"bytes":[392,470]}},{"name":"interval","type":"time.Duration","span":{"start":[28,1],"end":[28,79],"bytes":[392,470]}}],"return_type":"*github.com/benbjohnson/litestream.HeartbeatClient","metrics":{"cyclomatic":2},"body":{}}},"content_hash":"ef90f2e79f1a8f89bd34a9cada9e3c399a410cf774b5c2b3233863dc7cbf2581"},"internal/hexdump.go":{"id":"can://litestream/litestream/go/internal/hexdump.go","kind":"module","span":{"start":[1,1],"end":[46,1],"bytes":[0,1259]},"package":"internal","source":"package internal\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n)\n\nfunc Hexdump(data []byte) string {\n\tprevRow := make([]byte, 16)\n\n\tvar buf bytes.Buffer\n\tvar dupWritten bool\n\tfor i := 0; i \u003c len(data); i += 16 {\n\t\trow := make([]byte, 16)\n\t\tcopy(row, data[i:])\n\n\t\t// Write out one line of asterisks to show that we just have duplicate rows.\n\t\tif i != 0 \u0026\u0026 i+16 \u003c len(data) \u0026\u0026 bytes.Equal(row, prevRow) {\n\t\t\tif !dupWritten {\n\t\t\t\tdupWritten = true\n\t\t\t\tfmt.Fprintln(\u0026buf, \"***\")\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Track previous row so we know when we have duplicates.\n\t\tcopy(prevRow, row)\n\t\tdupWritten = false\n\n\t\tfmt.Fprintf(\u0026buf, \"%08x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x |%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s|\\n\", i,\n\t\t\trow[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7],\n\t\t\trow[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15],\n\t\t\ttoChar(row[0]), toChar(row[1]), toChar(row[2]), toChar(row[3]), toChar(row[4]), toChar(row[5]), toChar(row[6]), toChar(row[7]),\n\t\t\ttoChar(row[8]), toChar(row[9]), toChar(row[10]), toChar(row[11]), toChar(row[12]), toChar(row[13]), toChar(row[14]), toChar(row[15]),\n\t\t)\n\t}\n\treturn buf.String()\n}\n\nfunc toChar(b byte) string {\n\tif b \u003c 32 || b \u003e 126 {\n\t\treturn \".\"\n\t}\n\treturn string(b)\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[27,35]}},{"name":"fmt","path":"fmt","span":{"start":[5,1],"end":[5,7],"bytes":[36,42]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/internal.Hexdump":{"id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump","kind":"function","span":{"start":[8,1],"end":[38,2],"bytes":[46,1168]},"signature":"github.com/benbjohnson/litestream/internal.Hexdump","parameters":[{"name":"data","type":"[]byte","span":{"start":[8,1],"end":[8,35],"bytes":[46,80]}}],"return_type":"string","metrics":{"cyclomatic":4},"body":{"13:18":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@13:18","span":{"start":[13,18],"end":[13,27],"bytes":[171,180]},"callee":null},"14:10":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@14:10","span":{"start":[14,10],"end":[14,26],"bytes":[201,217]},"callee":null},"15:3":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@15:3","span":{"start":[15,3],"end":[15,22],"bytes":[220,239]},"callee":null},"18:23":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@18:23","span":{"start":[18,23],"end":[18,32],"bytes":[342,351]},"callee":null},"18:36":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@18:36","span":{"start":[18,36],"end":[18,61],"bytes":[355,380]},"callee":"can://litestream/litestream/@external/bytes/Equal"},"21:5":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@21:5","span":{"start":[21,5],"end":[21,30],"bytes":[429,454]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"},"27:3":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@27:3","span":{"start":[27,3],"end":[27,21],"bytes":[539,557]},"callee":null},"30:3":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@30:3","span":{"start":[30,3],"end":[35,4],"bytes":[582,1142]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"},"33:100":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@33:100","span":{"start":[33,100],"end":[33,114],"bytes":[970,984]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:116":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@33:116","span":{"start":[33,116],"end":[33,130],"bytes":[986,1000]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:20":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@33:20","span":{"start":[33,20],"end":[33,34],"bytes":[890,904]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:36":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@33:36","span":{"start":[33,36],"end":[33,50],"bytes":[906,920]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:4":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@33:4","span":{"start":[33,4],"end":[33,18],"bytes":[874,888]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:52":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@33:52","span":{"start":[33,52],"end":[33,66],"bytes":[922,936]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:68":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@33:68","span":{"start":[33,68],"end":[33,82],"bytes":[938,952]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"33:84":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@33:84","span":{"start":[33,84],"end":[33,98],"bytes":[954,968]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:104":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@34:104","span":{"start":[34,104],"end":[34,119],"bytes":[1105,1120]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:121":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@34:121","span":{"start":[34,121],"end":[34,136],"bytes":[1122,1137]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:20":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@34:20","span":{"start":[34,20],"end":[34,34],"bytes":[1021,1035]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:36":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@34:36","span":{"start":[34,36],"end":[34,51],"bytes":[1037,1052]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:4":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@34:4","span":{"start":[34,4],"end":[34,18],"bytes":[1005,1019]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:53":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@34:53","span":{"start":[34,53],"end":[34,68],"bytes":[1054,1069]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:70":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@34:70","span":{"start":[34,70],"end":[34,85],"bytes":[1071,1086]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"34:87":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@34:87","span":{"start":[34,87],"end":[34,102],"bytes":[1088,1103]},"callee":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar"},"37:9":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@37:9","span":{"start":[37,9],"end":[37,21],"bytes":[1154,1166]},"callee":"can://litestream/litestream/@external/bytes/Buffer.String"},"9:13":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump@9:13","span":{"start":[9,13],"end":[9,29],"bytes":[93,109]},"callee":null}}},"github.com/benbjohnson/litestream/internal.toChar":{"id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar","kind":"function","span":{"start":[40,1],"end":[45,2],"bytes":[1170,1258]},"signature":"github.com/benbjohnson/litestream/internal.toChar","parameters":[{"name":"b","type":"byte","span":{"start":[40,1],"end":[40,29],"bytes":[1170,1198]}}],"return_type":"string","metrics":{"cyclomatic":2},"body":{"44:9":{"kind":"call","id":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar@44:9","span":{"start":[44,9],"end":[44,18],"bytes":[1247,1256]},"callee":null}}}},"content_hash":"124cc6cc77df8fbcf11b7d27687a0e2fe0edb403fd28c849424522fb3f482bf6"},"internal/internal.go":{"id":"can://litestream/litestream/go/internal/internal.go","kind":"module","span":{"start":[1,1],"end":[178,1],"bytes":[0,4815]},"package":"internal","source":"package internal\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"syscall\"\n\n\t\"github.com/pierrec/lz4/v4\"\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/promauto\"\n)\n\n// ReadCloser wraps a reader to also attach a separate closer.\ntype ReadCloser struct {\n\tr io.Reader\n\tc io.Closer\n}\n\n// NewReadCloser returns a new instance of ReadCloser.\nfunc NewReadCloser(r io.Reader, c io.Closer) *ReadCloser {\n\treturn \u0026ReadCloser{r, c}\n}\n\n// Read reads bytes into the underlying reader.\nfunc (r *ReadCloser) Read(p []byte) (n int, err error) {\n\treturn r.r.Read(p)\n}\n\n// Close closes the reader (if implementing io.ReadCloser) and the Closer.\nfunc (r *ReadCloser) Close() error {\n\tif rc, ok := r.r.(io.Closer); ok {\n\t\tif err := rc.Close(); err != nil {\n\t\t\tr.c.Close()\n\t\t\treturn err\n\t\t}\n\t}\n\treturn r.c.Close()\n}\n\n// LZ4ReadCloser wraps an LZ4 reader with the underlying source for proper closing.\ntype LZ4ReadCloser struct {\n\t*lz4.Reader\n\tunderlying io.Closer\n}\n\nfunc (r *LZ4ReadCloser) Close() error {\n\treturn r.underlying.Close()\n}\n\n// NewLZ4Reader creates an LZ4 decompressing reader that wraps the source.\n// Closing the returned reader also closes the underlying source.\nfunc NewLZ4Reader(r io.ReadCloser) io.ReadCloser {\n\treturn \u0026LZ4ReadCloser{\n\t\tReader: lz4.NewReader(r),\n\t\tunderlying: r,\n\t}\n}\n\n// ReadCounter wraps an io.Reader and counts the total number of bytes read.\ntype ReadCounter struct {\n\tr io.Reader\n\tn int64\n}\n\n// NewReadCounter returns a new instance of ReadCounter that wraps r.\nfunc NewReadCounter(r io.Reader) *ReadCounter {\n\treturn \u0026ReadCounter{r: r}\n}\n\n// Read reads from the underlying reader into p and adds the bytes read to the counter.\nfunc (r *ReadCounter) Read(p []byte) (int, error) {\n\tn, err := r.r.Read(p)\n\tr.n += int64(n)\n\treturn n, err\n}\n\n// N returns the total number of bytes read.\nfunc (r *ReadCounter) N() int64 { return r.n }\n\n// CreateFile creates the file and matches the mode \u0026 uid/gid of fi.\nfunc CreateFile(filename string, fi os.FileInfo) (*os.File, error) {\n\tmode := os.FileMode(0600)\n\tif fi != nil {\n\t\tmode = fi.Mode()\n\t}\n\n\tf, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tuid, gid := Fileinfo(fi)\n\t_ = f.Chown(uid, gid)\n\treturn f, nil\n}\n\n// MkdirAll is a copy of os.MkdirAll() except that it attempts to set the\n// mode/uid/gid to match fi for each created directory.\nfunc MkdirAll(path string, fi os.FileInfo) error {\n\tuid, gid := Fileinfo(fi)\n\n\t// Fast path: if we can tell whether path is a directory or file, stop with success or error.\n\tdir, err := os.Stat(path)\n\tif err == nil {\n\t\tif dir.IsDir() {\n\t\t\treturn nil\n\t\t}\n\t\treturn \u0026os.PathError{Op: \"mkdir\", Path: path, Err: syscall.ENOTDIR}\n\t}\n\n\t// Slow path: make sure parent exists and then call Mkdir for path.\n\ti := len(path)\n\tfor i \u003e 0 \u0026\u0026 os.IsPathSeparator(path[i-1]) { // Skip trailing path separator.\n\t\ti--\n\t}\n\n\tj := i\n\tfor j \u003e 0 \u0026\u0026 !os.IsPathSeparator(path[j-1]) { // Scan backward over element.\n\t\tj--\n\t}\n\n\tif j \u003e 1 {\n\t\t// Create parent.\n\t\terr = MkdirAll(fixRootDirectory(path[:j-1]), fi)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Parent now exists; invoke Mkdir and use its result.\n\tmode := os.FileMode(0700)\n\tif fi != nil {\n\t\tmode = fi.Mode()\n\t}\n\terr = os.Mkdir(path, mode)\n\tif err != nil {\n\t\t// Handle arguments like \"foo/.\" by\n\t\t// double-checking that directory doesn't exist.\n\t\tdir, err1 := os.Lstat(path)\n\t\tif err1 == nil \u0026\u0026 dir.IsDir() {\n\t\t\t_ = os.Chown(path, uid, gid)\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\t_ = os.Chown(path, uid, gid)\n\treturn nil\n}\n\n// Shared replica metrics.\nvar (\n\tOperationTotalCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_replica_operation_total\",\n\t\tHelp: \"The number of replica operations performed\",\n\t}, []string{\"replica_type\", \"operation\"})\n\n\tOperationBytesCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_replica_operation_bytes\",\n\t\tHelp: \"The number of bytes used by replica operations\",\n\t}, []string{\"replica_type\", \"operation\"})\n\n\tOperationDurationHistogramVec = promauto.NewHistogramVec(prometheus.HistogramOpts{\n\t\tName: \"litestream_replica_operation_duration_seconds\",\n\t\tHelp: \"Duration of replica operations by type and operation\",\n\t\tBuckets: []float64{0.01, 0.05, 0.1, 0.5, 1, 5, 10, 30, 60},\n\t}, []string{\"replica_type\", \"operation\"})\n\n\tOperationErrorCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_replica_operation_errors_total\",\n\t\tHelp: \"Number of replica operation errors by type, operation, and error code\",\n\t}, []string{\"replica_type\", \"operation\", \"code\"})\n\n\tL0RetentionGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_l0_retention_files_total\",\n\t\tHelp: \"Number of L0 files by status during retention enforcement\",\n\t}, []string{\"db\", \"status\"})\n)\n","imports":[{"name":"io","path":"io","span":{"start":[4,1],"end":[4,6],"bytes":[27,32]}},{"name":"os","path":"os","span":{"start":[5,1],"end":[5,6],"bytes":[33,38]}},{"name":"syscall","path":"syscall","span":{"start":[6,1],"end":[6,11],"bytes":[39,49]}},{"name":"v4","path":"github.com/pierrec/lz4/v4","span":{"start":[8,1],"end":[8,29],"bytes":[51,79]}},{"name":"prometheus","path":"github.com/prometheus/client_golang/prometheus","span":{"start":[9,1],"end":[9,50],"bytes":[80,129]}},{"name":"promauto","path":"github.com/prometheus/client_golang/prometheus/promauto","span":{"start":[10,1],"end":[10,59],"bytes":[130,188]}}],"types":{"LZ4ReadCloser":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser","kind":"struct","span":{"start":[41,1],"end":[44,2],"bytes":[908,972]},"base_types":["invalid type"],"callables":{"github.com/benbjohnson/litestream/internal.LZ4ReadCloser.Close":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser/github.com/benbjohnson/litestream/internal.LZ4ReadCloser.Close","kind":"method","span":{"start":[46,1],"end":[48,2],"bytes":[974,1044]},"signature":"github.com/benbjohnson/litestream/internal.LZ4ReadCloser.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"47:9":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser/github.com/benbjohnson/litestream/internal.LZ4ReadCloser.Close@47:9","span":{"start":[47,9],"end":[47,29],"bytes":[1022,1042]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}}},"fields":{"invalid type":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser/invalid type","kind":"field","type":"invalid type","span":{"start":[42,1],"end":[42,13],"bytes":[936,948]}},"underlying":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser/underlying","kind":"field","type":"io.Closer","span":{"start":[43,1],"end":[43,22],"bytes":[949,970]}}}},"ReadCloser":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser","kind":"struct","span":{"start":[14,1],"end":[17,2],"bytes":[255,307]},"callables":{"github.com/benbjohnson/litestream/internal.ReadCloser.Close":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Close","kind":"method","span":{"start":[30,1],"end":[38,2],"bytes":[655,822]},"signature":"github.com/benbjohnson/litestream/internal.ReadCloser.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"32:13":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Close@32:13","span":{"start":[32,13],"end":[32,23],"bytes":[740,750]},"callee":"can://litestream/litestream/@external/io/Closer.Close"},"33:4":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Close@33:4","span":{"start":[33,4],"end":[33,15],"bytes":[768,779]},"callee":"can://litestream/litestream/@external/io/Closer.Close"},"37:9":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Close@37:9","span":{"start":[37,9],"end":[37,20],"bytes":[809,820]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}},"github.com/benbjohnson/litestream/internal.ReadCloser.Read":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Read","kind":"method","span":{"start":[25,1],"end":[27,2],"bytes":[500,578]},"signature":"github.com/benbjohnson/litestream/internal.ReadCloser.Read","parameters":[{"name":"p","type":"[]byte","span":{"start":[25,1],"end":[25,57],"bytes":[500,556]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"26:9":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Read@26:9","span":{"start":[26,9],"end":[26,20],"bytes":[565,576]},"callee":"can://litestream/litestream/@external/io/Reader.Read"}}}},"fields":{"c":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/c","kind":"field","type":"io.Closer","span":{"start":[16,1],"end":[16,13],"bytes":[293,305]}},"r":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/r","kind":"field","type":"io.Reader","span":{"start":[15,1],"end":[15,13],"bytes":[280,292]}}}},"ReadCounter":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter","kind":"struct","span":{"start":[60,1],"end":[63,2],"bytes":[1394,1443]},"callables":{"github.com/benbjohnson/litestream/internal.ReadCounter.N":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N","kind":"method","span":{"start":[78,1],"end":[78,47],"bytes":[1836,1882]},"signature":"github.com/benbjohnson/litestream/internal.ReadCounter.N","parameters":[],"return_type":"int64","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/internal.ReadCounter.Read":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.Read","kind":"method","span":{"start":[71,1],"end":[75,2],"bytes":[1681,1789]},"signature":"github.com/benbjohnson/litestream/internal.ReadCounter.Read","parameters":[{"name":"p","type":"[]byte","span":{"start":[71,1],"end":[71,52],"bytes":[1681,1732]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"72:12":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.Read@72:12","span":{"start":[72,12],"end":[72,23],"bytes":[1744,1755]},"callee":"can://litestream/litestream/@external/io/Reader.Read"},"73:9":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.Read@73:9","span":{"start":[73,9],"end":[73,17],"bytes":[1764,1772]},"callee":null}}}},"fields":{"n":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/n","kind":"field","type":"int64","span":{"start":[62,1],"end":[62,9],"bytes":[1433,1441]}},"r":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/r","kind":"field","type":"io.Reader","span":{"start":[61,1],"end":[61,13],"bytes":[1420,1432]}}}}},"functions":{"github.com/benbjohnson/litestream/internal.CreateFile":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","kind":"function","span":{"start":[81,1],"end":[95,2],"bytes":[1953,2265]},"signature":"github.com/benbjohnson/litestream/internal.CreateFile","parameters":[{"name":"filename","type":"string","span":{"start":[81,1],"end":[81,69],"bytes":[1953,2021]}},{"name":"fi","type":"os.FileInfo","span":{"start":[81,1],"end":[81,69],"bytes":[1953,2021]}}],"return_type":"(*os.File, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"82:10":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile@82:10","span":{"start":[82,10],"end":[82,27],"bytes":[2031,2048]},"callee":null},"84:10":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile@84:10","span":{"start":[84,10],"end":[84,19],"bytes":[2074,2083]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Mode"},"87:12":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile@87:12","span":{"start":[87,12],"end":[87,73],"bytes":[2099,2160]},"callee":"can://litestream/litestream/@external/os/OpenFile"},"92:14":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile@92:14","span":{"start":[92,14],"end":[92,26],"bytes":[2213,2225]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo"},"93:6":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile@93:6","span":{"start":[93,6],"end":[93,23],"bytes":[2231,2248]},"callee":"can://litestream/litestream/@external/os/File.Chown"}}},"github.com/benbjohnson/litestream/internal.MkdirAll":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","kind":"function","span":{"start":[99,1],"end":[148,2],"bytes":[2397,3546]},"signature":"github.com/benbjohnson/litestream/internal.MkdirAll","parameters":[{"name":"path","type":"string","span":{"start":[99,1],"end":[99,51],"bytes":[2397,2447]}},{"name":"fi","type":"os.FileInfo","span":{"start":[99,1],"end":[99,51],"bytes":[2397,2447]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"100:14":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@100:14","span":{"start":[100,14],"end":[100,26],"bytes":[2461,2473]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo"},"103:14":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@103:14","span":{"start":[103,14],"end":[103,27],"bytes":[2583,2596]},"callee":"can://litestream/litestream/@external/os/Stat"},"105:6":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@105:6","span":{"start":[105,6],"end":[105,17],"bytes":[2619,2630]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir"},"112:7":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@112:7","span":{"start":[112,7],"end":[112,16],"bytes":[2800,2809]},"callee":null},"113:15":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@113:15","span":{"start":[113,15],"end":[113,44],"bytes":[2824,2853]},"callee":"can://litestream/litestream/@external/os/IsPathSeparator"},"118:16":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@118:16","span":{"start":[118,16],"end":[118,45],"bytes":[2922,2951]},"callee":"can://litestream/litestream/@external/os/IsPathSeparator"},"124:18":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@124:18","span":{"start":[124,18],"end":[124,46],"bytes":[3044,3072]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.fixRootDirectory"},"124:9":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@124:9","span":{"start":[124,9],"end":[124,51],"bytes":[3035,3077]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"131:10":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@131:10","span":{"start":[131,10],"end":[131,27],"bytes":[3183,3200]},"callee":null},"133:10":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@133:10","span":{"start":[133,10],"end":[133,19],"bytes":[3226,3235]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Mode"},"135:8":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@135:8","span":{"start":[135,8],"end":[135,28],"bytes":[3246,3266]},"callee":"can://litestream/litestream/@external/os/Mkdir"},"139:16":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@139:16","span":{"start":[139,16],"end":[139,30],"bytes":[3388,3402]},"callee":"can://litestream/litestream/@external/os/Lstat"},"140:21":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@140:21","span":{"start":[140,21],"end":[140,32],"bytes":[3423,3434]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir"},"141:8":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@141:8","span":{"start":[141,8],"end":[141,32],"bytes":[3444,3468]},"callee":"can://litestream/litestream/@external/os/Chown"},"146:6":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll@146:6","span":{"start":[146,6],"end":[146,30],"bytes":[3508,3532]},"callee":"can://litestream/litestream/@external/os/Chown"}}},"github.com/benbjohnson/litestream/internal.NewLZ4Reader":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","kind":"function","span":{"start":[52,1],"end":[57,2],"bytes":[1187,1315]},"signature":"github.com/benbjohnson/litestream/internal.NewLZ4Reader","parameters":[{"name":"r","type":"io.ReadCloser","span":{"start":[52,1],"end":[52,51],"bytes":[1187,1237]}}],"return_type":"io.ReadCloser","metrics":{"cyclomatic":1},"body":{"54:15":{"kind":"call","id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader@54:15","span":{"start":[54,15],"end":[54,31],"bytes":[1276,1292]},"callee":null}}},"github.com/benbjohnson/litestream/internal.NewReadCloser":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCloser","kind":"function","span":{"start":[20,1],"end":[22,2],"bytes":[364,450]},"signature":"github.com/benbjohnson/litestream/internal.NewReadCloser","parameters":[{"name":"r","type":"io.Reader","span":{"start":[20,1],"end":[20,59],"bytes":[364,422]}},{"name":"c","type":"io.Closer","span":{"start":[20,1],"end":[20,59],"bytes":[364,422]}}],"return_type":"*github.com/benbjohnson/litestream/internal.ReadCloser","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/internal.NewReadCounter":{"id":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","kind":"function","span":{"start":[66,1],"end":[68,2],"bytes":[1515,1591]},"signature":"github.com/benbjohnson/litestream/internal.NewReadCounter","parameters":[{"name":"r","type":"io.Reader","span":{"start":[66,1],"end":[66,48],"bytes":[1515,1562]}}],"return_type":"*github.com/benbjohnson/litestream/internal.ReadCounter","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"1dbef4f2385d3ead118aea4ee0553279841074b2fe2988a4c16fe625415de1b5"},"internal/internal_unix.go":{"id":"can://litestream/litestream/go/internal/internal_unix.go","kind":"module","span":{"start":[1,1],"end":[39,1],"bytes":[0,771]},"package":"internal","source":"//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris\n// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris\n\npackage internal\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\n// Fileinfo returns syscall fields from a FileInfo object.\nfunc Fileinfo(fi os.FileInfo) (uid, gid int) {\n\tif fi == nil {\n\t\treturn -1, -1\n\t}\n\tstat, ok := fi.Sys().(*syscall.Stat_t)\n\tif !ok {\n\t\treturn -1, -1\n\t}\n\treturn int(stat.Uid), int(stat.Gid)\n}\n\nfunc fixRootDirectory(p string) string {\n\treturn p\n}\n\n// FsyncDir syncs a directory so a preceding rename within it is durable.\nfunc FsyncDir(path string) error {\n\tdir, err := os.Open(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := dir.Sync(); err != nil {\n\t\t_ = dir.Close()\n\t\treturn err\n\t}\n\treturn dir.Close()\n}\n","imports":[{"name":"os","path":"os","span":{"start":[7,1],"end":[7,6],"bytes":[186,191]}},{"name":"syscall","path":"syscall","span":{"start":[8,1],"end":[8,11],"bytes":[192,202]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/internal.Fileinfo":{"id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","kind":"function","span":{"start":[12,1],"end":[21,2],"bytes":[265,454]},"signature":"github.com/benbjohnson/litestream/internal.Fileinfo","parameters":[{"name":"fi","type":"os.FileInfo","span":{"start":[12,1],"end":[12,47],"bytes":[265,311]}}],"return_type":"(int, int)","metrics":{"cyclomatic":3},"body":{"16:14":{"kind":"call","id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo@16:14","span":{"start":[16,14],"end":[16,22],"bytes":[360,368]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Sys"},"20:24":{"kind":"call","id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo@20:24","span":{"start":[20,24],"end":[20,37],"bytes":[439,452]},"callee":null},"20:9":{"kind":"call","id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo@20:9","span":{"start":[20,9],"end":[20,22],"bytes":[424,437]},"callee":null}}},"github.com/benbjohnson/litestream/internal.FsyncDir":{"id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","kind":"function","span":{"start":[28,1],"end":[38,2],"bytes":[584,770]},"signature":"github.com/benbjohnson/litestream/internal.FsyncDir","parameters":[{"name":"path","type":"string","span":{"start":[28,1],"end":[28,35],"bytes":[584,618]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"29:14":{"kind":"call","id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir@29:14","span":{"start":[29,14],"end":[29,27],"bytes":[632,645]},"callee":"can://litestream/litestream/@external/os/Open"},"33:12":{"kind":"call","id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir@33:12","span":{"start":[33,12],"end":[33,22],"bytes":[690,700]},"callee":"can://litestream/litestream/@external/os/File.Sync"},"34:7":{"kind":"call","id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir@34:7","span":{"start":[34,7],"end":[34,18],"bytes":[721,732]},"callee":"can://litestream/litestream/@external/os/File.Close"},"37:9":{"kind":"call","id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir@37:9","span":{"start":[37,9],"end":[37,20],"bytes":[757,768]},"callee":"can://litestream/litestream/@external/os/File.Close"}}},"github.com/benbjohnson/litestream/internal.fixRootDirectory":{"id":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.fixRootDirectory","kind":"function","span":{"start":[23,1],"end":[25,2],"bytes":[456,508]},"signature":"github.com/benbjohnson/litestream/internal.fixRootDirectory","parameters":[{"name":"p","type":"string","span":{"start":[23,1],"end":[23,41],"bytes":[456,496]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"cd90a0b1e0c7f49f8dd99c8818b37ffa3b4d7f8edf3215f0394eda7a0b6c8905"},"internal/limit_read_closer.go":{"id":"can://litestream/litestream/go/internal/limit_read_closer.go","kind":"module","span":{"start":[1,1],"end":[30,1],"bytes":[0,558]},"package":"internal","source":"package internal\n\nimport \"io\"\n\n// Copied from the io package to implement io.Closer.\nfunc LimitReadCloser(r io.ReadCloser, n int64) io.ReadCloser {\n\treturn \u0026LimitedReadCloser{r, n}\n}\n\ntype LimitedReadCloser struct {\n\tR io.ReadCloser // underlying reader\n\tN int64 // max bytes remaining\n}\n\nfunc (l *LimitedReadCloser) Close() error {\n\treturn l.R.Close()\n}\n\nfunc (l *LimitedReadCloser) Read(p []byte) (n int, err error) {\n\tif l.N \u003c= 0 {\n\t\treturn 0, io.EOF\n\t}\n\tif int64(len(p)) \u003e l.N {\n\t\tp = p[0:l.N]\n\t}\n\tn, err = l.R.Read(p)\n\tl.N -= int64(n)\n\treturn\n}\n","imports":[{"name":"io","path":"io","span":{"start":[3,1],"end":[3,12],"bytes":[18,29]}}],"types":{"LimitedReadCloser":{"id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser","kind":"struct","span":{"start":[10,1],"end":[13,2],"bytes":[184,295]},"callables":{"github.com/benbjohnson/litestream/internal.LimitedReadCloser.Close":{"id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Close","kind":"method","span":{"start":[15,1],"end":[17,2],"bytes":[297,362]},"signature":"github.com/benbjohnson/litestream/internal.LimitedReadCloser.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"16:9":{"kind":"call","id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Close@16:9","span":{"start":[16,9],"end":[16,20],"bytes":[349,360]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}},"github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read":{"id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read","kind":"method","span":{"start":[19,1],"end":[29,2],"bytes":[364,557]},"signature":"github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read","parameters":[{"name":"p","type":"[]byte","span":{"start":[19,1],"end":[19,64],"bytes":[364,427]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"23:11":{"kind":"call","id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read@23:11","span":{"start":[23,11],"end":[23,17],"bytes":[475,481]},"callee":null},"23:5":{"kind":"call","id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read@23:5","span":{"start":[23,5],"end":[23,18],"bytes":[469,482]},"callee":null},"26:11":{"kind":"call","id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read@26:11","span":{"start":[26,11],"end":[26,22],"bytes":[519,530]},"callee":"can://litestream/litestream/@external/io/Reader.Read"},"27:9":{"kind":"call","id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read@27:9","span":{"start":[27,9],"end":[27,17],"bytes":[539,547]},"callee":null}}}},"fields":{"N":{"id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/N","kind":"field","type":"int64","span":{"start":[12,1],"end":[12,40],"bytes":[254,293]}},"R":{"id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/R","kind":"field","type":"io.ReadCloser","span":{"start":[11,1],"end":[11,38],"bytes":[216,253]}}}}},"functions":{"github.com/benbjohnson/litestream/internal.LimitReadCloser":{"id":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","kind":"function","span":{"start":[6,1],"end":[8,2],"bytes":[85,182]},"signature":"github.com/benbjohnson/litestream/internal.LimitReadCloser","parameters":[{"name":"r","type":"io.ReadCloser","span":{"start":[6,1],"end":[6,63],"bytes":[85,147]}},{"name":"n","type":"int64","span":{"start":[6,1],"end":[6,63],"bytes":[85,147]}}],"return_type":"io.ReadCloser","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"c02d22d6d9369a280aca33bc4e0a77f1ee533201289cb691fc16d304732b75d7"},"internal/lock_unix.go":{"id":"can://litestream/litestream/go/internal/lock_unix.go","kind":"module","span":{"start":[1,1],"end":[51,1],"bytes":[0,1085]},"package":"internal","source":"//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris\n\npackage internal\n\nimport (\n\t\"os\"\n\n\t\"golang.org/x/sys/unix\"\n)\n\nconst (\n\tsqlitePendingByte = 0x40000000\n\tsqliteSharedFirst = sqlitePendingByte + 2\n\tsqliteSharedSize = 510\n)\n\nfunc LockFileExclusive(f *os.File) error {\n\tfd := int(f.Fd())\n\n\tif err := setFcntlLock(fd, unix.F_WRLCK, sqlitePendingByte, 1); err != nil {\n\t\treturn err\n\t}\n\n\tif err := setFcntlLock(fd, unix.F_WRLCK, sqliteSharedFirst, sqliteSharedSize); err != nil {\n\t\t_ = setFcntlLock(fd, unix.F_UNLCK, sqlitePendingByte, 1)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc UnlockFile(f *os.File) error {\n\tfd := int(f.Fd())\n\terr1 := setFcntlLock(fd, unix.F_UNLCK, sqliteSharedFirst, sqliteSharedSize)\n\terr2 := setFcntlLock(fd, unix.F_UNLCK, sqlitePendingByte, 1)\n\tif err1 != nil {\n\t\treturn err1\n\t}\n\treturn err2\n}\n\nfunc setFcntlLock(fd int, lockType int16, start int64, length int64) error {\n\tflock := unix.Flock_t{\n\t\tType: lockType,\n\t\tWhence: 0,\n\t\tStart: start,\n\t\tLen: length,\n\t}\n\treturn unix.FcntlFlock(uintptr(fd), unix.F_SETLKW, \u0026flock)\n}\n","imports":[{"name":"os","path":"os","span":{"start":[6,1],"end":[6,6],"bytes":[118,123]}},{"name":"unix","path":"golang.org/x/sys/unix","span":{"start":[8,1],"end":[8,25],"bytes":[125,149]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/internal.LockFileExclusive":{"id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive","kind":"function","span":{"start":[17,1],"end":[30,2],"bytes":[264,604]},"signature":"github.com/benbjohnson/litestream/internal.LockFileExclusive","parameters":[{"name":"f","type":"*os.File","span":{"start":[17,1],"end":[17,43],"bytes":[264,306]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"18:12":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive@18:12","span":{"start":[18,12],"end":[18,18],"bytes":[318,324]},"callee":"can://litestream/litestream/@external/os/File.Fd"},"18:8":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive@18:8","span":{"start":[18,8],"end":[18,19],"bytes":[314,325]},"callee":null},"20:12":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive@20:12","span":{"start":[20,12],"end":[20,64],"bytes":[338,390]},"callee":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"},"24:12":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive@24:12","span":{"start":[24,12],"end":[24,79],"bytes":[433,500]},"callee":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"},"25:7":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive@25:7","span":{"start":[25,7],"end":[25,59],"bytes":[521,573]},"callee":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"}}},"github.com/benbjohnson/litestream/internal.UnlockFile":{"id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile","kind":"function","span":{"start":[32,1],"end":[40,2],"bytes":[606,849]},"signature":"github.com/benbjohnson/litestream/internal.UnlockFile","parameters":[{"name":"f","type":"*os.File","span":{"start":[32,1],"end":[32,36],"bytes":[606,641]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"33:12":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile@33:12","span":{"start":[33,12],"end":[33,18],"bytes":[653,659]},"callee":"can://litestream/litestream/@external/os/File.Fd"},"33:8":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile@33:8","span":{"start":[33,8],"end":[33,19],"bytes":[649,660]},"callee":null},"34:10":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile@34:10","span":{"start":[34,10],"end":[34,77],"bytes":[670,737]},"callee":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"},"35:10":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile@35:10","span":{"start":[35,10],"end":[35,62],"bytes":[747,799]},"callee":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock"}}},"github.com/benbjohnson/litestream/internal.setFcntlLock":{"id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock","kind":"function","span":{"start":[42,1],"end":[50,2],"bytes":[851,1084]},"signature":"github.com/benbjohnson/litestream/internal.setFcntlLock","parameters":[{"name":"fd","type":"int","span":{"start":[42,1],"end":[42,77],"bytes":[851,927]}},{"name":"lockType","type":"int16","span":{"start":[42,1],"end":[42,77],"bytes":[851,927]}},{"name":"start","type":"int64","span":{"start":[42,1],"end":[42,77],"bytes":[851,927]}},{"name":"length","type":"int64","span":{"start":[42,1],"end":[42,77],"bytes":[851,927]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"49:25":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock@49:25","span":{"start":[49,25],"end":[49,36],"bytes":[1047,1058]},"callee":null},"49:9":{"kind":"call","id":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock@49:9","span":{"start":[49,9],"end":[49,60],"bytes":[1031,1082]},"callee":null}}}},"content_hash":"9d2a4e0444c4721b2c9695b88a883848ac89a7d4f28181ccc72c75ab9e76f491"},"internal/log.go":{"id":"can://litestream/litestream/go/internal/log.go","kind":"module","span":{"start":[1,1],"end":[125,1],"bytes":[0,2737]},"package":"internal","source":"package internal\n\nimport (\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path\"\n\t\"runtime/debug\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/lmittmann/tint\"\n\t\"github.com/mattn/go-isatty\"\n)\n\nvar modulePrefix string\nvar moduleLastSegment string\n\nfunc init() {\n\tif info, ok := debug.ReadBuildInfo(); ok \u0026\u0026 info.Main.Path != \"\" {\n\t\tmodulePrefix = info.Main.Path + \"/\"\n\t\tmoduleLastSegment = path.Base(info.Main.Path)\n\t}\n}\n\nconst LevelTrace = slog.LevelDebug - 4\n\n// LoggingConfig configures logging.\ntype LoggingConfig struct {\n\tLevel string `yaml:\"level\"`\n\tType string `yaml:\"type\"`\n\tStderr bool `yaml:\"stderr\"`\n\tSource bool `yaml:\"source\"`\n}\n\nfunc InitLog(w io.Writer, level, typ string, addSource bool) {\n\tlogOptions := slog.HandlerOptions{\n\t\tLevel: slog.LevelInfo,\n\t\tAddSource: addSource,\n\t\tReplaceAttr: ReplaceAttr,\n\t}\n\n\t// Read log level from environment, if available.\n\tif v := os.Getenv(\"LOG_LEVEL\"); v != \"\" {\n\t\tlevel = v\n\t}\n\n\tswitch strings.ToUpper(level) {\n\tcase \"TRACE\":\n\t\tlogOptions.Level = LevelTrace\n\tcase \"DEBUG\":\n\t\tlogOptions.Level = slog.LevelDebug\n\tcase \"INFO\":\n\t\tlogOptions.Level = slog.LevelInfo\n\tcase \"WARN\", \"WARNING\":\n\t\tlogOptions.Level = slog.LevelWarn\n\tcase \"ERROR\":\n\t\tlogOptions.Level = slog.LevelError\n\t}\n\n\tvar logHandler slog.Handler\n\tswitch typ {\n\tcase \"json\":\n\t\tlogHandler = slog.NewJSONHandler(w, \u0026logOptions)\n\tcase \"pretty\":\n\t\tnoColor := true\n\t\tif f, ok := w.(*os.File); ok {\n\t\t\tnoColor = !isatty.IsTerminal(f.Fd()) \u0026\u0026 !isatty.IsCygwinTerminal(f.Fd())\n\t\t}\n\t\tlogHandler = tint.NewHandler(w, \u0026tint.Options{\n\t\t\tLevel: logOptions.Level,\n\t\t\tAddSource: addSource,\n\t\t\tTimeFormat: time.TimeOnly,\n\t\t\tNoColor: noColor,\n\t\t\tReplaceAttr: ReplaceAttr,\n\t\t})\n\tcase \"text\", \"\":\n\t\tlogHandler = slog.NewTextHandler(w, \u0026logOptions)\n\t}\n\n\t// Set global default logger.\n\tslog.SetDefault(slog.New(logHandler))\n}\n\nfunc CleanSourcePath(src *slog.Source) {\n\tif modulePrefix == \"\" {\n\t\treturn\n\t}\n\n\tif idx := strings.Index(src.File, modulePrefix); idx \u003e= 0 {\n\t\tsrc.File = src.File[idx+len(modulePrefix):]\n\t\treturn\n\t}\n\n\tmoduleName := strings.TrimSuffix(modulePrefix, \"/\")\n\tif idx := strings.Index(src.File, moduleName+\"@\"); idx \u003e= 0 {\n\t\trest := src.File[idx+len(moduleName):]\n\t\tif slashIdx := strings.Index(rest, \"/\"); slashIdx \u003e= 0 {\n\t\t\tsrc.File = rest[slashIdx+1:]\n\t\t}\n\t\treturn\n\t}\n\n\tif moduleLastSegment != \"\" {\n\t\tsep := \"/\" + moduleLastSegment + \"/\"\n\t\tif idx := strings.LastIndex(src.File, sep); idx \u003e= 0 {\n\t\t\tsrc.File = src.File[idx+len(sep):]\n\t\t}\n\t}\n}\n\nfunc ReplaceAttr(groups []string, a slog.Attr) slog.Attr {\n\tif a.Key == slog.LevelKey \u0026\u0026 a.Value.Any() == LevelTrace {\n\t\ta.Value = slog.StringValue(\"TRACE\")\n\t}\n\n\tif a.Key == slog.SourceKey {\n\t\tif src, ok := a.Value.Any().(*slog.Source); ok {\n\t\t\tCleanSourcePath(src)\n\t\t}\n\t}\n\n\treturn a\n}\n","imports":[{"name":"io","path":"io","span":{"start":[4,1],"end":[4,6],"bytes":[27,32]}},{"name":"slog","path":"log/slog","span":{"start":[5,1],"end":[5,12],"bytes":[33,44]}},{"name":"os","path":"os","span":{"start":[6,1],"end":[6,6],"bytes":[45,50]}},{"name":"path","path":"path","span":{"start":[7,1],"end":[7,8],"bytes":[51,58]}},{"name":"debug","path":"runtime/debug","span":{"start":[8,1],"end":[8,17],"bytes":[59,75]}},{"name":"strings","path":"strings","span":{"start":[9,1],"end":[9,11],"bytes":[76,86]}},{"name":"time","path":"time","span":{"start":[10,1],"end":[10,8],"bytes":[87,94]}},{"name":"tint","path":"github.com/lmittmann/tint","span":{"start":[12,1],"end":[12,29],"bytes":[96,124]}},{"name":"go-isatty","path":"github.com/mattn/go-isatty","span":{"start":[13,1],"end":[13,30],"bytes":[125,154]}}],"types":{"LoggingConfig":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig","kind":"struct","span":{"start":[29,1],"end":[34,2],"bytes":[463,613]},"callables":{},"fields":{"Level":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig/Level","kind":"field","type":"string","span":{"start":[30,1],"end":[30,30],"bytes":[491,520]}},"Source":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig/Source","kind":"field","type":"bool","span":{"start":[33,1],"end":[33,31],"bytes":[581,611]}},"Stderr":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig/Stderr","kind":"field","type":"bool","span":{"start":[32,1],"end":[32,31],"bytes":[550,580]}},"Type":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.LoggingConfig/Type","kind":"field","type":"string","span":{"start":[31,1],"end":[31,29],"bytes":[521,549]}}}}},"functions":{"github.com/benbjohnson/litestream/internal.CleanSourcePath":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath","kind":"function","span":{"start":[85,1],"end":[110,2],"bytes":[1813,2449]},"signature":"github.com/benbjohnson/litestream/internal.CleanSourcePath","parameters":[{"name":"src","type":"*log/slog.Source","span":{"start":[85,1],"end":[85,41],"bytes":[1813,1853]}}],"metrics":{"cyclomatic":7},"body":{"106:13":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath@106:13","span":{"start":[106,13],"end":[106,45],"bytes":[2358,2390]},"callee":"can://litestream/litestream/@external/strings/LastIndex"},"107:28":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath@107:28","span":{"start":[107,28],"end":[107,36],"bytes":[2430,2438]},"callee":null},"90:12":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath@90:12","span":{"start":[90,12],"end":[90,49],"bytes":[1903,1940]},"callee":"can://litestream/litestream/@external/strings/Index"},"91:27":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath@91:27","span":{"start":[91,27],"end":[91,44],"bytes":[1979,1996]},"callee":null},"95:16":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath@95:16","span":{"start":[95,16],"end":[95,53],"bytes":[2027,2064]},"callee":"can://litestream/litestream/@external/strings/TrimSuffix"},"96:12":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath@96:12","span":{"start":[96,12],"end":[96,51],"bytes":[2076,2115]},"callee":"can://litestream/litestream/@external/strings/Index"},"97:24":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath@97:24","span":{"start":[97,24],"end":[97,39],"bytes":[2151,2166]},"callee":null},"98:18":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath@98:18","span":{"start":[98,18],"end":[98,42],"bytes":[2186,2210]},"callee":"can://litestream/litestream/@external/strings/Index"}}},"github.com/benbjohnson/litestream/internal.InitLog":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","kind":"function","span":{"start":[36,1],"end":[83,2],"bytes":[615,1811]},"signature":"github.com/benbjohnson/litestream/internal.InitLog","parameters":[{"name":"w","type":"io.Writer","span":{"start":[36,1],"end":[36,63],"bytes":[615,677]}},{"name":"level","type":"string","span":{"start":[36,1],"end":[36,63],"bytes":[615,677]}},{"name":"typ","type":"string","span":{"start":[36,1],"end":[36,63],"bytes":[615,677]}},{"name":"addSource","type":"bool","span":{"start":[36,1],"end":[36,63],"bytes":[615,677]}}],"metrics":{"cyclomatic":13},"body":{"44:10":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@44:10","span":{"start":[44,10],"end":[44,32],"bytes":[863,885]},"callee":"can://litestream/litestream/@external/os/Getenv"},"48:9":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@48:9","span":{"start":[48,9],"end":[48,31],"bytes":[921,943]},"callee":"can://litestream/litestream/@external/strings/ToUpper"},"64:16":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@64:16","span":{"start":[64,16],"end":[64,51],"bytes":[1284,1319]},"callee":"can://litestream/litestream/@external/log/slog/NewJSONHandler"},"68:15":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@68:15","span":{"start":[68,15],"end":[68,40],"bytes":[1401,1426]},"callee":null},"68:33":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@68:33","span":{"start":[68,33],"end":[68,39],"bytes":[1419,1425]},"callee":"can://litestream/litestream/@external/os/File.Fd"},"68:45":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@68:45","span":{"start":[68,45],"end":[68,76],"bytes":[1431,1462]},"callee":null},"68:69":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@68:69","span":{"start":[68,69],"end":[68,75],"bytes":[1455,1461]},"callee":"can://litestream/litestream/@external/os/File.Fd"},"70:16":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@70:16","span":{"start":[70,16],"end":[76,5],"bytes":[1482,1666]},"callee":null},"78:16":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@78:16","span":{"start":[78,16],"end":[78,51],"bytes":[1700,1735]},"callee":"can://litestream/litestream/@external/log/slog/NewTextHandler"},"82:18":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@82:18","span":{"start":[82,18],"end":[82,38],"bytes":[1788,1808]},"callee":"can://litestream/litestream/@external/log/slog/New"},"82:2":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog@82:2","span":{"start":[82,2],"end":[82,39],"bytes":[1772,1809]},"callee":"can://litestream/litestream/@external/log/slog/SetDefault"}}},"github.com/benbjohnson/litestream/internal.ReplaceAttr":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr","kind":"function","span":{"start":[112,1],"end":[124,2],"bytes":[2451,2736]},"signature":"github.com/benbjohnson/litestream/internal.ReplaceAttr","parameters":[{"name":"groups","type":"[]string","span":{"start":[112,1],"end":[112,59],"bytes":[2451,2509]}},{"name":"a","type":"log/slog.Attr","span":{"start":[112,1],"end":[112,59],"bytes":[2451,2509]}}],"return_type":"log/slog.Attr","metrics":{"cyclomatic":4},"body":{"113:31":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr@113:31","span":{"start":[113,31],"end":[113,44],"bytes":[2540,2553]},"callee":"can://litestream/litestream/@external/log/slog/Value.Any"},"114:13":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr@114:13","span":{"start":[114,13],"end":[114,38],"bytes":[2582,2607]},"callee":"can://litestream/litestream/@external/log/slog/StringValue"},"118:17":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr@118:17","span":{"start":[118,17],"end":[118,30],"bytes":[2658,2671]},"callee":"can://litestream/litestream/@external/log/slog/Value.Any"},"119:4":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr@119:4","span":{"start":[119,4],"end":[119,24],"bytes":[2696,2716]},"callee":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath"}}},"github.com/benbjohnson/litestream/internal.init":{"id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.init","kind":"function","span":{"start":[19,1],"end":[24,2],"bytes":[212,384]},"signature":"github.com/benbjohnson/litestream/internal.init","parameters":[],"metrics":{"cyclomatic":2},"body":{"20:17":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.init@20:17","span":{"start":[20,17],"end":[20,38],"bytes":[242,263]},"callee":"can://litestream/litestream/@external/runtime/debug/ReadBuildInfo"},"22:23":{"kind":"call","id":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.init@22:23","span":{"start":[22,23],"end":[22,48],"bytes":[354,379]},"callee":"can://litestream/litestream/@external/path/Base"}}}},"content_hash":"c9c5547d3de71f196df17f3249b69dfca8c99670203b2b6ef1b287535b67e95a"},"internal/resumable_reader.go":{"id":"can://litestream/litestream/go/internal/resumable_reader.go","kind":"module","span":{"start":[1,1],"end":[311,1],"bytes":[0,10457]},"package":"internal","source":"package internal\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/superfly/ltx\"\n)\n\ntype LTXFileOpener interface {\n\tOpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error)\n}\n\n// resumableReader wraps an io.ReadCloser from a remote storage backend with\n// automatic reconnection on read errors.\n//\n// During restore, the LTX compactor opens all LTX file streams upfront, then\n// processes pages in page-number order. Incremental LTX files that only contain\n// high-numbered pages may have their S3/storage streams sit idle for minutes\n// while the compactor works through lower-numbered pages from the snapshot.\n// Storage providers (S3, Tigris, etc.) may close these idle connections,\n// causing \"unexpected EOF\" errors.\n//\n// This reader detects two failure modes:\n// 1. Non-EOF errors (connection reset, timeout) - the stream broke mid-transfer.\n// 2. Premature EOF - the server closed the connection cleanly, but we haven't\n// read all bytes yet (detected by comparing offset against known file size).\n//\n// On failure, it closes the dead stream and reopens from the current byte\n// offset using the storage backend's range request support (the offset parameter\n// of OpenLTXFile). Callers like io.ReadFull see a seamless byte stream because\n// partial reads are returned without error, prompting the caller to request\n// remaining bytes on the next Read call.\ntype ResumableReader struct {\n\tctx context.Context\n\tclient LTXFileOpener\n\tlevel int\n\tminTXID ltx.TXID\n\tmaxTXID ltx.TXID\n\tsize int64 // expected total file size from FileInfo; 0 means unknown\n\toffset int64\n\tretryN int\n\terr error\n\tlogger *slog.Logger\n\n\t// mu guards rc and closed. Close may be called from a different goroutine\n\t// than Read: Compactor.Compact closes its source readers when it returns\n\t// while its compaction goroutine may still be reading them. Once closed is\n\t// set, Read must not reopen the stream or it would leak the new connection.\n\tmu sync.Mutex\n\trc io.ReadCloser\n\tcancel context.CancelFunc\n\tclosed bool\n}\n\n// NewResumableReader creates a ResumableReader. Primarily exposed for testing.\nfunc NewResumableReader(ctx context.Context, client LTXFileOpener, level int, minTXID, maxTXID ltx.TXID, size int64, rc io.ReadCloser, logger *slog.Logger) *ResumableReader {\n\treturn \u0026ResumableReader{\n\t\tctx: ctx,\n\t\tclient: client,\n\t\tlevel: level,\n\t\tminTXID: minTXID,\n\t\tmaxTXID: maxTXID,\n\t\tsize: size,\n\t\trc: rc,\n\t\tlogger: logger,\n\t}\n}\n\nconst resumableReaderMaxRetries = 3\n\n// resumableReaderBackoff is the base delay between retry attempts, doubling\n// per attempt. Zero-delay retries land every attempt inside the same provider\n// throttle window (e.g. Tigris 408 load shedding), guaranteeing exhaustion.\nconst resumableReaderBackoff = 250 * time.Millisecond\n\n// resumableReaderStallTimeout bounds a single Read of an open stream. Nothing\n// else does: the S3 client sets no ResponseHeaderTimeout and no read deadline on\n// the response body, and TCP keepalive does not fire against a peer that is\n// alive but simply sending nothing. It is a var rather than a const only so\n// tests can shorten it.\nvar resumableReaderStallTimeout = 30 * time.Second\n\n// ErrReadStalled reports a read that produced nothing for\n// resumableReaderStallTimeout and had its stream cancelled to force a reconnect.\nvar ErrReadStalled = errors.New(\"ltx stream read stalled\")\n\nfunc (r *ResumableReader) Read(p []byte) (int, error) {\n\tfor {\n\t\trc, cancel, err := r.stream()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tif r.err != nil {\n\t\t\treturn 0, r.err\n\t\t}\n\n\t\t// Reopen the stream from the current offset if the previous\n\t\t// connection was closed (the stream is nil after a retry).\n\t\tif rc == nil {\n\t\t\tstreamCtx, streamCancel := context.WithCancel(r.ctx)\n\t\t\tnewRC, err := r.client.OpenLTXFile(streamCtx, r.level, r.minTXID, r.maxTXID, r.offset, 0)\n\t\t\tif err != nil {\n\t\t\t\tstreamCancel()\n\t\t\t\tif errors.Is(err, os.ErrNotExist) || errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {\n\t\t\t\t\treturn 0, fmt.Errorf(\"reopen ltx file at offset %d: %w\", r.offset, err)\n\t\t\t\t}\n\t\t\t\tif ctxErr := r.ctx.Err(); ctxErr != nil {\n\t\t\t\t\tr.err = fmt.Errorf(\"reopen ltx file at offset %d: %v: %w\", r.offset, err, ctxErr)\n\t\t\t\t\treturn 0, r.err\n\t\t\t\t}\n\t\t\t\tif retryErr := r.retry(fmt.Errorf(\"reopen ltx file at offset %d: %w\", r.offset, err)); retryErr != nil {\n\t\t\t\t\treturn 0, retryErr\n\t\t\t\t}\n\t\t\t\tr.logger.Debug(\"reopen ltx file failed, retrying\",\n\t\t\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\t\t\"offset\", r.offset, \"error\", err, \"attempt\", r.retryN)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif !r.setStream(newRC, streamCancel) {\n\t\t\t\t// Closed while the stream was being reopened.\n\t\t\t\tstreamCancel()\n\t\t\t\t_ = newRC.Close()\n\t\t\t\treturn 0, os.ErrClosed\n\t\t\t}\n\t\t\trc, cancel = newRC, streamCancel\n\t\t}\n\n\t\tn, err := r.readStream(rc, cancel, p)\n\t\tr.offset += int64(n)\n\n\t\tif err == nil {\n\t\t\tif n \u003e 0 \u0026\u0026 n == len(p) {\n\t\t\t\tr.retryN = 0\n\t\t\t}\n\t\t\treturn n, nil\n\t\t}\n\n\t\tif err == io.EOF {\n\t\t\t// Distinguish legitimate EOF (fully read) from premature EOF\n\t\t\t// (server closed idle connection). When the file size is known\n\t\t\t// and we haven't read it all, treat as a connection drop.\n\t\t\tif r.size \u003e 0 \u0026\u0026 r.offset \u003c r.size {\n\t\t\t\tr.logger.Debug(\"premature EOF on ltx file, reconnecting\",\n\t\t\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\t\t\"offset\", r.offset, \"size\", r.size, \"attempt\", r.retryN+1)\n\t\t\t\tr.dropStream()\n\t\t\t\tif retryErr := r.retry(io.ErrUnexpectedEOF); retryErr != nil {\n\t\t\t\t\treturn n, retryErr\n\t\t\t\t}\n\t\t\t\tif n \u003e 0 {\n\t\t\t\t\t// Return the bytes we did get. The caller (e.g. io.ReadFull)\n\t\t\t\t\t// will call Read again, which will trigger the reopen above.\n\t\t\t\t\treturn n, nil\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn n, io.EOF\n\t\t}\n\n\t\t// Non-EOF error (connection reset, timeout, etc.). Close the dead\n\t\t// stream so the next iteration reopens from the current offset.\n\t\tr.logger.Debug(\"read error on ltx file, reconnecting\",\n\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\"error\", err, \"offset\", r.offset, \"attempt\", r.retryN+1)\n\t\tr.dropStream()\n\t\tif retryErr := r.retry(err); retryErr != nil {\n\t\t\treturn n, retryErr\n\t\t}\n\t\tif n \u003e 0 {\n\t\t\treturn n, nil\n\t\t}\n\t}\n}\n\n// readStream reads from the current stream under a stall timeout. A read that\n// produces nothing before the timeout expires has its stream's request context\n// cancelled, which unblocks the read with an error and sends the caller down the\n// reconnect path that already handles a dropped connection.\n//\n// Cancellation rather than Close: net/http's (*body).Read holds the body mutex\n// for the duration of the network read and (*body).Close wants that same mutex,\n// so a watchdog calling Close would queue behind the very read it is trying to\n// interrupt. Only the request context reaches a parked read.\nfunc (r *ResumableReader) readStream(rc io.ReadCloser, cancel context.CancelFunc, p []byte) (int, error) {\n\t// Captured per stream: by the time the timer fires, r.cancel may already\n\t// belong to a healthy replacement, and cancelling that one would be a\n\t// self-inflicted drop.\n\ttimeout, offset := resumableReaderStallTimeout, r.offset\n\tif cancel == nil || timeout \u003c= 0 {\n\t\treturn rc.Read(p)\n\t}\n\n\tvar stalled atomic.Bool\n\ttimer := time.AfterFunc(timeout, func() {\n\t\tstalled.Store(true)\n\t\tr.logger.Debug(\"ltx file read stalled, cancelling stream\",\n\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\"offset\", offset, \"timeout\", timeout)\n\t\tcancel()\n\t})\n\tdefer timer.Stop()\n\n\tn, err := rc.Read(p)\n\tif err != nil \u0026\u0026 stalled.Load() {\n\t\t// %v, not %w: the underlying error is context.Canceled, and a stall is\n\t\t// retryable where a cancelled parent context is terminal. Letting\n\t\t// context.Canceled into the chain invites an errors.Is check above to\n\t\t// abandon a restore that only needed to reconnect.\n\t\terr = fmt.Errorf(\"%w after %s: %v\", ErrReadStalled, timeout, err)\n\t}\n\treturn n, err\n}\n\n// Close closes the current underlying stream, if any, and marks the reader as\n// closed. Closing is permanent: subsequent reads fail with os.ErrClosed rather\n// than reopening the remote stream, which would leak the new connection.\nfunc (r *ResumableReader) Close() error {\n\tr.mu.Lock()\n\tif r.closed {\n\t\tr.mu.Unlock()\n\t\treturn nil\n\t}\n\tr.closed = true\n\trc, cancel := r.rc, r.cancel\n\tr.rc, r.cancel = nil, nil\n\tr.mu.Unlock()\n\n\tif cancel != nil {\n\t\tcancel()\n\t}\n\tif rc != nil {\n\t\treturn rc.Close()\n\t}\n\treturn nil\n}\n\n// stream returns the current underlying stream, or nil if the next read should\n// reopen it. Returns os.ErrClosed if the reader has been closed.\nfunc (r *ResumableReader) stream() (io.ReadCloser, context.CancelFunc, error) {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tif r.closed {\n\t\treturn nil, nil, os.ErrClosed\n\t}\n\treturn r.rc, r.cancel, nil\n}\n\n// setStream installs a newly reopened stream. It reports false if the reader\n// was closed while the stream was being opened, in which case the caller must\n// close the new stream itself.\nfunc (r *ResumableReader) setStream(rc io.ReadCloser, cancel context.CancelFunc) bool {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tif r.closed {\n\t\treturn false\n\t}\n\tr.rc, r.cancel = rc, cancel\n\treturn true\n}\n\n// dropStream closes and clears the current stream after a read failure so the\n// next read reopens from the current offset. The stream is already being\n// discarded, so a close error should not stop recovery. Log it only to aid\n// debugging.\nfunc (r *ResumableReader) dropStream() {\n\tr.mu.Lock()\n\trc, cancel := r.rc, r.cancel\n\tr.rc, r.cancel = nil, nil\n\tr.mu.Unlock()\n\n\tif cancel != nil {\n\t\tcancel()\n\t}\n\tif rc == nil {\n\t\treturn\n\t}\n\tif err := rc.Close(); err != nil {\n\t\tr.logger.Debug(\"close ltx file\",\n\t\t\t\"level\", r.level, \"min\", r.minTXID, \"max\", r.maxTXID,\n\t\t\t\"offset\", r.offset, \"error\", err)\n\t}\n}\n\nfunc (r *ResumableReader) retry(err error) error {\n\tr.retryN++\n\tif r.retryN \u003e resumableReaderMaxRetries {\n\t\tr.err = fmt.Errorf(\"max retries exceeded reading ltx file (level=%d, min=%s, max=%s, offset=%d): %w\",\n\t\t\tr.level, r.minTXID, r.maxTXID, r.offset, err)\n\t\treturn r.err\n\t}\n\n\t// Wait before the caller reopens. Retrying with no delay lands every\n\t// attempt inside the same provider throttle window, so the attempts are\n\t// spent without the provider ever getting a chance to recover.\n\tselect {\n\tcase \u003c-r.ctx.Done():\n\t\tr.err = r.ctx.Err()\n\t\treturn r.err\n\tcase \u003c-time.After(resumableReaderBackoff \u003c\u003c (r.retryN - 1)):\n\t}\n\treturn nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[27,37]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[38,47]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[48,54]}},{"name":"io","path":"io","span":{"start":[7,1],"end":[7,6],"bytes":[55,60]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[61,72]}},{"name":"os","path":"os","span":{"start":[9,1],"end":[9,6],"bytes":[73,78]}},{"name":"sync","path":"sync","span":{"start":[10,1],"end":[10,8],"bytes":[79,86]}},{"name":"atomic","path":"sync/atomic","span":{"start":[11,1],"end":[11,15],"bytes":[87,101]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[102,109]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[14,1],"end":[14,27],"bytes":[111,137]}}],"types":{"LTXFileOpener":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.LTXFileOpener","kind":"interface","span":{"start":[17,1],"end":[19,2],"bytes":[141,288]},"callables":{"github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.LTXFileOpener/github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile","kind":"method","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]},"signature":"github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"level","type":"int","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"minTXID","type":"invalid type","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"maxTXID","type":"invalid type","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"offset","type":"int64","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}},{"name":"size","type":"int64","span":{"start":[18,1],"end":[18,115],"bytes":[172,286]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"body":{}}}},"ResumableReader":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader","kind":"struct","span":{"start":[41,1],"end":[61,2],"bytes":[1485,2140]},"callables":{"github.com/benbjohnson/litestream/internal.ResumableReader.Close":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close","kind":"method","span":{"start":[225,1],"end":[243,2],"bytes":[8208,8486]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"226:2":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close@226:2","span":{"start":[226,2],"end":[226,13],"bytes":[8251,8262]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"228:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close@228:3","span":{"start":[228,3],"end":[228,16],"bytes":[8280,8293]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"234:2":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close@234:2","span":{"start":[234,2],"end":[234,15],"bytes":[8385,8398]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"237:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close@237:3","span":{"start":[237,3],"end":[237,11],"bytes":[8422,8430]},"callee":null},"240:10":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close@240:10","span":{"start":[240,10],"end":[240,20],"bytes":[8459,8469]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}},"github.com/benbjohnson/litestream/internal.ResumableReader.Read":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","kind":"method","span":{"start":[95,1],"end":[181,2],"bytes":[3491,6267]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.Read","parameters":[{"name":"p","type":"[]byte","span":{"start":[95,1],"end":[95,56],"bytes":[3491,3546]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":18},"body":{"108:31":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@108:31","span":{"start":[108,31],"end":[108,56],"bytes":[3841,3866]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"109:18":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@109:18","span":{"start":[109,18],"end":[109,93],"bytes":[3884,3959]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.LTXFileOpener/github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile"},"111:5":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@111:5","span":{"start":[111,5],"end":[111,19],"bytes":[3983,3997]},"callee":null},"112:42":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@112:42","span":{"start":[112,42],"end":[112,74],"bytes":[4039,4071]},"callee":"can://litestream/litestream/@external/errors/Is"},"112:78":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@112:78","span":{"start":[112,78],"end":[112,118],"bytes":[4075,4115]},"callee":"can://litestream/litestream/@external/errors/Is"},"112:8":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@112:8","span":{"start":[112,8],"end":[112,38],"bytes":[4005,4035]},"callee":"can://litestream/litestream/@external/errors/Is"},"113:16":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@113:16","span":{"start":[113,16],"end":[113,77],"bytes":[4133,4194]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"115:18":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@115:18","span":{"start":[115,18],"end":[115,29],"bytes":[4218,4229]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"116:14":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@116:14","span":{"start":[116,14],"end":[116,87],"bytes":[4260,4333]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"119:20":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@119:20","span":{"start":[119,20],"end":[119,90],"bytes":[4380,4450]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry"},"119:28":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@119:28","span":{"start":[119,28],"end":[119,89],"bytes":[4388,4449]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"122:5":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@122:5","span":{"start":[122,5],"end":[124,60],"bytes":[4504,4673]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"127:8":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@127:8","span":{"start":[127,8],"end":[127,40],"bytes":[4699,4731]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream"},"129:5":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@129:5","span":{"start":[129,5],"end":[129,19],"bytes":[4789,4803]},"callee":null},"130:9":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@130:9","span":{"start":[130,9],"end":[130,22],"bytes":[4812,4825]},"callee":"can://litestream/litestream/@external/io/Closer.Close"},"136:13":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@136:13","span":{"start":[136,13],"end":[136,40],"bytes":[4911,4938]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream"},"137:15":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@137:15","span":{"start":[137,15],"end":[137,23],"bytes":[4953,4961]},"callee":null},"140:21":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@140:21","span":{"start":[140,21],"end":[140,27],"bytes":[5001,5007]},"callee":null},"151:5":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@151:5","span":{"start":[151,5],"end":[153,64],"bytes":[5313,5493]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"154:5":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@154:5","span":{"start":[154,5],"end":[154,19],"bytes":[5498,5512]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream"},"155:20":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@155:20","span":{"start":[155,20],"end":[155,48],"bytes":[5532,5560]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry"},"170:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@170:3","span":{"start":[170,3],"end":[172,60],"bytes":[5965,6136]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"173:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@173:3","span":{"start":[173,3],"end":[173,17],"bytes":[6139,6153]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream"},"174:18":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@174:18","span":{"start":[174,18],"end":[174,30],"bytes":[6171,6183]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry"},"97:22":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read@97:22","span":{"start":[97,22],"end":[97,32],"bytes":[3575,3585]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream"}}},"github.com/benbjohnson/litestream/internal.ResumableReader.dropStream":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","kind":"method","span":{"start":[273,1],"end":[290,2],"bytes":[9461,9819]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","parameters":[],"metrics":{"cyclomatic":4},"body":{"274:2":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream@274:2","span":{"start":[274,2],"end":[274,13],"bytes":[9503,9514]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"277:2":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream@277:2","span":{"start":[277,2],"end":[277,15],"bytes":[9573,9586]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"280:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream@280:3","span":{"start":[280,3],"end":[280,11],"bytes":[9610,9618]},"callee":null},"285:12":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream@285:12","span":{"start":[285,12],"end":[285,22],"bytes":[9661,9671]},"callee":"can://litestream/litestream/@external/io/Closer.Close"},"286:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream@286:3","span":{"start":[286,3],"end":[288,37],"bytes":[9688,9814]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"}}},"github.com/benbjohnson/litestream/internal.ResumableReader.readStream":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","kind":"method","span":{"start":[192,1],"end":[220,2],"bytes":[6877,7973]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.readStream","parameters":[{"name":"rc","type":"io.ReadCloser","span":{"start":[192,1],"end":[192,107],"bytes":[6877,6983]}},{"name":"cancel","type":"context.CancelFunc","span":{"start":[192,1],"end":[192,107],"bytes":[6877,6983]}},{"name":"p","type":"[]byte","span":{"start":[192,1],"end":[192,107],"bytes":[6877,6983]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"198:10":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream@198:10","span":{"start":[198,10],"end":[198,20],"bytes":[7259,7269]},"callee":"can://litestream/litestream/@external/io/Reader.Read"},"202:11":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream@202:11","span":{"start":[202,11],"end":[208,4],"bytes":[7309,7537]},"callee":"can://litestream/litestream/@external/time/AfterFunc"},"209:8":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream@209:8","span":{"start":[209,8],"end":[209,20],"bytes":[7545,7557]},"callee":"can://litestream/litestream/@external/time/Timer.Stop","is_deferred":true},"211:12":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream@211:12","span":{"start":[211,12],"end":[211,22],"bytes":[7570,7580]},"callee":"can://litestream/litestream/@external/io/Reader.Read"},"212:19":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream@212:19","span":{"start":[212,19],"end":[212,33],"bytes":[7599,7613]},"callee":"can://litestream/litestream/@external/sync/atomic/Bool.Load"},"217:9":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream@217:9","span":{"start":[217,9],"end":[217,68],"bytes":[7894,7953]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream/github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1","kind":"function","span":{"start":[202,1],"end":[208,4],"bytes":[7299,7537]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1","parameters":[],"body":{"203:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream/github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1@203:3","span":{"start":[203,3],"end":[203,22],"bytes":[7344,7363]},"callee":"can://litestream/litestream/@external/sync/atomic/Bool.Store"},"204:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream/github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1@204:3","span":{"start":[204,3],"end":[206,41],"bytes":[7366,7522]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"207:3":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream/github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1@207:3","span":{"start":[207,3],"end":[207,11],"bytes":[7525,7533]},"callee":null}}}}},"github.com/benbjohnson/litestream/internal.ResumableReader.retry":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry","kind":"method","span":{"start":[292,1],"end":[310,2],"bytes":[9821,10456]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.retry","parameters":[{"name":"err","type":"error","span":{"start":[292,1],"end":[292,51],"bytes":[9821,9871]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"295:11":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry@295:11","span":{"start":[295,11],"end":[296,49],"bytes":[9937,10079]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"304:9":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry@304:9","span":{"start":[304,9],"end":[304,21],"bytes":[10327,10339]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"305:11":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry@305:11","span":{"start":[305,11],"end":[305,22],"bytes":[10351,10362]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"307:9":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry@307:9","span":{"start":[307,9],"end":[307,61],"bytes":[10386,10438]},"callee":"can://litestream/litestream/@external/time/After"}}},"github.com/benbjohnson/litestream/internal.ResumableReader.setStream":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream","kind":"method","span":{"start":[259,1],"end":[267,2],"bytes":[9018,9216]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.setStream","parameters":[{"name":"rc","type":"io.ReadCloser","span":{"start":[259,1],"end":[259,88],"bytes":[9018,9105]}},{"name":"cancel","type":"context.CancelFunc","span":{"start":[259,1],"end":[259,88],"bytes":[9018,9105]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"260:2":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream@260:2","span":{"start":[260,2],"end":[260,13],"bytes":[9107,9118]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"261:8":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream@261:8","span":{"start":[261,8],"end":[261,21],"bytes":[9126,9139]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream/internal.ResumableReader.stream":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream","kind":"method","span":{"start":[247,1],"end":[254,2],"bytes":[8634,8827]},"signature":"github.com/benbjohnson/litestream/internal.ResumableReader.stream","parameters":[],"return_type":"(io.ReadCloser, context.CancelFunc, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"248:2":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream@248:2","span":{"start":[248,2],"end":[248,13],"bytes":[8715,8726]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"249:8":{"kind":"call","id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream@249:8","span":{"start":[249,8],"end":[249,21],"bytes":[8734,8747]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}}},"fields":{"cancel":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[59,1],"end":[59,27],"bytes":[2099,2125]}},"client":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/client","kind":"field","type":"github.com/benbjohnson/litestream/internal.LTXFileOpener","span":{"start":[43,1],"end":[43,23],"bytes":[1540,1562]}},"closed":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/closed","kind":"field","type":"bool","span":{"start":[60,1],"end":[60,13],"bytes":[2126,2138]}},"ctx":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/ctx","kind":"field","type":"context.Context","span":{"start":[42,1],"end":[42,25],"bytes":[1515,1539]}},"err":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/err","kind":"field","type":"error","span":{"start":[50,1],"end":[50,15],"bytes":[1714,1728]}},"level":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/level","kind":"field","type":"int","span":{"start":[44,1],"end":[44,13],"bytes":[1563,1575]}},"logger":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[51,1],"end":[51,22],"bytes":[1729,1750]}},"maxTXID":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/maxTXID","kind":"field","type":"invalid type","span":{"start":[46,1],"end":[46,18],"bytes":[1594,1611]}},"minTXID":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/minTXID","kind":"field","type":"invalid type","span":{"start":[45,1],"end":[45,18],"bytes":[1576,1593]}},"mu":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/mu","kind":"field","type":"sync.Mutex","span":{"start":[57,1],"end":[57,19],"bytes":[2058,2076]}},"offset":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/offset","kind":"field","type":"int64","span":{"start":[48,1],"end":[48,15],"bytes":[1686,1700]}},"rc":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/rc","kind":"field","type":"io.ReadCloser","span":{"start":[58,1],"end":[58,22],"bytes":[2077,2098]}},"retryN":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/retryN","kind":"field","type":"int","span":{"start":[49,1],"end":[49,13],"bytes":[1701,1713]}},"size":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/size","kind":"field","type":"int64","span":{"start":[47,1],"end":[47,74],"bytes":[1612,1685]}}}}},"functions":{"github.com/benbjohnson/litestream/internal.NewResumableReader":{"id":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader","kind":"function","span":{"start":[64,1],"end":[75,2],"bytes":[2222,2571]},"signature":"github.com/benbjohnson/litestream/internal.NewResumableReader","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"client","type":"github.com/benbjohnson/litestream/internal.LTXFileOpener","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"level","type":"int","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"minTXID","type":"invalid type","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"maxTXID","type":"invalid type","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"size","type":"int64","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"rc","type":"io.ReadCloser","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[64,1],"end":[64,175],"bytes":[2222,2396]}}],"return_type":"*github.com/benbjohnson/litestream/internal.ResumableReader","metrics":{"cyclomatic":1},"body":{}}},"content_hash":"fa33ef78e5f66fb580013297d9d6f83b89578cdc31f5c6f77ab5322525ad28aa"},"internal/testingutil/testingutil.go":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go","kind":"module","span":{"start":[1,1],"end":[525,1],"bytes":[0,16630]},"package":"testingutil","source":"package testingutil\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"math/rand/v2\"\n\t\"net\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\tsftpserver \"github.com/pkg/sftp\"\n\t\"golang.org/x/crypto/ssh\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/abs\"\n\t\"github.com/benbjohnson/litestream/file\"\n\t\"github.com/benbjohnson/litestream/gs\"\n\t\"github.com/benbjohnson/litestream/internal\"\n\t\"github.com/benbjohnson/litestream/nats\"\n\t\"github.com/benbjohnson/litestream/oss\"\n\t\"github.com/benbjohnson/litestream/s3\"\n\t\"github.com/benbjohnson/litestream/sftp\"\n\t\"github.com/benbjohnson/litestream/webdav\"\n)\n\nconst (\n\tdefaultTigrisEndpoint = \"https://fly.storage.tigris.dev\"\n\tdefaultTigrisRegion = \"auto\"\n\tdefaultTigrisBucket = \"litestream-dev\"\n\tdefaultTigrisPathRoot = \"integration-tests\"\n)\n\nvar (\n\t// Enables integration tests.\n\tintegration = flag.Bool(\"integration\", false, \"\")\n\t// Enables specific types of replicas to be tested.\n\treplicaClientTypes = flag.String(\"replica-clients\", \"file\", \"\")\n\t// Sets the log level for the tests.\n\tlogLevel = flag.String(\"log.level\", \"debug\", \"\")\n)\n\n// S3 settings\nvar (\n\t// Replica client settings\n\ts3AccessKeyID = flag.String(\"s3-access-key-id\", os.Getenv(\"LITESTREAM_S3_ACCESS_KEY_ID\"), \"\")\n\ts3SecretAccessKey = flag.String(\"s3-secret-access-key\", os.Getenv(\"LITESTREAM_S3_SECRET_ACCESS_KEY\"), \"\")\n\ts3Region = flag.String(\"s3-region\", os.Getenv(\"LITESTREAM_S3_REGION\"), \"\")\n\ts3Bucket = flag.String(\"s3-bucket\", os.Getenv(\"LITESTREAM_S3_BUCKET\"), \"\")\n\ts3Path = flag.String(\"s3-path\", os.Getenv(\"LITESTREAM_S3_PATH\"), \"\")\n\ts3Endpoint = flag.String(\"s3-endpoint\", os.Getenv(\"LITESTREAM_S3_ENDPOINT\"), \"\")\n\ts3ForcePathStyle = flag.Bool(\"s3-force-path-style\", os.Getenv(\"LITESTREAM_S3_FORCE_PATH_STYLE\") == \"true\", \"\")\n\ts3SkipVerify = flag.Bool(\"s3-skip-verify\", os.Getenv(\"LITESTREAM_S3_SKIP_VERIFY\") == \"true\", \"\")\n)\n\n// Tigris settings (S3-compatible)\nvar (\n\ttigrisAccessKeyID = flag.String(\"tigris-access-key-id\", os.Getenv(\"LITESTREAM_TIGRIS_ACCESS_KEY_ID\"), \"\")\n\ttigrisSecretAccessKey = flag.String(\"tigris-secret-access-key\", os.Getenv(\"LITESTREAM_TIGRIS_SECRET_ACCESS_KEY\"), \"\")\n)\n\n// Cloudflare R2 settings (S3-compatible)\nvar (\n\tr2AccessKeyID = flag.String(\"r2-access-key-id\", os.Getenv(\"LITESTREAM_R2_ACCESS_KEY_ID\"), \"\")\n\tr2SecretAccessKey = flag.String(\"r2-secret-access-key\", os.Getenv(\"LITESTREAM_R2_SECRET_ACCESS_KEY\"), \"\")\n\tr2Endpoint = flag.String(\"r2-endpoint\", os.Getenv(\"LITESTREAM_R2_ENDPOINT\"), \"\")\n\tr2Bucket = flag.String(\"r2-bucket\", os.Getenv(\"LITESTREAM_R2_BUCKET\"), \"\")\n)\n\n// Backblaze B2 settings (S3-compatible)\nvar (\n\tb2KeyID = flag.String(\"b2-key-id\", os.Getenv(\"LITESTREAM_B2_KEY_ID\"), \"\")\n\tb2ApplicationKey = flag.String(\"b2-application-key\", os.Getenv(\"LITESTREAM_B2_APPLICATION_KEY\"), \"\")\n\tb2Endpoint = flag.String(\"b2-endpoint\", os.Getenv(\"LITESTREAM_B2_ENDPOINT\"), \"\")\n\tb2Bucket = flag.String(\"b2-bucket\", os.Getenv(\"LITESTREAM_B2_BUCKET\"), \"\")\n)\n\n// Google cloud storage settings\nvar (\n\tgsBucket = flag.String(\"gs-bucket\", os.Getenv(\"LITESTREAM_GS_BUCKET\"), \"\")\n\tgsPath = flag.String(\"gs-path\", os.Getenv(\"LITESTREAM_GS_PATH\"), \"\")\n)\n\n// Azure blob storage settings\nvar (\n\tabsAccountName = flag.String(\"abs-account-name\", os.Getenv(\"LITESTREAM_ABS_ACCOUNT_NAME\"), \"\")\n\tabsAccountKey = flag.String(\"abs-account-key\", os.Getenv(\"LITESTREAM_ABS_ACCOUNT_KEY\"), \"\")\n\tabsSASToken = flag.String(\"abs-sas-token\", os.Getenv(\"LITESTREAM_ABS_SAS_TOKEN\"), \"\")\n\tabsBucket = flag.String(\"abs-bucket\", os.Getenv(\"LITESTREAM_ABS_BUCKET\"), \"\")\n\tabsPath = flag.String(\"abs-path\", os.Getenv(\"LITESTREAM_ABS_PATH\"), \"\")\n)\n\n// SFTP settings\nvar (\n\tsftpHost = flag.String(\"sftp-host\", os.Getenv(\"LITESTREAM_SFTP_HOST\"), \"\")\n\tsftpUser = flag.String(\"sftp-user\", os.Getenv(\"LITESTREAM_SFTP_USER\"), \"\")\n\tsftpPassword = flag.String(\"sftp-password\", os.Getenv(\"LITESTREAM_SFTP_PASSWORD\"), \"\")\n\tsftpKeyPath = flag.String(\"sftp-key-path\", os.Getenv(\"LITESTREAM_SFTP_KEY_PATH\"), \"\")\n\tsftpPath = flag.String(\"sftp-path\", os.Getenv(\"LITESTREAM_SFTP_PATH\"), \"\")\n)\n\n// WebDAV settings\nvar (\n\twebdavURL = flag.String(\"webdav-url\", os.Getenv(\"LITESTREAM_WEBDAV_URL\"), \"\")\n\twebdavUsername = flag.String(\"webdav-username\", os.Getenv(\"LITESTREAM_WEBDAV_USERNAME\"), \"\")\n\twebdavPassword = flag.String(\"webdav-password\", os.Getenv(\"LITESTREAM_WEBDAV_PASSWORD\"), \"\")\n\twebdavPath = flag.String(\"webdav-path\", os.Getenv(\"LITESTREAM_WEBDAV_PATH\"), \"\")\n)\n\n// NATS settings\nvar (\n\tnatsURL = flag.String(\"nats-url\", os.Getenv(\"LITESTREAM_NATS_URL\"), \"\")\n\tnatsBucket = flag.String(\"nats-bucket\", os.Getenv(\"LITESTREAM_NATS_BUCKET\"), \"\")\n\tnatsCreds = flag.String(\"nats-creds\", os.Getenv(\"LITESTREAM_NATS_CREDS\"), \"\")\n\tnatsUsername = flag.String(\"nats-username\", os.Getenv(\"LITESTREAM_NATS_USERNAME\"), \"\")\n\tnatsPassword = flag.String(\"nats-password\", os.Getenv(\"LITESTREAM_NATS_PASSWORD\"), \"\")\n)\n\n// Alibaba Cloud OSS settings\nvar (\n\tossAccessKeyID = flag.String(\"oss-access-key-id\", os.Getenv(\"LITESTREAM_OSS_ACCESS_KEY_ID\"), \"\")\n\tossAccessKeySecret = flag.String(\"oss-access-key-secret\", os.Getenv(\"LITESTREAM_OSS_ACCESS_KEY_SECRET\"), \"\")\n\tossRegion = flag.String(\"oss-region\", os.Getenv(\"LITESTREAM_OSS_REGION\"), \"\")\n\tossBucket = flag.String(\"oss-bucket\", os.Getenv(\"LITESTREAM_OSS_BUCKET\"), \"\")\n\tossPath = flag.String(\"oss-path\", os.Getenv(\"LITESTREAM_OSS_PATH\"), \"\")\n\tossEndpoint = flag.String(\"oss-endpoint\", os.Getenv(\"LITESTREAM_OSS_ENDPOINT\"), \"\")\n)\n\nfunc Integration() bool {\n\treturn *integration\n}\n\nfunc ReplicaClientTypes() []string {\n\treturn strings.Split(*replicaClientTypes, \",\")\n}\n\nfunc NewDB(tb testing.TB, path string) *litestream.DB {\n\ttb.Helper()\n\ttb.Logf(\"db=%s\", path)\n\n\tlevel := slog.LevelDebug\n\tif strings.EqualFold(*logLevel, \"trace\") {\n\t\tlevel = internal.LevelTrace\n\t}\n\n\tdb := litestream.NewDB(path)\n\tdb.Logger = slog.New(slog.NewTextHandler(os.Stdout, \u0026slog.HandlerOptions{\n\t\tLevel: level,\n\t\tReplaceAttr: internal.ReplaceAttr,\n\t}))\n\treturn db\n}\n\n// MustOpenDBs returns a new instance of a DB \u0026 associated SQL DB.\nfunc MustOpenDBs(tb testing.TB) (*litestream.DB, *sql.DB) {\n\ttb.Helper()\n\tdb := MustOpenDB(tb)\n\treturn db, MustOpenSQLDB(tb, db.Path())\n}\n\n// MustCloseDBs closes db \u0026 sqldb and removes the parent directory.\nfunc MustCloseDBs(tb testing.TB, db *litestream.DB, sqldb *sql.DB) {\n\ttb.Helper()\n\tMustCloseDB(tb, db)\n\tMustCloseSQLDB(tb, sqldb)\n}\n\n// MustOpenDB returns a new instance of a DB.\nfunc MustOpenDB(tb testing.TB) *litestream.DB {\n\ttb.Helper()\n\tdir := tb.TempDir()\n\treturn MustOpenDBAt(tb, filepath.Join(dir, \"db\"))\n}\n\n// MustOpenDBAt returns a new instance of a DB for a given path.\nfunc MustOpenDBAt(tb testing.TB, path string) *litestream.DB {\n\ttb.Helper()\n\tdb := NewDB(tb, path)\n\tdb.MonitorInterval = 0 // disable background goroutine\n\tdb.ShutdownSyncTimeout = 0 // disable shutdown sync retry for faster tests\n\tdb.Replica = litestream.NewReplica(db)\n\tdb.Replica.Client = NewFileReplicaClient(tb)\n\tdb.Replica.MonitorEnabled = false // disable background goroutine\n\tif err := db.Open(); err != nil {\n\t\ttb.Fatal(err)\n\t}\n\treturn db\n}\n\n// MustCloseDB closes db and removes its parent directory.\nfunc MustCloseDB(tb testing.TB, db *litestream.DB) {\n\ttb.Helper()\n\tif err := db.Close(context.Background()); err != nil \u0026\u0026 !strings.Contains(err.Error(), `database is closed`) \u0026\u0026 !strings.Contains(err.Error(), `file already closed`) {\n\t\ttb.Fatal(err)\n\t} else if err := os.RemoveAll(filepath.Dir(db.Path())); err != nil {\n\t\ttb.Fatal(err)\n\t}\n}\n\n// MustOpenSQLDB returns a database/sql DB.\nfunc MustOpenSQLDB(tb testing.TB, path string) *sql.DB {\n\ttb.Helper()\n\td, err := sql.Open(\"sqlite\", path)\n\tif err != nil {\n\t\ttb.Fatal(err)\n\t} else if _, err := d.ExecContext(context.Background(), `PRAGMA journal_mode = wal;`); err != nil {\n\t\ttb.Fatal(err)\n\t} else if _, err := d.ExecContext(context.Background(), `PRAGMA busy_timeout = 5000;`); err != nil {\n\t\ttb.Fatal(err)\n\t}\n\treturn d\n}\n\n// MustCloseSQLDB closes a database/sql DB.\nfunc MustCloseSQLDB(tb testing.TB, d *sql.DB) {\n\ttb.Helper()\n\tif err := d.Close(); err != nil {\n\t\ttb.Fatal(err)\n\t}\n}\n\n// NewReplicaClient returns a new client for integration testing by type name.\nfunc NewReplicaClient(tb testing.TB, typ string) litestream.ReplicaClient {\n\ttb.Helper()\n\n\tswitch typ {\n\tcase file.ReplicaClientType:\n\t\treturn NewFileReplicaClient(tb)\n\tcase s3.ReplicaClientType:\n\t\treturn NewS3ReplicaClient(tb)\n\tcase gs.ReplicaClientType:\n\t\treturn NewGSReplicaClient(tb)\n\tcase abs.ReplicaClientType:\n\t\treturn NewABSReplicaClient(tb)\n\tcase sftp.ReplicaClientType:\n\t\treturn NewSFTPReplicaClient(tb)\n\tcase webdav.ReplicaClientType:\n\t\treturn NewWebDAVReplicaClient(tb)\n\tcase nats.ReplicaClientType:\n\t\treturn NewNATSReplicaClient(tb)\n\tcase oss.ReplicaClientType:\n\t\treturn NewOSSReplicaClient(tb)\n\tcase \"tigris\":\n\t\treturn NewTigrisReplicaClient(tb)\n\tcase \"r2\":\n\t\treturn NewR2ReplicaClient(tb)\n\tcase \"b2\":\n\t\treturn NewB2ReplicaClient(tb)\n\tdefault:\n\t\ttb.Fatalf(\"invalid replica client type: %q\", typ)\n\t\treturn nil\n\t}\n}\n\n// NewFileReplicaClient returns a new client for integration testing.\nfunc NewFileReplicaClient(tb testing.TB) *file.ReplicaClient {\n\ttb.Helper()\n\treturn file.NewReplicaClient(tb.TempDir())\n}\n\n// NewS3ReplicaClient returns a new client for integration testing.\nfunc NewS3ReplicaClient(tb testing.TB) *s3.ReplicaClient {\n\ttb.Helper()\n\n\tc := s3.NewReplicaClient()\n\tc.AccessKeyID = *s3AccessKeyID\n\tc.SecretAccessKey = *s3SecretAccessKey\n\tc.Region = *s3Region\n\tc.Bucket = *s3Bucket\n\tc.Path = path.Join(*s3Path, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = *s3Endpoint\n\tc.ForcePathStyle = *s3ForcePathStyle\n\tc.SkipVerify = *s3SkipVerify\n\treturn c\n}\n\n// NewTigrisReplicaClient returns an S3 client configured for Fly.io Tigris.\nfunc NewTigrisReplicaClient(tb testing.TB) *s3.ReplicaClient {\n\ttb.Helper()\n\n\tif *tigrisAccessKeyID == \"\" || *tigrisSecretAccessKey == \"\" {\n\t\ttb.Skip(\"tigris credentials not configured (set LITESTREAM_TIGRIS_ACCESS_KEY_ID/SECRET_ACCESS_KEY)\")\n\t}\n\n\tc := s3.NewReplicaClient()\n\tc.AccessKeyID = *tigrisAccessKeyID\n\tc.SecretAccessKey = *tigrisSecretAccessKey\n\tc.Region = defaultTigrisRegion\n\tc.Bucket = defaultTigrisBucket\n\tc.Path = path.Join(defaultTigrisPathRoot, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = defaultTigrisEndpoint\n\tc.ForcePathStyle = true\n\tc.RequireContentMD5 = false\n\treturn c\n}\n\n// NewR2ReplicaClient returns an S3 client configured for Cloudflare R2.\n// Skips the test if R2 credentials are not configured.\nfunc NewR2ReplicaClient(tb testing.TB) *s3.ReplicaClient {\n\ttb.Helper()\n\n\tif *r2AccessKeyID == \"\" || *r2SecretAccessKey == \"\" {\n\t\ttb.Skip(\"r2 credentials not configured (set LITESTREAM_R2_ACCESS_KEY_ID/SECRET_ACCESS_KEY)\")\n\t}\n\tif *r2Endpoint == \"\" {\n\t\ttb.Skip(\"r2 endpoint not configured (set LITESTREAM_R2_ENDPOINT)\")\n\t}\n\tif *r2Bucket == \"\" {\n\t\ttb.Skip(\"r2 bucket not configured (set LITESTREAM_R2_BUCKET)\")\n\t}\n\n\tc := s3.NewReplicaClient()\n\tc.AccessKeyID = *r2AccessKeyID\n\tc.SecretAccessKey = *r2SecretAccessKey\n\tc.Region = \"auto\"\n\tc.Bucket = *r2Bucket\n\tc.Path = path.Join(\"integration-tests\", fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = *r2Endpoint\n\tc.ForcePathStyle = true\n\tc.SignPayload = true\n\treturn c\n}\n\n// NewB2ReplicaClient returns a new Backblaze B2 client for integration testing.\n// B2 uses S3-compatible API with path-style URLs and signed payloads.\nfunc NewB2ReplicaClient(tb testing.TB) *s3.ReplicaClient {\n\ttb.Helper()\n\n\tif *b2KeyID == \"\" || *b2ApplicationKey == \"\" {\n\t\ttb.Skip(\"b2 credentials not configured (set LITESTREAM_B2_KEY_ID/APPLICATION_KEY)\")\n\t}\n\tif *b2Endpoint == \"\" {\n\t\ttb.Skip(\"b2 endpoint not configured (set LITESTREAM_B2_ENDPOINT)\")\n\t}\n\tif *b2Bucket == \"\" {\n\t\ttb.Skip(\"b2 bucket not configured (set LITESTREAM_B2_BUCKET)\")\n\t}\n\n\tc := s3.NewReplicaClient()\n\tc.AccessKeyID = *b2KeyID\n\tc.SecretAccessKey = *b2ApplicationKey\n\tc.Region = \"us-west-002\" // B2 uses region in endpoint format\n\tc.Bucket = *b2Bucket\n\tc.Path = path.Join(\"integration-tests\", fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = *b2Endpoint\n\tc.ForcePathStyle = true\n\tc.SignPayload = true\n\treturn c\n}\n\n// NewGSReplicaClient returns a new client for integration testing.\nfunc NewGSReplicaClient(tb testing.TB) *gs.ReplicaClient {\n\ttb.Helper()\n\n\t// Log basic diagnostic information for integration test troubleshooting\n\ttb.Logf(\"GCS Integration Test Setup:\")\n\tcredsSet := \"not set\"\n\tif os.Getenv(\"GOOGLE_APPLICATION_CREDENTIALS\") != \"\" {\n\t\tcredsSet = \"set\"\n\t}\n\ttb.Logf(\" GOOGLE_APPLICATION_CREDENTIALS: %s\", credsSet)\n\ttb.Logf(\" LITESTREAM_GS_BUCKET: %s\", *gsBucket)\n\ttb.Logf(\" LITESTREAM_GS_PATH: %s\", *gsPath)\n\n\tc := gs.NewReplicaClient()\n\tc.Bucket = *gsBucket\n\tc.Path = path.Join(*gsPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\n\t// Test basic connectivity\n\tctx := context.Background()\n\tif err := c.Init(ctx); err != nil {\n\t\ttb.Logf(\"GCS client initialization failed: %v\", err)\n\t\ttb.Logf(\"This may indicate credential or project issues\")\n\t\treturn c // Return anyway to let the actual test show the detailed error\n\t}\n\ttb.Logf(\"GCS client initialized successfully\")\n\n\treturn c\n}\n\n// NewABSReplicaClient returns a new client for integration testing.\nfunc NewABSReplicaClient(tb testing.TB) *abs.ReplicaClient {\n\ttb.Helper()\n\n\tc := abs.NewReplicaClient()\n\tc.AccountName = *absAccountName\n\tc.AccountKey = *absAccountKey\n\tc.SASToken = *absSASToken\n\tc.Bucket = *absBucket\n\tc.Path = path.Join(*absPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\treturn c\n}\n\n// NewSFTPReplicaClient returns a new client for integration testing.\nfunc NewSFTPReplicaClient(tb testing.TB) *sftp.ReplicaClient {\n\ttb.Helper()\n\n\tc := sftp.NewReplicaClient()\n\tc.Host = *sftpHost\n\tc.User = *sftpUser\n\tc.Password = *sftpPassword\n\tc.KeyPath = *sftpKeyPath\n\tc.Path = path.Join(*sftpPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\treturn c\n}\n\n// NewWebDAVReplicaClient returns a new client for integration testing.\nfunc NewWebDAVReplicaClient(tb testing.TB) *webdav.ReplicaClient {\n\ttb.Helper()\n\n\tc := webdav.NewReplicaClient()\n\tc.URL = *webdavURL\n\tc.Username = *webdavUsername\n\tc.Password = *webdavPassword\n\tc.Path = path.Join(*webdavPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\treturn c\n}\n\n// NewNATSReplicaClient returns a new client for integration testing.\nfunc NewNATSReplicaClient(tb testing.TB) *nats.ReplicaClient {\n\ttb.Helper()\n\n\tc := nats.NewReplicaClient()\n\tc.URL = *natsURL\n\tc.BucketName = *natsBucket\n\tc.Creds = *natsCreds\n\tc.Username = *natsUsername\n\tc.Password = *natsPassword\n\treturn c\n}\n\n// NewOSSReplicaClient returns a new client for integration testing.\nfunc NewOSSReplicaClient(tb testing.TB) *oss.ReplicaClient {\n\ttb.Helper()\n\n\tc := oss.NewReplicaClient()\n\tc.AccessKeyID = *ossAccessKeyID\n\tc.AccessKeySecret = *ossAccessKeySecret\n\tc.Region = *ossRegion\n\tc.Bucket = *ossBucket\n\tc.Path = path.Join(*ossPath, fmt.Sprintf(\"%016x\", rand.Uint64()))\n\tc.Endpoint = *ossEndpoint\n\treturn c\n}\n\n// MustDeleteAll deletes all objects under the client's path.\nfunc MustDeleteAll(tb testing.TB, c litestream.ReplicaClient) {\n\ttb.Helper()\n\n\tif err := c.DeleteAll(context.Background()); err != nil {\n\t\ttb.Fatalf(\"cannot delete all: %s\", err)\n\t}\n\n\tswitch c := c.(type) {\n\tcase *sftp.ReplicaClient:\n\t\tif err := c.Cleanup(context.Background()); err != nil {\n\t\t\ttb.Fatalf(\"cannot cleanup sftp: %s\", err)\n\t\t}\n\t}\n}\n\nfunc MockSFTPServer(t *testing.T, hostKey ssh.Signer) string {\n\tconfig := \u0026ssh.ServerConfig{NoClientAuth: true}\n\tconfig.AddHostKey(hostKey)\n\n\tlistener, err := net.Listen(\"tcp\", \"127.0.0.1:0\") // random available port\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tgo func() {\n\t\tfor {\n\t\t\tconn, err := listener.Accept()\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tgo func() {\n\t\t\t\t_, chans, reqs, err := ssh.NewServerConn(conn, config)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tgo ssh.DiscardRequests(reqs)\n\n\t\t\t\tfor ch := range chans {\n\t\t\t\t\tif ch.ChannelType() != \"session\" {\n\t\t\t\t\t\tch.Reject(ssh.UnknownChannelType, \"unsupported\")\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tchannel, requests, err := ch.Accept()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tgo func(in \u003c-chan *ssh.Request) {\n\t\t\t\t\t\tfor req := range in {\n\t\t\t\t\t\t\tif req.Type == \"subsystem\" \u0026\u0026 string(req.Payload[4:]) == \"sftp\" {\n\t\t\t\t\t\t\t\treq.Reply(true, nil)\n\n\t\t\t\t\t\t\t\tserver, err := sftpserver.NewServer(channel)\n\t\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif err := server.Serve(); err != nil \u0026\u0026 err != io.EOF {\n\t\t\t\t\t\t\t\t\tt.Logf(\"SFTP server error: %v\", err)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treq.Reply(false, nil)\n\t\t\t\t\t\t}\n\t\t\t\t\t}(requests)\n\t\t\t\t}\n\t\t\t}()\n\t\t}\n\t}()\n\n\treturn listener.Addr().String()\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[30,40]}},{"name":"sql","path":"database/sql","span":{"start":[5,1],"end":[5,16],"bytes":[41,56]}},{"name":"flag","path":"flag","span":{"start":[6,1],"end":[6,8],"bytes":[57,64]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[65,71]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[72,77]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[78,89]}},{"name":"v2","path":"math/rand/v2","span":{"start":[10,1],"end":[10,16],"bytes":[90,105]}},{"name":"net","path":"net","span":{"start":[11,1],"end":[11,7],"bytes":[106,112]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[113,118]}},{"name":"path","path":"path","span":{"start":[13,1],"end":[13,8],"bytes":[119,126]}},{"name":"filepath","path":"path/filepath","span":{"start":[14,1],"end":[14,17],"bytes":[127,143]}},{"name":"strings","path":"strings","span":{"start":[15,1],"end":[15,11],"bytes":[144,154]}},{"name":"testing","path":"testing","span":{"start":[16,1],"end":[16,11],"bytes":[155,165]}},{"name":"sftp","path":"github.com/pkg/sftp","alias":"sftpserver","span":{"start":[18,1],"end":[18,34],"bytes":[167,200]}},{"name":"ssh","path":"golang.org/x/crypto/ssh","span":{"start":[19,1],"end":[19,27],"bytes":[201,227]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[21,1],"end":[21,37],"bytes":[229,265]}},{"name":"abs","path":"github.com/benbjohnson/litestream/abs","span":{"start":[22,1],"end":[22,41],"bytes":[266,306]}},{"name":"file","path":"github.com/benbjohnson/litestream/file","span":{"start":[23,1],"end":[23,42],"bytes":[307,348]}},{"name":"gs","path":"github.com/benbjohnson/litestream/gs","span":{"start":[24,1],"end":[24,40],"bytes":[349,388]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[25,1],"end":[25,46],"bytes":[389,434]}},{"name":"nats","path":"github.com/benbjohnson/litestream/nats","span":{"start":[26,1],"end":[26,42],"bytes":[435,476]}},{"name":"oss","path":"github.com/benbjohnson/litestream/oss","span":{"start":[27,1],"end":[27,41],"bytes":[477,517]}},{"name":"s3","path":"github.com/benbjohnson/litestream/s3","span":{"start":[28,1],"end":[28,40],"bytes":[518,557]}},{"name":"sftp","path":"github.com/benbjohnson/litestream/sftp","span":{"start":[29,1],"end":[29,42],"bytes":[558,599]}},{"name":"webdav","path":"github.com/benbjohnson/litestream/webdav","span":{"start":[30,1],"end":[30,44],"bytes":[600,643]}}],"types":{},"functions":{"github.com/benbjohnson/litestream/internal/testingutil.Integration":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.Integration","kind":"function","span":{"start":[135,1],"end":[137,2],"bytes":[5610,5658]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.Integration","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer","kind":"function","span":{"start":[468,1],"end":[524,2],"bytes":[15381,16629]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer","parameters":[{"name":"t","type":"*testing.T","span":{"start":[468,1],"end":[468,63],"bytes":[15381,15443]}},{"name":"hostKey","type":"invalid type","span":{"start":[468,1],"end":[468,63],"bytes":[15381,15443]}}],"return_type":"string","metrics":{"cyclomatic":12},"body":{"470:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer@470:2","span":{"start":[470,2],"end":[470,28],"bytes":[15494,15520]},"callee":null},"472:19":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer@472:19","span":{"start":[472,19],"end":[472,51],"bytes":[15540,15572]},"callee":"can://litestream/litestream/@external/net/Listen"},"474:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer@474:3","span":{"start":[474,3],"end":[474,15],"bytes":[15617,15629]},"callee":"can://litestream/litestream/@external/testing/common.Fatal"},"477:5":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer@477:5","span":{"start":[477,5],"end":[521,5],"bytes":[15638,16593]},"callee":null,"is_goroutine":true},"523:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer@523:9","span":{"start":[523,9],"end":[523,33],"bytes":[16603,16627]},"callee":"can://litestream/litestream/@external/net/Addr.String"},"523:9/2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer@523:9/2","span":{"start":[523,9],"end":[523,24],"bytes":[16603,16618]},"callee":"can://litestream/litestream/@external/net/Listener.Addr"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1","kind":"function","span":{"start":[477,1],"end":[521,5],"bytes":[15634,16593]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1","parameters":[],"body":{"479:17":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1@479:17","span":{"start":[479,17],"end":[479,34],"bytes":[15671,15688]},"callee":"can://litestream/litestream/@external/net/Listener.Accept"},"484:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1@484:7","span":{"start":[484,7],"end":[519,7],"bytes":[15731,16584]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1","kind":"function","span":{"start":[484,1],"end":[519,7],"bytes":[15725,16584]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1","parameters":[],"body":{"485:28":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1@485:28","span":{"start":[485,28],"end":[485,59],"bytes":[15767,15798]},"callee":null},"489:8":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1@489:8","span":{"start":[489,8],"end":[489,33],"bytes":[15844,15869]},"callee":null,"is_goroutine":true},"492:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1@492:9","span":{"start":[492,9],"end":[492,25],"bytes":[15907,15923]},"callee":null},"493:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1@493:7","span":{"start":[493,7],"end":[493,55],"bytes":[15945,15993]},"callee":null},"496:32":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1@496:32","span":{"start":[496,32],"end":[496,43],"bytes":[16047,16058]},"callee":null},"501:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1@501:9","span":{"start":[501,9],"end":[517,17],"bytes":[16109,16571]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1","kind":"function","span":{"start":[501,1],"end":[517,17],"bytes":[16101,16571]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1","parameters":[{"name":"in","type":"\u003c-chan invalid type","span":{"start":[501,1],"end":[501,39],"bytes":[16101,16139]}}],"body":{"503:38":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1@503:38","span":{"start":[503,38],"end":[503,61],"bytes":[16205,16228]},"callee":null},"504:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1@504:9","span":{"start":[504,9],"end":[504,29],"bytes":[16249,16269]},"callee":null},"506:24":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1@506:24","span":{"start":[506,24],"end":[506,53],"bytes":[16294,16323]},"callee":null},"510:19":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1@510:19","span":{"start":[510,19],"end":[510,33],"bytes":[16392,16406]},"callee":null},"511:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1@511:10","span":{"start":[511,10],"end":[511,46],"bytes":[16447,16483]},"callee":"can://litestream/litestream/@external/testing/common.Logf"},"515:8":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1@515:8","span":{"start":[515,8],"end":[515,29],"bytes":[16525,16546]},"callee":null}}}}}}}}},"github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","kind":"function","span":{"start":[197,1],"end":[204,2],"bytes":[7298,7639]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[197,1],"end":[197,53],"bytes":[7298,7350]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[197,1],"end":[197,53],"bytes":[7298,7350]}}],"metrics":{"cyclomatic":3},"body":{"198:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@198:2","span":{"start":[198,2],"end":[198,13],"bytes":[7352,7363]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"199:115":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@199:115","span":{"start":[199,115],"end":[199,167],"bytes":[7478,7530]},"callee":"can://litestream/litestream/@external/strings/Contains"},"199:12":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@199:12","span":{"start":[199,12],"end":[199,42],"bytes":[7375,7405]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"199:132":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@199:132","span":{"start":[199,132],"end":[199,143],"bytes":[7495,7506]},"callee":null},"199:21":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@199:21","span":{"start":[199,21],"end":[199,41],"bytes":[7384,7404]},"callee":"can://litestream/litestream/@external/context/Background"},"199:59":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@199:59","span":{"start":[199,59],"end":[199,110],"bytes":[7422,7473]},"callee":"can://litestream/litestream/@external/strings/Contains"},"199:76":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@199:76","span":{"start":[199,76],"end":[199,87],"bytes":[7439,7450]},"callee":null},"200:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@200:3","span":{"start":[200,3],"end":[200,16],"bytes":[7535,7548]},"callee":"can://litestream/litestream/@external/testing/TB.Fatal"},"201:19":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@201:19","span":{"start":[201,19],"end":[201,56],"bytes":[7567,7604]},"callee":"can://litestream/litestream/@external/os/RemoveAll"},"201:32":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@201:32","span":{"start":[201,32],"end":[201,55],"bytes":[7580,7603]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"201:45":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@201:45","span":{"start":[201,45],"end":[201,54],"bytes":[7593,7602]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"202:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB@202:3","span":{"start":[202,3],"end":[202,16],"bytes":[7621,7634]},"callee":"can://litestream/litestream/@external/testing/TB.Fatal"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","kind":"function","span":{"start":[168,1],"end":[172,2],"bytes":[6403,6534]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[168,1],"end":[168,69],"bytes":[6403,6471]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[168,1],"end":[168,69],"bytes":[6403,6471]}},{"name":"sqldb","type":"*database/sql.DB","span":{"start":[168,1],"end":[168,69],"bytes":[6403,6471]}}],"metrics":{"cyclomatic":1},"body":{"169:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs@169:2","span":{"start":[169,2],"end":[169,13],"bytes":[6473,6484]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"170:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs@170:2","span":{"start":[170,2],"end":[170,21],"bytes":[6486,6505]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB"},"171:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs@171:2","span":{"start":[171,2],"end":[171,27],"bytes":[6507,6532]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","kind":"function","span":{"start":[221,1],"end":[226,2],"bytes":[8119,8235]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[221,1],"end":[221,48],"bytes":[8119,8166]}},{"name":"d","type":"*database/sql.DB","span":{"start":[221,1],"end":[221,48],"bytes":[8119,8166]}}],"metrics":{"cyclomatic":2},"body":{"222:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB@222:2","span":{"start":[222,2],"end":[222,13],"bytes":[8168,8179]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"223:12":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB@223:12","span":{"start":[223,12],"end":[223,21],"bytes":[8191,8200]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close"},"224:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB@224:3","span":{"start":[224,3],"end":[224,16],"bytes":[8217,8230]},"callee":"can://litestream/litestream/@external/testing/TB.Fatal"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","kind":"function","span":{"start":[453,1],"end":[466,2],"bytes":[15034,15379]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[453,1],"end":[453,64],"bytes":[15034,15097]}},{"name":"c","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[453,1],"end":[453,64],"bytes":[15034,15097]}}],"metrics":{"cyclomatic":5},"body":{"454:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll@454:2","span":{"start":[454,2],"end":[454,13],"bytes":[15099,15110]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"456:12":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll@456:12","span":{"start":[456,12],"end":[456,45],"bytes":[15123,15156]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteAll"},"456:24":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll@456:24","span":{"start":[456,24],"end":[456,44],"bytes":[15135,15155]},"callee":"can://litestream/litestream/@external/context/Background"},"457:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll@457:3","span":{"start":[457,3],"end":[457,42],"bytes":[15173,15212]},"callee":"can://litestream/litestream/@external/testing/TB.Fatalf"},"462:13":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll@462:13","span":{"start":[462,13],"end":[462,44],"bytes":[15280,15311]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup"},"462:23":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll@462:23","span":{"start":[462,23],"end":[462,43],"bytes":[15290,15310]},"callee":"can://litestream/litestream/@external/context/Background"},"463:4":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll@463:4","span":{"start":[463,4],"end":[463,45],"bytes":[15329,15370]},"callee":"can://litestream/litestream/@external/testing/TB.Fatalf"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","kind":"function","span":{"start":[175,1],"end":[179,2],"bytes":[6582,6716]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[175,1],"end":[175,48],"bytes":[6582,6629]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":1},"body":{"176:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB@176:2","span":{"start":[176,2],"end":[176,13],"bytes":[6631,6642]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"177:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB@177:9","span":{"start":[177,9],"end":[177,21],"bytes":[6651,6663]},"callee":"can://litestream/litestream/@external/testing/TB.TempDir"},"178:26":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB@178:26","span":{"start":[178,26],"end":[178,50],"bytes":[6689,6713]},"callee":"can://litestream/litestream/@external/path/filepath/Join"},"178:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB@178:9","span":{"start":[178,9],"end":[178,51],"bytes":[6672,6714]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","kind":"function","span":{"start":[182,1],"end":[194,2],"bytes":[6783,7237]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[182,1],"end":[182,63],"bytes":[6783,6845]}},{"name":"path","type":"string","span":{"start":[182,1],"end":[182,63],"bytes":[6783,6845]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":2},"body":{"183:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt@183:2","span":{"start":[183,2],"end":[183,13],"bytes":[6847,6858]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"184:8":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt@184:8","span":{"start":[184,8],"end":[184,23],"bytes":[6866,6881]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB"},"187:15":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt@187:15","span":{"start":[187,15],"end":[187,40],"bytes":[7032,7057]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica"},"188:22":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt@188:22","span":{"start":[188,22],"end":[188,46],"bytes":[7079,7103]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient"},"190:12":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt@190:12","span":{"start":[190,12],"end":[190,21],"bytes":[7182,7191]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open"},"191:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt@191:3","span":{"start":[191,3],"end":[191,16],"bytes":[7208,7221]},"callee":"can://litestream/litestream/@external/testing/TB.Fatal"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","kind":"function","span":{"start":[161,1],"end":[165,2],"bytes":[6196,6333]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[161,1],"end":[161,60],"bytes":[6196,6255]}}],"return_type":"(*github.com/benbjohnson/litestream.DB, *database/sql.DB)","metrics":{"cyclomatic":1},"body":{"162:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs@162:2","span":{"start":[162,2],"end":[162,13],"bytes":[6257,6268]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"163:8":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs@163:8","span":{"start":[163,8],"end":[163,22],"bytes":[6276,6290]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB"},"164:13":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs@164:13","span":{"start":[164,13],"end":[164,41],"bytes":[6303,6331]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB"},"164:31":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs@164:31","span":{"start":[164,31],"end":[164,40],"bytes":[6321,6330]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","kind":"function","span":{"start":[207,1],"end":[218,2],"bytes":[7685,8073]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[207,1],"end":[207,57],"bytes":[7685,7741]}},{"name":"path","type":"string","span":{"start":[207,1],"end":[207,57],"bytes":[7685,7741]}}],"return_type":"*database/sql.DB","metrics":{"cyclomatic":4},"body":{"208:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@208:2","span":{"start":[208,2],"end":[208,13],"bytes":[7743,7754]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"209:12":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@209:12","span":{"start":[209,12],"end":[209,36],"bytes":[7766,7790]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"211:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@211:3","span":{"start":[211,3],"end":[211,16],"bytes":[7810,7823]},"callee":"can://litestream/litestream/@external/testing/TB.Fatal"},"212:22":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@212:22","span":{"start":[212,22],"end":[212,87],"bytes":[7845,7910]},"callee":"can://litestream/litestream/@external/database/sql/DB.ExecContext"},"212:36":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@212:36","span":{"start":[212,36],"end":[212,56],"bytes":[7859,7879]},"callee":"can://litestream/litestream/@external/context/Background"},"213:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@213:3","span":{"start":[213,3],"end":[213,16],"bytes":[7927,7940]},"callee":"can://litestream/litestream/@external/testing/TB.Fatal"},"214:22":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@214:22","span":{"start":[214,22],"end":[214,88],"bytes":[7962,8028]},"callee":"can://litestream/litestream/@external/database/sql/DB.ExecContext"},"214:36":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@214:36","span":{"start":[214,36],"end":[214,56],"bytes":[7976,7996]},"callee":"can://litestream/litestream/@external/context/Background"},"215:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB@215:3","span":{"start":[215,3],"end":[215,16],"bytes":[8045,8058]},"callee":"can://litestream/litestream/@external/testing/TB.Fatal"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","kind":"function","span":{"start":[388,1],"end":[398,2],"bytes":[13260,13556]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[388,1],"end":[388,61],"bytes":[13260,13320]}}],"return_type":"*github.com/benbjohnson/litestream/abs.ReplicaClient","metrics":{"cyclomatic":1},"body":{"389:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient@389:2","span":{"start":[389,2],"end":[389,13],"bytes":[13322,13333]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"391:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient@391:7","span":{"start":[391,7],"end":[391,29],"bytes":[13341,13363]},"callee":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient"},"396:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient@396:11","span":{"start":[396,11],"end":[396,67],"bytes":[13488,13544]},"callee":"can://litestream/litestream/@external/path/Join"},"396:31":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient@396:31","span":{"start":[396,31],"end":[396,66],"bytes":[13508,13543]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"396:52":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient@396:52","span":{"start":[396,52],"end":[396,65],"bytes":[13529,13542]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","kind":"function","span":{"start":[332,1],"end":[355,2],"bytes":[11474,12211]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[332,1],"end":[332,59],"bytes":[11474,11532]}}],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":4},"body":{"333:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient@333:2","span":{"start":[333,2],"end":[333,13],"bytes":[11534,11545]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"336:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient@336:3","span":{"start":[336,3],"end":[336,86],"bytes":[11597,11680]},"callee":"can://litestream/litestream/@external/testing/TB.Skip"},"339:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient@339:3","span":{"start":[339,3],"end":[339,69],"bytes":[11710,11776]},"callee":"can://litestream/litestream/@external/testing/TB.Skip"},"342:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient@342:3","span":{"start":[342,3],"end":[342,65],"bytes":[11804,11866]},"callee":"can://litestream/litestream/@external/testing/TB.Skip"},"345:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient@345:7","span":{"start":[345,7],"end":[345,28],"bytes":[11877,11898]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"350:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient@350:11","span":{"start":[350,11],"end":[350,78],"bytes":[12059,12126]},"callee":"can://litestream/litestream/@external/path/Join"},"350:42":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient@350:42","span":{"start":[350,42],"end":[350,77],"bytes":[12090,12125]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"350:63":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient@350:63","span":{"start":[350,63],"end":[350,76],"bytes":[12111,12124]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewDB":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","kind":"function","span":{"start":[143,1],"end":[158,2],"bytes":[5748,6127]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewDB","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[143,1],"end":[143,56],"bytes":[5748,5803]}},{"name":"path","type":"string","span":{"start":[143,1],"end":[143,56],"bytes":[5748,5803]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":2},"body":{"144:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB@144:2","span":{"start":[144,2],"end":[144,13],"bytes":[5805,5816]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"145:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB@145:2","span":{"start":[145,2],"end":[145,24],"bytes":[5818,5840]},"callee":"can://litestream/litestream/@external/testing/TB.Logf"},"148:5":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB@148:5","span":{"start":[148,5],"end":[148,42],"bytes":[5872,5909]},"callee":"can://litestream/litestream/@external/strings/EqualFold"},"152:8":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB@152:8","span":{"start":[152,8],"end":[152,30],"bytes":[5953,5975]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB"},"153:14":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB@153:14","span":{"start":[153,14],"end":[156,5],"bytes":[5989,6114]},"callee":"can://litestream/litestream/@external/log/slog/New"},"153:23":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB@153:23","span":{"start":[153,23],"end":[156,4],"bytes":[5998,6113]},"callee":"can://litestream/litestream/@external/log/slog/NewTextHandler"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","kind":"function","span":{"start":[262,1],"end":[265,2],"bytes":[9215,9336]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[262,1],"end":[262,63],"bytes":[9215,9277]}}],"return_type":"*github.com/benbjohnson/litestream/file.ReplicaClient","metrics":{"cyclomatic":1},"body":{"263:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient@263:2","span":{"start":[263,2],"end":[263,13],"bytes":[9279,9290]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"264:31":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient@264:31","span":{"start":[264,31],"end":[264,43],"bytes":[9321,9333]},"callee":"can://litestream/litestream/@external/testing/TB.TempDir"},"264:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient@264:9","span":{"start":[264,9],"end":[264,44],"bytes":[9299,9334]},"callee":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","kind":"function","span":{"start":[358,1],"end":[385,2],"bytes":[12281,13189]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[358,1],"end":[358,59],"bytes":[12281,12339]}}],"return_type":"*github.com/benbjohnson/litestream/gs.ReplicaClient","metrics":{"cyclomatic":3},"body":{"359:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@359:2","span":{"start":[359,2],"end":[359,13],"bytes":[12341,12352]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"362:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@362:2","span":{"start":[362,2],"end":[362,40],"bytes":[12429,12467]},"callee":"can://litestream/litestream/@external/testing/TB.Logf"},"364:5":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@364:5","span":{"start":[364,5],"end":[364,48],"bytes":[12495,12538]},"callee":"can://litestream/litestream/@external/os/Getenv"},"367:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@367:2","span":{"start":[367,2],"end":[367,59],"bytes":[12570,12627]},"callee":"can://litestream/litestream/@external/testing/TB.Logf"},"368:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@368:2","span":{"start":[368,2],"end":[368,50],"bytes":[12629,12677]},"callee":"can://litestream/litestream/@external/testing/TB.Logf"},"369:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@369:2","span":{"start":[369,2],"end":[369,46],"bytes":[12679,12723]},"callee":"can://litestream/litestream/@external/testing/TB.Logf"},"371:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@371:7","span":{"start":[371,7],"end":[371,28],"bytes":[12731,12752]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient"},"373:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@373:11","span":{"start":[373,11],"end":[373,66],"bytes":[12785,12840]},"callee":"can://litestream/litestream/@external/path/Join"},"373:30":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@373:30","span":{"start":[373,30],"end":[373,65],"bytes":[12804,12839]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"373:51":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@373:51","span":{"start":[373,51],"end":[373,64],"bytes":[12825,12838]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"},"376:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@376:9","span":{"start":[376,9],"end":[376,29],"bytes":[12878,12898]},"callee":"can://litestream/litestream/@external/context/Background"},"377:12":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@377:12","span":{"start":[377,12],"end":[377,23],"bytes":[12910,12921]},"callee":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init"},"378:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@378:3","span":{"start":[378,3],"end":[378,55],"bytes":[12938,12990]},"callee":"can://litestream/litestream/@external/testing/TB.Logf"},"379:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@379:3","span":{"start":[379,3],"end":[379,60],"bytes":[12993,13050]},"callee":"can://litestream/litestream/@external/testing/TB.Logf"},"382:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient@382:2","span":{"start":[382,2],"end":[382,48],"bytes":[13130,13176]},"callee":"can://litestream/litestream/@external/testing/TB.Logf"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","kind":"function","span":{"start":[426,1],"end":[436,2],"bytes":[14328,14570]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[426,1],"end":[426,63],"bytes":[14328,14390]}}],"return_type":"*github.com/benbjohnson/litestream/nats.ReplicaClient","metrics":{"cyclomatic":1},"body":{"427:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient@427:2","span":{"start":[427,2],"end":[427,13],"bytes":[14392,14403]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"429:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient@429:7","span":{"start":[429,7],"end":[429,30],"bytes":[14411,14434]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","kind":"function","span":{"start":[439,1],"end":[450,2],"bytes":[14641,14970]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[439,1],"end":[439,61],"bytes":[14641,14701]}}],"return_type":"*github.com/benbjohnson/litestream/oss.ReplicaClient","metrics":{"cyclomatic":1},"body":{"440:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient@440:2","span":{"start":[440,2],"end":[440,13],"bytes":[14703,14714]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"442:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient@442:7","span":{"start":[442,7],"end":[442,29],"bytes":[14722,14744]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient"},"447:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient@447:11","span":{"start":[447,11],"end":[447,67],"bytes":[14875,14931]},"callee":"can://litestream/litestream/@external/path/Join"},"447:31":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient@447:31","span":{"start":[447,31],"end":[447,66],"bytes":[14895,14930]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"447:52":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient@447:52","span":{"start":[447,52],"end":[447,65],"bytes":[14916,14929]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","kind":"function","span":{"start":[305,1],"end":[328,2],"bytes":[10604,11320]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[305,1],"end":[305,59],"bytes":[10604,10662]}}],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":4},"body":{"306:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient@306:2","span":{"start":[306,2],"end":[306,13],"bytes":[10664,10675]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"309:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient@309:3","span":{"start":[309,3],"end":[309,95],"bytes":[10734,10826]},"callee":"can://litestream/litestream/@external/testing/TB.Skip"},"312:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient@312:3","span":{"start":[312,3],"end":[312,69],"bytes":[10856,10922]},"callee":"can://litestream/litestream/@external/testing/TB.Skip"},"315:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient@315:3","span":{"start":[315,3],"end":[315,65],"bytes":[10950,11012]},"callee":"can://litestream/litestream/@external/testing/TB.Skip"},"318:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient@318:7","span":{"start":[318,7],"end":[318,28],"bytes":[11023,11044]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"323:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient@323:11","span":{"start":[323,11],"end":[323,78],"bytes":[11168,11235]},"callee":"can://litestream/litestream/@external/path/Join"},"323:42":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient@323:42","span":{"start":[323,42],"end":[323,77],"bytes":[11199,11234]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"323:63":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient@323:63","span":{"start":[323,63],"end":[323,76],"bytes":[11220,11233]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","kind":"function","span":{"start":[229,1],"end":[259,2],"bytes":[8316,9143]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[229,1],"end":[229,76],"bytes":[8316,8391]}},{"name":"typ","type":"string","span":{"start":[229,1],"end":[229,76],"bytes":[8316,8391]}}],"return_type":"github.com/benbjohnson/litestream.ReplicaClient","metrics":{"cyclomatic":14},"body":{"230:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@230:2","span":{"start":[230,2],"end":[230,13],"bytes":[8393,8404]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"234:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@234:10","span":{"start":[234,10],"end":[234,34],"bytes":[8459,8483]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient"},"236:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@236:10","span":{"start":[236,10],"end":[236,32],"bytes":[8521,8543]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient"},"238:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@238:10","span":{"start":[238,10],"end":[238,32],"bytes":[8581,8603]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient"},"240:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@240:10","span":{"start":[240,10],"end":[240,33],"bytes":[8642,8665]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient"},"242:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@242:10","span":{"start":[242,10],"end":[242,34],"bytes":[8705,8729]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient"},"244:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@244:10","span":{"start":[244,10],"end":[244,36],"bytes":[8771,8797]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient"},"246:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@246:10","span":{"start":[246,10],"end":[246,34],"bytes":[8837,8861]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient"},"248:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@248:10","span":{"start":[248,10],"end":[248,33],"bytes":[8900,8923]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient"},"250:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@250:10","span":{"start":[250,10],"end":[250,36],"bytes":[8949,8975]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient"},"252:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@252:10","span":{"start":[252,10],"end":[252,32],"bytes":[8997,9019]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient"},"254:10":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@254:10","span":{"start":[254,10],"end":[254,32],"bytes":[9041,9063]},"callee":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient"},"256:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient@256:3","span":{"start":[256,3],"end":[256,52],"bytes":[9076,9125]},"callee":"can://litestream/litestream/@external/testing/TB.Fatalf"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","kind":"function","span":{"start":[268,1],"end":[281,2],"bytes":[9406,9794]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[268,1],"end":[268,59],"bytes":[9406,9464]}}],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":1},"body":{"269:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient@269:2","span":{"start":[269,2],"end":[269,13],"bytes":[9466,9477]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"271:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient@271:7","span":{"start":[271,7],"end":[271,28],"bytes":[9485,9506]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"276:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient@276:11","span":{"start":[276,11],"end":[276,66],"bytes":[9633,9688]},"callee":"can://litestream/litestream/@external/path/Join"},"276:30":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient@276:30","span":{"start":[276,30],"end":[276,65],"bytes":[9652,9687]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"276:51":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient@276:51","span":{"start":[276,51],"end":[276,64],"bytes":[9673,9686]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","kind":"function","span":{"start":[401,1],"end":[411,2],"bytes":[13628,13908]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[401,1],"end":[401,63],"bytes":[13628,13690]}}],"return_type":"*github.com/benbjohnson/litestream/sftp.ReplicaClient","metrics":{"cyclomatic":1},"body":{"402:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient@402:2","span":{"start":[402,2],"end":[402,13],"bytes":[13692,13703]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"404:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient@404:7","span":{"start":[404,7],"end":[404,30],"bytes":[13711,13734]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient"},"409:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient@409:11","span":{"start":[409,11],"end":[409,68],"bytes":[13839,13896]},"callee":"can://litestream/litestream/@external/path/Join"},"409:32":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient@409:32","span":{"start":[409,32],"end":[409,67],"bytes":[13860,13895]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"409:53":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient@409:53","span":{"start":[409,53],"end":[409,66],"bytes":[13881,13894]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","kind":"function","span":{"start":[284,1],"end":[301,2],"bytes":[9873,10473]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[284,1],"end":[284,63],"bytes":[9873,9935]}}],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":2},"body":{"285:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient@285:2","span":{"start":[285,2],"end":[285,13],"bytes":[9937,9948]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"288:3":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient@288:3","span":{"start":[288,3],"end":[288,103],"bytes":[10015,10115]},"callee":"can://litestream/litestream/@external/testing/TB.Skip"},"291:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient@291:7","span":{"start":[291,7],"end":[291,28],"bytes":[10126,10147]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"296:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient@296:11","span":{"start":[296,11],"end":[296,80],"bytes":[10302,10371]},"callee":"can://litestream/litestream/@external/path/Join"},"296:44":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient@296:44","span":{"start":[296,44],"end":[296,79],"bytes":[10335,10370]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"296:65":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient@296:65","span":{"start":[296,65],"end":[296,78],"bytes":[10356,10369]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"}}},"github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","kind":"function","span":{"start":[414,1],"end":[423,2],"bytes":[13982,14256]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","parameters":[{"name":"tb","type":"testing.TB","span":{"start":[414,1],"end":[414,67],"bytes":[13982,14048]}}],"return_type":"*github.com/benbjohnson/litestream/webdav.ReplicaClient","metrics":{"cyclomatic":1},"body":{"415:2":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient@415:2","span":{"start":[415,2],"end":[415,13],"bytes":[14050,14061]},"callee":"can://litestream/litestream/@external/testing/TB.Helper"},"417:7":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient@417:7","span":{"start":[417,7],"end":[417,32],"bytes":[14069,14094]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient"},"421:11":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient@421:11","span":{"start":[421,11],"end":[421,70],"bytes":[14185,14244]},"callee":"can://litestream/litestream/@external/path/Join"},"421:34":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient@421:34","span":{"start":[421,34],"end":[421,69],"bytes":[14208,14243]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"421:55":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient@421:55","span":{"start":[421,55],"end":[421,68],"bytes":[14229,14242]},"callee":"can://litestream/litestream/@external/math/rand/v2/Uint64"}}},"github.com/benbjohnson/litestream/internal/testingutil.ReplicaClientTypes":{"id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.ReplicaClientTypes","kind":"function","span":{"start":[139,1],"end":[141,2],"bytes":[5660,5746]},"signature":"github.com/benbjohnson/litestream/internal/testingutil.ReplicaClientTypes","parameters":[],"return_type":"[]string","metrics":{"cyclomatic":1},"body":{"140:9":{"kind":"call","id":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.ReplicaClientTypes@140:9","span":{"start":[140,9],"end":[140,48],"bytes":[5705,5744]},"callee":"can://litestream/litestream/@external/strings/Split"}}}},"content_hash":"05ab44549f9219b4b32ffca96ff4acb54d6340b69512a42f2006aae45e5e2397"},"leaser.go":{"id":"can://litestream/litestream/go/leaser.go","kind":"module","span":{"start":[1,1],"end":[45,1],"bytes":[0,995]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n)\n\nvar ErrLeaseNotHeld = errors.New(\"lease not held\")\n\ntype LeaseExistsError struct {\n\tOwner string\n\tExpiresAt time.Time\n}\n\nfunc (e *LeaseExistsError) Error() string {\n\tif e.Owner != \"\" {\n\t\treturn fmt.Sprintf(\"lease already held by %s until %s\", e.Owner, e.ExpiresAt.Format(time.RFC3339))\n\t}\n\treturn fmt.Sprintf(\"lease already held until %s\", e.ExpiresAt.Format(time.RFC3339))\n}\n\ntype Leaser interface {\n\tType() string\n\tAcquireLease(ctx context.Context) (*Lease, error)\n\tRenewLease(ctx context.Context, lease *Lease) (*Lease, error)\n\tReleaseLease(ctx context.Context, lease *Lease) error\n}\n\ntype Lease struct {\n\tGeneration int64 `json:\"generation\"`\n\tExpiresAt time.Time `json:\"expires_at\"`\n\tOwner string `json:\"owner,omitempty\"`\n\tETag string `json:\"-\"`\n}\n\nfunc (l *Lease) IsExpired() bool {\n\treturn time.Now().After(l.ExpiresAt)\n}\n\nfunc (l *Lease) TTL() time.Duration {\n\treturn time.Until(l.ExpiresAt)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[40,49]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[50,56]}},{"name":"time","path":"time","span":{"start":[7,1],"end":[7,8],"bytes":[57,64]}}],"types":{"Lease":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease","kind":"struct","span":{"start":[31,1],"end":[36,2],"bytes":[660,845]},"callables":{"github.com/benbjohnson/litestream.Lease.IsExpired":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired","kind":"method","span":{"start":[38,1],"end":[40,2],"bytes":[847,921]},"signature":"github.com/benbjohnson/litestream.Lease.IsExpired","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"39:9":{"kind":"call","id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired@39:9","span":{"start":[39,9],"end":[39,38],"bytes":[890,919]},"callee":"can://litestream/litestream/@external/time/Time.After"},"39:9/2":{"kind":"call","id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired@39:9/2","span":{"start":[39,9],"end":[39,19],"bytes":[890,900]},"callee":"can://litestream/litestream/@external/time/Now"}}},"github.com/benbjohnson/litestream.Lease.TTL":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.TTL","kind":"method","span":{"start":[42,1],"end":[44,2],"bytes":[923,994]},"signature":"github.com/benbjohnson/litestream.Lease.TTL","parameters":[],"return_type":"time.Duration","metrics":{"cyclomatic":1},"body":{"43:9":{"kind":"call","id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.TTL@43:9","span":{"start":[43,9],"end":[43,32],"bytes":[969,992]},"callee":"can://litestream/litestream/@external/time/Until"}}}},"fields":{"ETag":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/ETag","kind":"field","type":"string","span":{"start":[35,1],"end":[35,33],"bytes":[811,843]}},"ExpiresAt":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/ExpiresAt","kind":"field","type":"time.Time","span":{"start":[33,1],"end":[33,42],"bytes":[722,763]}},"Generation":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/Generation","kind":"field","type":"int64","span":{"start":[32,1],"end":[32,42],"bytes":[680,721]}},"Owner":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/Owner","kind":"field","type":"string","span":{"start":[34,1],"end":[34,47],"bytes":[764,810]}}}},"LeaseExistsError":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError","kind":"struct","span":{"start":[12,1],"end":[15,2],"bytes":[120,191]},"callables":{"github.com/benbjohnson/litestream.LeaseExistsError.Error":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/github.com/benbjohnson/litestream.LeaseExistsError.Error","kind":"method","span":{"start":[17,1],"end":[22,2],"bytes":[193,447]},"signature":"github.com/benbjohnson/litestream.LeaseExistsError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"19:10":{"kind":"call","id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/github.com/benbjohnson/litestream.LeaseExistsError.Error@19:10","span":{"start":[19,10],"end":[19,101],"bytes":[266,357]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"19:68":{"kind":"call","id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/github.com/benbjohnson/litestream.LeaseExistsError.Error@19:68","span":{"start":[19,68],"end":[19,100],"bytes":[324,356]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"21:52":{"kind":"call","id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/github.com/benbjohnson/litestream.LeaseExistsError.Error@21:52","span":{"start":[21,52],"end":[21,84],"bytes":[412,444]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"21:9":{"kind":"call","id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/github.com/benbjohnson/litestream.LeaseExistsError.Error@21:9","span":{"start":[21,9],"end":[21,85],"bytes":[369,445]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}}},"fields":{"ExpiresAt":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/ExpiresAt","kind":"field","type":"time.Time","span":{"start":[14,1],"end":[14,21],"bytes":[169,189]}},"Owner":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/Owner","kind":"field","type":"string","span":{"start":[13,1],"end":[13,18],"bytes":[151,168]}}}},"Leaser":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Leaser","kind":"interface","span":{"start":[24,1],"end":[29,2],"bytes":[449,658]},"callables":{"github.com/benbjohnson/litestream.Leaser.AcquireLease":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Leaser/github.com/benbjohnson/litestream.Leaser.AcquireLease","kind":"method","span":{"start":[26,1],"end":[26,51],"bytes":[488,538]},"signature":"github.com/benbjohnson/litestream.Leaser.AcquireLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[26,1],"end":[26,51],"bytes":[488,538]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.Leaser.ReleaseLease":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Leaser/github.com/benbjohnson/litestream.Leaser.ReleaseLease","kind":"method","span":{"start":[28,1],"end":[28,55],"bytes":[602,656]},"signature":"github.com/benbjohnson/litestream.Leaser.ReleaseLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[28,1],"end":[28,55],"bytes":[602,656]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[28,1],"end":[28,55],"bytes":[602,656]}}],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.Leaser.RenewLease":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Leaser/github.com/benbjohnson/litestream.Leaser.RenewLease","kind":"method","span":{"start":[27,1],"end":[27,63],"bytes":[539,601]},"signature":"github.com/benbjohnson/litestream.Leaser.RenewLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[27,1],"end":[27,63],"bytes":[539,601]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[27,1],"end":[27,63],"bytes":[539,601]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.Leaser.Type":{"id":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Leaser/github.com/benbjohnson/litestream.Leaser.Type","kind":"method","span":{"start":[25,1],"end":[25,15],"bytes":[473,487]},"signature":"github.com/benbjohnson/litestream.Leaser.Type","parameters":[],"return_type":"string","body":{}}}}},"functions":{},"content_hash":"86026b64494febb4e5dd447ddebcb76377306ae30fe8d8dcb68428d9833e9b1a"},"litestream.go":{"id":"can://litestream/litestream/go/litestream.go","kind":"module","span":{"start":[1,1],"end":[214,1],"bytes":[0,6059]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/superfly/ltx\"\n\t_ \"modernc.org/sqlite\"\n)\n\n// Naming constants.\nconst (\n\tMetaDirSuffix = \"-litestream\"\n)\n\n// SQLite checkpoint modes.\nconst (\n\tCheckpointModePassive = \"PASSIVE\"\n\tCheckpointModeFull = \"FULL\"\n\tCheckpointModeRestart = \"RESTART\"\n\tCheckpointModeTruncate = \"TRUNCATE\"\n)\n\n// Litestream errors.\nvar (\n\tErrNoSnapshots = errors.New(\"no snapshots available\")\n\tErrChecksumMismatch = errors.New(\"invalid replica, checksum mismatch\")\n\tErrLTXCorrupted = errors.New(\"ltx file corrupted\")\n\tErrLTXMissing = errors.New(\"ltx file missing\")\n\tErrDiskFull = errors.New(\"disk full\")\n)\n\n// LTXError provides detailed context for LTX file errors with recovery hints.\ntype LTXError struct {\n\tOp string // Operation that failed (e.g., \"open\", \"read\", \"validate\")\n\tPath string // File path\n\tLevel int // LTX level (0 = L0, etc.)\n\tMinTXID uint64 // Minimum transaction ID\n\tMaxTXID uint64 // Maximum transaction ID\n\tErr error // Underlying error\n\tHint string // Recovery hint for users\n}\n\nfunc (e *LTXError) Error() string {\n\tif e.Path != \"\" {\n\t\treturn e.Op + \" ltx file \" + e.Path + \": \" + e.Err.Error()\n\t}\n\treturn e.Op + \" ltx file: \" + e.Err.Error()\n}\n\nfunc (e *LTXError) Unwrap() error { return e.Err }\n\n// IsAutoRecoverable reports whether the underlying error indicates local state\n// corruption that can be fixed by resetting and re-downloading from remote.\n// Returns false for transient OS errors (EMFILE, EIO, EACCES) that should be\n// retried with backoff instead.\nfunc (e *LTXError) IsAutoRecoverable() bool {\n\tif os.IsNotExist(e.Err) || errors.Is(e.Err, ErrLTXMissing) {\n\t\treturn true\n\t}\n\tif errors.Is(e.Err, ErrLTXCorrupted) || errors.Is(e.Err, ErrChecksumMismatch) {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// NewLTXError creates a new LTX error with appropriate hints based on the error type.\nfunc NewLTXError(op, path string, level int, minTXID, maxTXID uint64, err error) *LTXError {\n\tltxErr := \u0026LTXError{\n\t\tOp: op,\n\t\tPath: path,\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tErr: err,\n\t}\n\n\t// Set appropriate hint based on error type\n\tif os.IsNotExist(err) || errors.Is(err, ErrLTXMissing) {\n\t\tltxErr.Hint = \"LTX file is missing. This can happen after VACUUM, manual checkpoint, or state corruption. \" +\n\t\t\t\"Run 'litestream reset \u003cdb\u003e' or delete the .sqlite-litestream directory and restart.\"\n\t} else if errors.Is(err, ErrLTXCorrupted) || errors.Is(err, ErrChecksumMismatch) {\n\t\tltxErr.Hint = \"LTX file is corrupted. Delete the .sqlite-litestream directory and restart to recover from replica.\"\n\t}\n\n\treturn ltxErr\n}\n\n// isShutdownError reports whether err is a context error caused by ctx itself\n// being done. Context errors that occur while ctx is still live, such as a\n// replica client whose credentials are bound to a cancelled context, are real\n// failures and must not be silently ignored.\nfunc isShutdownError(ctx context.Context, err error) bool {\n\treturn ctx.Err() != nil \u0026\u0026 (errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded))\n}\n\n// SQLite WAL constants.\nconst (\n\tWALHeaderChecksumOffset = 24\n\tWALFrameHeaderChecksumOffset = 16\n)\n\nvar (\n\t// LogWriter is the destination writer for all logging.\n\tLogWriter = os.Stdout\n\n\t// LogFlags are the flags passed to log.New().\n\tLogFlags = 0\n)\n\n// Checksum computes a running SQLite checksum over a byte slice.\nfunc Checksum(bo binary.ByteOrder, s0, s1 uint32, b []byte) (uint32, uint32) {\n\tassert(len(b)%8 == 0, \"misaligned checksum byte slice\")\n\n\t// Iterate over 8-byte units and compute checksum.\n\tfor i := 0; i \u003c len(b); i += 8 {\n\t\ts0 += bo.Uint32(b[i:]) + s1\n\t\ts1 += bo.Uint32(b[i+4:]) + s0\n\t}\n\treturn s0, s1\n}\n\nconst (\n\t// WALHeaderSize is the size of the WAL header, in bytes.\n\tWALHeaderSize = 32\n\n\t// WALFrameHeaderSize is the size of the WAL frame header, in bytes.\n\tWALFrameHeaderSize = 24\n)\n\n// rollback rolls back tx. Ignores already-rolled-back errors.\nfunc rollback(tx *sql.Tx) error {\n\tif err := tx.Rollback(); err != nil \u0026\u0026 !strings.Contains(err.Error(), `transaction has already been committed or rolled back`) {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// readWALHeader returns the header read from a WAL file.\nfunc readWALHeader(filename string) ([]byte, error) {\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer f.Close()\n\n\tbuf := make([]byte, WALHeaderSize)\n\tn, err := io.ReadFull(f, buf)\n\treturn buf[:n], err\n}\n\n// readWALFileAt reads a slice from a file. Do not use this with database files\n// as it causes problems with non-OFD locks.\nfunc readWALFileAt(filename string, offset, n int64) ([]byte, error) {\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer f.Close()\n\n\tbuf := make([]byte, n)\n\tif n, err := f.ReadAt(buf, offset); err != nil {\n\t\treturn buf[:n], err\n\t} else if n \u003c len(buf) {\n\t\treturn buf[:n], io.ErrUnexpectedEOF\n\t}\n\treturn buf, nil\n}\n\n// removeTmpFiles recursively finds and removes .tmp files.\nfunc removeTmpFiles(root string) error {\n\treturn filepath.Walk(root, func(path string, info os.FileInfo, err error) error {\n\t\tswitch {\n\t\tcase err != nil:\n\t\t\treturn nil // skip errored files\n\t\tcase info.IsDir():\n\t\t\treturn nil // skip directories\n\t\tcase !strings.HasSuffix(path, \".tmp\"):\n\t\t\treturn nil // skip non-temp files\n\t\tdefault:\n\t\t\treturn os.Remove(path)\n\t\t}\n\t})\n}\n\n// LTXDir returns the path to an LTX directory.\nfunc LTXDir(root string) string {\n\treturn path.Join(root, \"ltx\")\n}\n\n// LTXLevelDir returns the path to an LTX level directory.\nfunc LTXLevelDir(root string, level int) string {\n\treturn path.Join(LTXDir(root), strconv.Itoa(level))\n}\n\n// LTXFilePath returns the path to a single LTX file.\nfunc LTXFilePath(root string, level int, minTXID, maxTXID ltx.TXID) string {\n\treturn path.Join(LTXLevelDir(root, level), ltx.FormatFilename(minTXID, maxTXID))\n}\n\nfunc assert(condition bool, message string) {\n\tif !condition {\n\t\tpanic(\"assertion failed: \" + message)\n\t}\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"sql","path":"database/sql","span":{"start":[5,1],"end":[5,16],"bytes":[40,55]}},{"name":"binary","path":"encoding/binary","span":{"start":[6,1],"end":[6,19],"bytes":[56,74]}},{"name":"errors","path":"errors","span":{"start":[7,1],"end":[7,10],"bytes":[75,84]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[85,90]}},{"name":"os","path":"os","span":{"start":[9,1],"end":[9,6],"bytes":[91,96]}},{"name":"path","path":"path","span":{"start":[10,1],"end":[10,8],"bytes":[97,104]}},{"name":"filepath","path":"path/filepath","span":{"start":[11,1],"end":[11,17],"bytes":[105,121]}},{"name":"strconv","path":"strconv","span":{"start":[12,1],"end":[12,11],"bytes":[122,132]}},{"name":"strings","path":"strings","span":{"start":[13,1],"end":[13,11],"bytes":[133,143]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[15,1],"end":[15,27],"bytes":[145,171]}},{"name":"sqlite","path":"modernc.org/sqlite","alias":"_","span":{"start":[16,1],"end":[16,24],"bytes":[172,195]}}],"types":{"LTXError":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError","kind":"struct","span":{"start":[42,1],"end":[50,2],"bytes":[842,1178]},"callables":{"github.com/benbjohnson/litestream.LTXError.Error":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.Error","kind":"method","span":{"start":[52,1],"end":[57,2],"bytes":[1180,1345]},"signature":"github.com/benbjohnson/litestream.LTXError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"54:48":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.Error@54:48","span":{"start":[54,48],"end":[54,61],"bytes":[1282,1295]},"callee":null},"56:32":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.Error@56:32","span":{"start":[56,32],"end":[56,45],"bytes":[1330,1343]},"callee":null}}},"github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable","kind":"method","span":{"start":[65,1],"end":[73,2],"bytes":[1667,1905]},"signature":"github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable","parameters":[],"return_type":"bool","metrics":{"cyclomatic":3},"body":{"66:29":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable@66:29","span":{"start":[66,29],"end":[66,60],"bytes":[1741,1772]},"callee":"can://litestream/litestream/@external/errors/Is"},"66:5":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable@66:5","span":{"start":[66,5],"end":[66,25],"bytes":[1717,1737]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"69:42":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable@69:42","span":{"start":[69,42],"end":[69,79],"bytes":[1833,1870]},"callee":"can://litestream/litestream/@external/errors/Is"},"69:5":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable@69:5","span":{"start":[69,5],"end":[69,38],"bytes":[1796,1829]},"callee":"can://litestream/litestream/@external/errors/Is"}}},"github.com/benbjohnson/litestream.LTXError.Unwrap":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.Unwrap","kind":"method","span":{"start":[59,1],"end":[59,51],"bytes":[1347,1397]},"signature":"github.com/benbjohnson/litestream.LTXError.Unwrap","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"Err":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/Err","kind":"field","type":"error","span":{"start":[48,1],"end":[48,36],"bytes":[1098,1133]}},"Hint":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/Hint","kind":"field","type":"string","span":{"start":[49,1],"end":[49,43],"bytes":[1134,1176]}},"Level":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/Level","kind":"field","type":"int","span":{"start":[45,1],"end":[45,44],"bytes":[970,1013]}},"MaxTXID":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/MaxTXID","kind":"field","type":"uint64","span":{"start":[47,1],"end":[47,42],"bytes":[1056,1097]}},"MinTXID":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/MinTXID","kind":"field","type":"uint64","span":{"start":[46,1],"end":[46,42],"bytes":[1014,1055]}},"Op":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/Op","kind":"field","type":"string","span":{"start":[43,1],"end":[43,76],"bytes":[865,940]}},"Path":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/Path","kind":"field","type":"string","span":{"start":[44,1],"end":[44,29],"bytes":[941,969]}}}}},"functions":{"github.com/benbjohnson/litestream.Checksum":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.Checksum","kind":"function","span":{"start":[120,1],"end":[129,2],"bytes":[3521,3825]},"signature":"github.com/benbjohnson/litestream.Checksum","parameters":[{"name":"bo","type":"encoding/binary.ByteOrder","span":{"start":[120,1],"end":[120,79],"bytes":[3521,3599]}},{"name":"s0","type":"uint32","span":{"start":[120,1],"end":[120,79],"bytes":[3521,3599]}},{"name":"s1","type":"uint32","span":{"start":[120,1],"end":[120,79],"bytes":[3521,3599]}},{"name":"b","type":"[]byte","span":{"start":[120,1],"end":[120,79],"bytes":[3521,3599]}}],"return_type":"(uint32, uint32)","metrics":{"cyclomatic":2},"body":{"121:2":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.Checksum@121:2","span":{"start":[121,2],"end":[121,57],"bytes":[3601,3656]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert"},"121:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.Checksum@121:9","span":{"start":[121,9],"end":[121,15],"bytes":[3608,3614]},"callee":null},"124:18":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.Checksum@124:18","span":{"start":[124,18],"end":[124,24],"bytes":[3727,3733]},"callee":null},"125:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.Checksum@125:9","span":{"start":[125,9],"end":[125,25],"bytes":[3752,3768]},"callee":"can://litestream/litestream/@external/encoding/binary/ByteOrder.Uint32"},"126:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.Checksum@126:9","span":{"start":[126,9],"end":[126,27],"bytes":[3782,3800]},"callee":"can://litestream/litestream/@external/encoding/binary/ByteOrder.Uint32"}}},"github.com/benbjohnson/litestream.LTXDir":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXDir","kind":"function","span":{"start":[195,1],"end":[197,2],"bytes":[5502,5568]},"signature":"github.com/benbjohnson/litestream.LTXDir","parameters":[{"name":"root","type":"string","span":{"start":[195,1],"end":[195,34],"bytes":[5502,5535]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"196:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXDir@196:9","span":{"start":[196,9],"end":[196,31],"bytes":[5544,5566]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream.LTXFilePath":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","kind":"function","span":{"start":[205,1],"end":[207,2],"bytes":[5789,5949]},"signature":"github.com/benbjohnson/litestream.LTXFilePath","parameters":[{"name":"root","type":"string","span":{"start":[205,1],"end":[205,77],"bytes":[5789,5865]}},{"name":"level","type":"int","span":{"start":[205,1],"end":[205,77],"bytes":[5789,5865]}},{"name":"minTXID","type":"invalid type","span":{"start":[205,1],"end":[205,77],"bytes":[5789,5865]}},{"name":"maxTXID","type":"invalid type","span":{"start":[205,1],"end":[205,77],"bytes":[5789,5865]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"206:19":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath@206:19","span":{"start":[206,19],"end":[206,43],"bytes":[5884,5908]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"206:45":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath@206:45","span":{"start":[206,45],"end":[206,81],"bytes":[5910,5946]},"callee":null},"206:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath@206:9","span":{"start":[206,9],"end":[206,82],"bytes":[5874,5947]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream.LTXLevelDir":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","kind":"function","span":{"start":[200,1],"end":[202,2],"bytes":[5629,5733]},"signature":"github.com/benbjohnson/litestream.LTXLevelDir","parameters":[{"name":"root","type":"string","span":{"start":[200,1],"end":[200,50],"bytes":[5629,5678]}},{"name":"level","type":"int","span":{"start":[200,1],"end":[200,50],"bytes":[5629,5678]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"201:19":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir@201:19","span":{"start":[201,19],"end":[201,31],"bytes":[5697,5709]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXDir"},"201:33":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir@201:33","span":{"start":[201,33],"end":[201,52],"bytes":[5711,5730]},"callee":"can://litestream/litestream/@external/strconv/Itoa"},"201:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir@201:9","span":{"start":[201,9],"end":[201,53],"bytes":[5687,5731]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream.NewLTXError":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","kind":"function","span":{"start":[76,1],"end":[95,2],"bytes":[1994,2745]},"signature":"github.com/benbjohnson/litestream.NewLTXError","parameters":[{"name":"op","type":"string","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"path","type":"string","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"level","type":"int","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"minTXID","type":"uint64","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"maxTXID","type":"uint64","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}},{"name":"err","type":"error","span":{"start":[76,1],"end":[76,93],"bytes":[1994,2086]}}],"return_type":"*github.com/benbjohnson/litestream.LTXError","metrics":{"cyclomatic":3},"body":{"87:27":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError@87:27","span":{"start":[87,27],"end":[87,56],"bytes":[2290,2319]},"callee":"can://litestream/litestream/@external/errors/Is"},"87:5":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError@87:5","span":{"start":[87,5],"end":[87,23],"bytes":[2268,2286]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"90:12":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError@90:12","span":{"start":[90,12],"end":[90,43],"bytes":[2534,2565]},"callee":"can://litestream/litestream/@external/errors/Is"},"90:47":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError@90:47","span":{"start":[90,47],"end":[90,82],"bytes":[2569,2604]},"callee":"can://litestream/litestream/@external/errors/Is"}}},"github.com/benbjohnson/litestream.assert":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert","kind":"function","span":{"start":[209,1],"end":[213,2],"bytes":[5951,6058]},"signature":"github.com/benbjohnson/litestream.assert","parameters":[{"name":"condition","type":"bool","span":{"start":[209,1],"end":[209,46],"bytes":[5951,5996]}},{"name":"message","type":"string","span":{"start":[209,1],"end":[209,46],"bytes":[5951,5996]}}],"metrics":{"cyclomatic":2},"body":{"211:3":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert@211:3","span":{"start":[211,3],"end":[211,40],"bytes":[6016,6053]},"callee":null}}},"github.com/benbjohnson/litestream.isShutdownError":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","kind":"function","span":{"start":[101,1],"end":[103,2],"bytes":[3027,3195]},"signature":"github.com/benbjohnson/litestream.isShutdownError","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[101,1],"end":[101,60],"bytes":[3027,3086]}},{"name":"err","type":"error","span":{"start":[101,1],"end":[101,60],"bytes":[3027,3086]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"102:30":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError@102:30","span":{"start":[102,30],"end":[102,62],"bytes":[3116,3148]},"callee":"can://litestream/litestream/@external/errors/Is"},"102:66":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError@102:66","span":{"start":[102,66],"end":[102,106],"bytes":[3152,3192]},"callee":"can://litestream/litestream/@external/errors/Is"},"102:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError@102:9","span":{"start":[102,9],"end":[102,18],"bytes":[3095,3104]},"callee":"can://litestream/litestream/@external/context/Context.Err"}}},"github.com/benbjohnson/litestream.readWALFileAt":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt","kind":"function","span":{"start":[162,1],"end":[176,2],"bytes":[4684,5021]},"signature":"github.com/benbjohnson/litestream.readWALFileAt","parameters":[{"name":"filename","type":"string","span":{"start":[162,1],"end":[162,71],"bytes":[4684,4754]}},{"name":"offset","type":"int64","span":{"start":[162,1],"end":[162,71],"bytes":[4684,4754]}},{"name":"n","type":"int64","span":{"start":[162,1],"end":[162,71],"bytes":[4684,4754]}}],"return_type":"([]byte, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"163:12":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt@163:12","span":{"start":[163,12],"end":[163,29],"bytes":[4766,4783]},"callee":"can://litestream/litestream/@external/os/Open"},"167:8":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt@167:8","span":{"start":[167,8],"end":[167,17],"bytes":[4829,4838]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"169:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt@169:9","span":{"start":[169,9],"end":[169,24],"bytes":[4848,4863]},"callee":null},"170:15":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt@170:15","span":{"start":[170,15],"end":[170,36],"bytes":[4878,4899]},"callee":"can://litestream/litestream/@external/os/File.ReadAt"},"172:16":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt@172:16","span":{"start":[172,16],"end":[172,24],"bytes":[4951,4959]},"callee":null}}},"github.com/benbjohnson/litestream.readWALHeader":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader","kind":"function","span":{"start":[148,1],"end":[158,2],"bytes":[4329,4557]},"signature":"github.com/benbjohnson/litestream.readWALHeader","parameters":[{"name":"filename","type":"string","span":{"start":[148,1],"end":[148,54],"bytes":[4329,4382]}}],"return_type":"([]byte, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"149:12":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader@149:12","span":{"start":[149,12],"end":[149,29],"bytes":[4394,4411]},"callee":"can://litestream/litestream/@external/os/Open"},"153:8":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader@153:8","span":{"start":[153,8],"end":[153,17],"bytes":[4457,4466]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"155:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader@155:9","span":{"start":[155,9],"end":[155,36],"bytes":[4476,4503]},"callee":null},"156:12":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader@156:12","span":{"start":[156,12],"end":[156,31],"bytes":[4515,4534]},"callee":"can://litestream/litestream/@external/io/ReadFull"}}},"github.com/benbjohnson/litestream.removeTmpFiles":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles","kind":"function","span":{"start":[179,1],"end":[192,2],"bytes":[5083,5452]},"signature":"github.com/benbjohnson/litestream.removeTmpFiles","parameters":[{"name":"root","type":"string","span":{"start":[179,1],"end":[179,41],"bytes":[5083,5123]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"180:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles@180:9","span":{"start":[180,9],"end":[191,4],"bytes":[5132,5450]},"callee":"can://litestream/litestream/@external/path/filepath/Walk"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles/github.com/benbjohnson/litestream.removeTmpFiles.closure_1","kind":"function","span":{"start":[180,1],"end":[191,4],"bytes":[5124,5450]},"signature":"github.com/benbjohnson/litestream.removeTmpFiles.closure_1","parameters":[{"name":"path","type":"string","span":{"start":[180,1],"end":[180,83],"bytes":[5124,5206]}},{"name":"info","type":"os.FileInfo","span":{"start":[180,1],"end":[180,83],"bytes":[5124,5206]}},{"name":"err","type":"error","span":{"start":[180,1],"end":[180,83],"bytes":[5124,5206]}}],"return_type":"error","error_channel":["error"],"body":{"184:8":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles/github.com/benbjohnson/litestream.removeTmpFiles.closure_1@184:8","span":{"start":[184,8],"end":[184,20],"bytes":[5280,5292]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir"},"186:9":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles/github.com/benbjohnson/litestream.removeTmpFiles.closure_1@186:9","span":{"start":[186,9],"end":[186,40],"bytes":[5336,5367]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"},"189:11":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles/github.com/benbjohnson/litestream.removeTmpFiles.closure_1@189:11","span":{"start":[189,11],"end":[189,26],"bytes":[5427,5442]},"callee":"can://litestream/litestream/@external/os/Remove"}}}}},"github.com/benbjohnson/litestream.rollback":{"id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback","kind":"function","span":{"start":[140,1],"end":[145,2],"bytes":[4076,4269]},"signature":"github.com/benbjohnson/litestream.rollback","parameters":[{"name":"tx","type":"*database/sql.Tx","span":{"start":[140,1],"end":[140,34],"bytes":[4076,4109]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"141:12":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback@141:12","span":{"start":[141,12],"end":[141,25],"bytes":[4121,4134]},"callee":"can://litestream/litestream/@external/database/sql/Tx.Rollback"},"141:42":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback@141:42","span":{"start":[141,42],"end":[141,128],"bytes":[4151,4237]},"callee":"can://litestream/litestream/@external/strings/Contains"},"141:59":{"kind":"call","id":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback@141:59","span":{"start":[141,59],"end":[141,70],"bytes":[4168,4179]},"callee":null}}}},"content_hash":"e4b652a8e8b83c18ff7d9f824a98e686528587ce7eba00d1a216bc5122e655b9"},"log.go":{"id":"can://litestream/litestream/go/log.go","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,265]},"package":"litestream","source":"package litestream\n\nconst (\n\tLogKeySystem = \"system\"\n\tLogKeySubsystem = \"subsystem\"\n\tLogKeyDB = \"db\"\n)\n\nconst (\n\tLogSystemStore = \"store\"\n\tLogSystemServer = \"server\"\n)\n\nconst (\n\tLogSubsystemCompactor = \"compactor\"\n\tLogSubsystemWALReader = \"wal-reader\"\n)\n","imports":[],"types":{},"functions":{},"content_hash":"65bf3b1e8a77873e7202c299afb7bb22108561e035ee8dcd82da238b625816d4"},"mock/replica_client.go":{"id":"can://litestream/litestream/go/mock/replica_client.go","kind":"module","span":{"start":[1,1],"end":[54,1],"bytes":[0,1796]},"package":"mock","source":"package mock\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"log/slog\"\n\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\ntype ReplicaClient struct {\n\tInitFunc func(ctx context.Context) error\n\tDeleteAllFunc func(ctx context.Context) error\n\tLTXFilesFunc func(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error)\n\tOpenLTXFileFunc func(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error)\n\tWriteLTXFileFunc func(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error)\n\tDeleteLTXFilesFunc func(ctx context.Context, a []*ltx.FileInfo) error\n}\n\nfunc (c *ReplicaClient) Type() string { return \"mock\" }\n\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\tif c.InitFunc != nil {\n\t\treturn c.InitFunc(ctx)\n\t}\n\treturn nil\n}\n\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\treturn c.DeleteAllFunc(ctx)\n}\n\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\treturn c.LTXFilesFunc(ctx, level, seek, useMetadata)\n}\n\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\treturn c.OpenLTXFileFunc(ctx, level, minTXID, maxTXID, offset, size)\n}\n\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\treturn c.WriteLTXFileFunc(ctx, level, minTXID, maxTXID, r)\n}\n\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\treturn c.DeleteLTXFilesFunc(ctx, a)\n}\n\nfunc (c *ReplicaClient) SetLogger(_ *slog.Logger) {}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[23,33]}},{"name":"io","path":"io","span":{"start":[5,1],"end":[5,6],"bytes":[34,39]}},{"name":"slog","path":"log/slog","span":{"start":[6,1],"end":[6,12],"bytes":[40,51]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[8,1],"end":[8,27],"bytes":[53,79]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[10,1],"end":[10,37],"bytes":[81,117]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient","kind":"struct","span":{"start":[15,1],"end":[22,2],"bytes":[177,744]},"callables":{"github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteAll","kind":"method","span":{"start":[33,1],"end":[35,2],"bytes":[928,1021]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[33,1],"end":[33,63],"bytes":[928,990]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"34:9":{"kind":"call","id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteAll@34:9","span":{"start":[34,9],"end":[34,29],"bytes":[999,1019]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[49,1],"end":[51,2],"bytes":[1616,1741]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[49,1],"end":[49,87],"bytes":[1616,1702]}},{"name":"a","type":"[]invalid type","span":{"start":[49,1],"end":[49,87],"bytes":[1616,1702]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"50:9":{"kind":"call","id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.DeleteLTXFiles@50:9","span":{"start":[50,9],"end":[50,37],"bytes":[1711,1739]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.Init":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.Init","kind":"method","span":{"start":[26,1],"end":[31,2],"bytes":[803,926]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[26,1],"end":[26,58],"bytes":[803,860]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"28:10":{"kind":"call","id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.Init@28:10","span":{"start":[28,10],"end":[28,25],"bytes":[894,909]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.LTXFiles","kind":"method","span":{"start":[37,1],"end":[39,2],"bytes":[1023,1204]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[37,1],"end":[37,126],"bytes":[1023,1148]}},{"name":"level","type":"int","span":{"start":[37,1],"end":[37,126],"bytes":[1023,1148]}},{"name":"seek","type":"invalid type","span":{"start":[37,1],"end":[37,126],"bytes":[1023,1148]}},{"name":"useMetadata","type":"bool","span":{"start":[37,1],"end":[37,126],"bytes":[1023,1148]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"38:9":{"kind":"call","id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.LTXFiles@38:9","span":{"start":[38,9],"end":[38,54],"bytes":[1157,1202]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[41,1],"end":[43,2],"bytes":[1206,1417]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"level","type":"int","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"minTXID","type":"invalid type","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"maxTXID","type":"invalid type","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"offset","type":"int64","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}},{"name":"size","type":"int64","span":{"start":[41,1],"end":[41,140],"bytes":[1206,1345]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"42:9":{"kind":"call","id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.OpenLTXFile@42:9","span":{"start":[42,9],"end":[42,70],"bytes":[1354,1415]},"callee":null}}},"github.com/benbjohnson/litestream/mock.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.SetLogger","kind":"method","span":{"start":[53,1],"end":[53,53],"bytes":[1743,1795]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.SetLogger","parameters":[{"name":"_","type":"*log/slog.Logger","span":{"start":[53,1],"end":[53,53],"bytes":[1743,1795]}}],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/mock.ReplicaClient.Type":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.Type","kind":"method","span":{"start":[24,1],"end":[24,56],"bytes":[746,801]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/mock.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[45,1],"end":[47,2],"bytes":[1419,1614]},"signature":"github.com/benbjohnson/litestream/mock.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}},{"name":"level","type":"int","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}},{"name":"minTXID","type":"invalid type","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}},{"name":"maxTXID","type":"invalid type","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}},{"name":"r","type":"io.Reader","span":{"start":[45,1],"end":[45,134],"bytes":[1419,1552]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"46:9":{"kind":"call","id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/github.com/benbjohnson/litestream/mock.ReplicaClient.WriteLTXFile@46:9","span":{"start":[46,9],"end":[46,60],"bytes":[1561,1612]},"callee":null}}}},"fields":{"DeleteAllFunc":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/DeleteAllFunc","kind":"field","type":"func(ctx context.Context) error","span":{"start":[17,1],"end":[17,52],"bytes":[257,308]}},"DeleteLTXFilesFunc":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/DeleteLTXFilesFunc","kind":"field","type":"func(ctx context.Context, a []invalid type) error","span":{"start":[21,1],"end":[21,71],"bytes":[672,742]}},"InitFunc":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/InitFunc","kind":"field","type":"func(ctx context.Context) error","span":{"start":[16,1],"end":[16,52],"bytes":[205,256]}},"LTXFilesFunc":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/LTXFilesFunc","kind":"field","type":"func(ctx context.Context, level int, seek invalid type, useMetadata bool) (invalid type, error)","span":{"start":[18,1],"end":[18,116],"bytes":[309,424]}},"OpenLTXFileFunc":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/OpenLTXFileFunc","kind":"field","type":"func(ctx context.Context, level int, minTXID invalid type, maxTXID invalid type, offset int64, size int64) (io.ReadCloser, error)","span":{"start":[19,1],"end":[19,127],"bytes":[425,551]}},"WriteLTXFileFunc":{"id":"can://litestream/litestream/go/mock/replica_client.go/github.com/benbjohnson/litestream/mock.ReplicaClient/WriteLTXFileFunc","kind":"field","type":"func(ctx context.Context, level int, minTXID invalid type, maxTXID invalid type, r io.Reader) (invalid type, error)","span":{"start":[20,1],"end":[20,120],"bytes":[552,671]}}}}},"functions":{},"content_hash":"e4ae0946c515afc92b2b5c565860eb69a9495833baf931bf4947550cadb1926b"},"nats/replica_client.go":{"id":"can://litestream/litestream/go/nats/replica_client.go","kind":"module","span":{"start":[1,1],"end":[521,1],"bytes":[0,15428]},"package":"nats","source":"package nats\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/nats-io/nats.go\"\n\t\"github.com/nats-io/nats.go/jetstream\"\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"nats\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"nats\"\n\n// HeaderKeyTimestamp is the header key for storing LTX file timestamps in NATS object headers.\nconst HeaderKeyTimestamp = \"Litestream-Timestamp\"\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to NATS JetStream Object Store.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tlogger *slog.Logger\n\n\t// NATS connection and JetStream context\n\tnc *nats.Conn\n\tjs jetstream.JetStream\n\tobjectStore jetstream.ObjectStore\n\n\t// Configuration\n\tURL string // NATS server URL\n\tBucketName string // Object store bucket name\n\tPath string // Base path for LTX files within the bucket\n\tJWT string // JWT token for authentication\n\tSeed string // Seed for JWT authentication\n\tCreds string // Credentials file path\n\tNKey string // NKey for authentication\n\tUsername string // Username for authentication\n\tPassword string // Password for authentication\n\tToken string // Token for authentication\n\tTLS bool // Enable TLS\n\tRootCAs []string // Root CA certificates\n\tClientCert string // Client certificate file path\n\tClientKey string // Client key file path\n\n\t// Note: Bucket configuration (replicas, storage, TTL, etc.) should be\n\t// managed externally via NATS CLI or API, not by Litestream\n\n\t// Connection options\n\tMaxReconnects int // Maximum reconnection attempts (-1 for unlimited)\n\tReconnectWait time.Duration // Wait time between reconnection attempts\n\tReconnectJitter time.Duration // Random jitter for reconnection\n\tTimeout time.Duration // Connection timeout\n\tPingInterval time.Duration // Ping interval\n\tMaxPingsOut int // Maximum number of pings without response\n\tReconnectBufSize int // Reconnection buffer size\n\tUserJWT func() (string, error) // JWT callback\n\tSigCB func([]byte) ([]byte, error) // Signature callback\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tMaxReconnects: -1, // Unlimited\n\t\tReconnectWait: 2 * time.Second,\n\t\tTimeout: 10 * time.Second,\n\t\tPingInterval: 2 * time.Minute,\n\t\tMaxPingsOut: 2,\n\t\tReconnectBufSize: 8 * 1024 * 1024, // 8MB\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: nats://[user:pass@]host[:port]/bucket\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\t// Reconstruct URL without bucket path\n\tif host != \"\" {\n\t\tclient.URL = fmt.Sprintf(\"nats://%s\", host)\n\t}\n\n\t// Extract credentials from userinfo if present\n\tif userinfo != nil {\n\t\tclient.Username = userinfo.Username()\n\t\tclient.Password, _ = userinfo.Password()\n\t}\n\n\t// Extract bucket name from path\n\tbucket := strings.Trim(urlPath, \"/\")\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for nats replica URL\")\n\t}\n\tclient.BucketName = bucket\n\n\treturn client, nil\n}\n\n// Type returns \"nats\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to NATS JetStream. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.objectStore != nil {\n\t\treturn nil\n\t}\n\n\tif c.nc == nil {\n\t\tif err := c.connect(ctx); err != nil {\n\t\t\treturn fmt.Errorf(\"nats: failed to connect: %w\", err)\n\t\t}\n\t}\n\n\tif err := c.initObjectStore(ctx); err != nil {\n\t\treturn fmt.Errorf(\"nats: failed to initialize object store: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// connect establishes a connection to NATS server with proper configuration.\nfunc (c *ReplicaClient) connect(_ context.Context) error {\n\turl := c.URL\n\tif url == \"\" {\n\t\turl = nats.DefaultURL\n\t}\n\n\tnc, err := nats.Connect(url, c.options()...)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to connect to NATS server: %w\", err)\n\t}\n\n\tjs, err := jetstream.New(nc)\n\tif err != nil {\n\t\tnc.Close()\n\t\treturn fmt.Errorf(\"failed to create JetStream context: %w\", err)\n\t}\n\n\tc.nc = nc\n\tc.js = js\n\treturn nil\n}\n\nfunc (c *ReplicaClient) options() []nats.Option {\n\topts := []nats.Option{\n\t\tnats.MaxReconnects(c.MaxReconnects),\n\t\tnats.ReconnectWait(c.ReconnectWait),\n\t\tnats.ReconnectJitter(c.ReconnectJitter, c.ReconnectJitter*2),\n\t\tnats.Timeout(c.Timeout),\n\t\tnats.PingInterval(c.PingInterval),\n\t\tnats.MaxPingsOutstanding(c.MaxPingsOut),\n\t\tnats.ReconnectBufSize(c.ReconnectBufSize),\n\t}\n\n\t// Authentication options\n\tswitch {\n\tcase c.JWT != \"\" \u0026\u0026 c.Seed != \"\":\n\t\topts = append(opts, nats.UserJWTAndSeed(c.JWT, c.Seed))\n\tcase c.Creds != \"\":\n\t\topts = append(opts, nats.UserCredentials(c.Creds))\n\tcase c.NKey != \"\":\n\t\topts = append(opts, nats.Nkey(c.NKey, c.SigCB))\n\tcase c.Username != \"\" \u0026\u0026 c.Password != \"\":\n\t\topts = append(opts, nats.UserInfo(c.Username, c.Password))\n\tcase c.Token != \"\":\n\t\topts = append(opts, nats.Token(c.Token))\n\t}\n\t// JWT callback\n\tif c.UserJWT != nil {\n\t\topts = append(opts, nats.UserJWT(c.UserJWT, c.SigCB))\n\t}\n\n\t// TLS configuration\n\tif c.TLS {\n\t\topts = append(opts, nats.Secure())\n\t}\n\n\tif c.ClientCert != \"\" \u0026\u0026 c.ClientKey != \"\" {\n\t\topts = append(opts, nats.ClientCert(c.ClientCert, c.ClientKey))\n\t}\n\n\tif len(c.RootCAs) \u003e 0 {\n\t\topts = append(opts, nats.RootCAs(c.RootCAs...))\n\t}\n\n\treturn opts\n}\n\n// initObjectStore retrieves the existing object store bucket.\n// The bucket must be pre-created using the NATS CLI or API.\nfunc (c *ReplicaClient) initObjectStore(ctx context.Context) error {\n\tif c.BucketName == \"\" {\n\t\treturn fmt.Errorf(\"bucket name is required\")\n\t}\n\n\t// Get existing object store - do not auto-create\n\tobjectStore, err := c.js.ObjectStore(ctx, c.BucketName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to access object store bucket %q (bucket must be created beforehand): %w\", c.BucketName, err)\n\t}\n\n\tc.objectStore = objectStore\n\treturn nil\n}\n\n// Close closes the NATS connection.\nfunc (c *ReplicaClient) Close() error {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.nc != nil {\n\t\tc.nc.Close()\n\t\tc.nc = nil\n\t\tc.js = nil\n\t\tc.objectStore = nil\n\t}\n\treturn nil\n}\n\n// ltxPath returns the object path for an LTX file.\nfunc (c *ReplicaClient) ltxPath(level int, minTXID, maxTXID ltx.TXID) string {\n\treturn litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n}\n\n// parseLTXPath parses an LTX object path and returns level, minTXID, and maxTXID.\nfunc (c *ReplicaClient) parseLTXPath(objPath string) (level int, minTXID, maxTXID ltx.TXID, err error) {\n\t// Remove the base path prefix if present\n\tif c.Path != \"\" \u0026\u0026 strings.HasPrefix(objPath, c.Path+\"/\") {\n\t\tobjPath = strings.TrimPrefix(objPath, c.Path+\"/\")\n\t}\n\n\t// Expected format: \"ltx/\u003clevel\u003e/\u003cminTXID\u003e-\u003cmaxTXID\u003e.ltx\"\n\tparts := strings.Split(objPath, \"/\")\n\tif len(parts) \u003c 3 || parts[0] != \"ltx\" {\n\t\treturn 0, 0, 0, fmt.Errorf(\"invalid ltx path: %s\", objPath)\n\t}\n\n\t// Parse level\n\tif level, err = strconv.Atoi(parts[1]); err != nil {\n\t\treturn 0, 0, 0, fmt.Errorf(\"invalid level in path %s: %w\", objPath, err)\n\t}\n\n\t// Parse filename (minTXID-maxTXID.ltx)\n\tfilename := parts[2]\n\tminTXIDVal, maxTXIDVal, err := ltx.ParseFilename(filename)\n\tif err != nil {\n\t\treturn 0, 0, 0, fmt.Errorf(\"invalid filename in path %s: %w\", objPath, err)\n\t}\n\n\treturn level, minTXIDVal, maxTXIDVal, nil\n}\n\n// LTXFiles returns an iterator of all LTX files on the replica for a given level.\n// NATS always uses accurate timestamps from headers since they're included in LIST operations at zero cost.\n// The useMetadata parameter is ignored.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// List all objects in the store\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"LIST\").Inc()\n\tobjectList, err := c.objectStore.List(ctx)\n\tif err != nil {\n\t\t// NATS returns \"no objects found\" when bucket is empty, treat as empty list\n\t\tif strings.Contains(err.Error(), \"no objects found\") {\n\t\t\tobjectList = nil // Empty list\n\t\t} else {\n\t\t\treturn nil, fmt.Errorf(\"failed to list objects: %w\", err)\n\t\t}\n\t}\n\n\tprefix := litestream.LTXLevelDir(c.Path, level) + \"/\"\n\tfileInfos := make([]*ltx.FileInfo, 0, len(objectList))\n\n\tfor _, objInfo := range objectList {\n\t\t// Filter by level prefix\n\t\tif !strings.HasPrefix(objInfo.Name, prefix) {\n\t\t\tcontinue\n\t\t}\n\n\t\tfileLevel, minTXID, maxTXID, err := c.parseLTXPath(objInfo.Name)\n\t\tif err != nil {\n\t\t\tcontinue // Skip invalid paths\n\t\t}\n\n\t\tif fileLevel != level {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Apply seek filter\n\t\tif minTXID \u003c seek {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Always use accurate timestamp from headers since it's zero-cost\n\t\t// NATS includes headers in LIST operations, so no extra API call needed\n\t\tcreatedAt := objInfo.ModTime\n\t\tif objInfo.Headers != nil {\n\t\t\tif values, ok := objInfo.Headers[HeaderKeyTimestamp]; ok \u0026\u0026 len(values) \u003e 0 {\n\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, values[0]); err == nil {\n\t\t\t\t\tcreatedAt = parsed\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfileInfos = append(fileInfos, \u0026ltx.FileInfo{\n\t\t\tLevel: fileLevel,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: int64(objInfo.Size),\n\t\t\tCreatedAt: createdAt,\n\t\t})\n\t}\n\n\t// Sort by minTXID\n\tsort.Slice(fileInfos, func(i, j int) bool {\n\t\treturn fileInfos[i].MinTXID \u003c fileInfos[j].MinTXID\n\t})\n\n\treturn \u0026ltxFileIterator{files: fileInfos, index: -1}, nil\n}\n\n// OpenLTXFile returns a reader that contains an LTX file at a given TXID range.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tobjectPath := c.ltxPath(level, minTXID, maxTXID)\n\n\tobjectResult, err := c.objectStore.Get(ctx, objectPath)\n\tif err != nil {\n\t\tif isNotFoundError(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"failed to get object %s: %w\", objectPath, err)\n\t}\n\n\t// Record metrics\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\t// Note: We can't get the size from NATS object reader directly, so we skip bytes counter\n\n\t// If offset is non-zero then discard the beginning bytes.\n\tif offset \u003e 0 {\n\t\tif _, err := io.CopyN(io.Discard, objectResult, offset); err != nil {\n\t\t\tobjectResult.Close()\n\t\t\treturn nil, fmt.Errorf(\"failed to discard offset bytes: %w\", err)\n\t\t}\n\t}\n\n\t// If size is non-zero then limit the reader to the size.\n\tif size \u003e 0 {\n\t\treturn internal.LimitReadCloser(objectResult, size), nil\n\t}\n\n\treturn objectResult, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tobjectPath := c.ltxPath(level, minTXID, maxTXID)\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(r, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\trc := internal.NewReadCounter(io.MultiReader(\u0026buf, r))\n\n\t// Store timestamp in NATS object headers for accurate timestamp retrieval\n\tobjectInfo, err := c.objectStore.Put(ctx, jetstream.ObjectMeta{\n\t\tName: objectPath,\n\t\tHeaders: map[string][]string{\n\t\t\tHeaderKeyTimestamp: {timestamp.Format(time.RFC3339Nano)},\n\t\t},\n\t}, rc)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to put object %s: %w\", objectPath, err)\n\t}\n\n\t// Record metrics\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(objectInfo.Size))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: int64(objectInfo.Size),\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// DeleteLTXFiles deletes one or more LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tfor _, fileInfo := range a {\n\t\tobjectPath := c.ltxPath(fileInfo.Level, fileInfo.MinTXID, fileInfo.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", fileInfo.Level, \"minTXID\", fileInfo.MinTXID, \"maxTXID\", fileInfo.MaxTXID, \"path\", objectPath)\n\n\t\tif err := c.objectStore.Delete(ctx, objectPath); err != nil {\n\t\t\tif !isNotFoundError(err) {\n\t\t\t\treturn fmt.Errorf(\"failed to delete object %s: %w\", objectPath, err)\n\t\t\t}\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\n// DeleteAll deletes all files in the object store.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\t// List all objects in the bucket\n\tobjectList, err := c.objectStore.List(ctx)\n\tif err != nil {\n\t\t// NATS returns \"no objects found\" when bucket is empty, treat as empty list\n\t\tif strings.Contains(err.Error(), \"no objects found\") {\n\t\t\tobjectList = nil // Empty list, nothing to delete\n\t\t} else {\n\t\t\treturn fmt.Errorf(\"failed to list all objects: %w\", err)\n\t\t}\n\t}\n\n\tfor _, objInfo := range objectList {\n\t\tif err := c.objectStore.Delete(ctx, objInfo.Name); err != nil {\n\t\t\tif !isNotFoundError(err) {\n\t\t\t\treturn fmt.Errorf(\"failed to delete object %s: %w\", objInfo.Name, err)\n\t\t\t}\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\n// isNotFoundError checks if the error is a \"not found\" error.\nfunc isNotFoundError(err error) bool {\n\treturn err != nil \u0026\u0026 (errors.Is(err, jetstream.ErrObjectNotFound) || strings.Contains(err.Error(), \"not found\"))\n}\n\n// ltxFileIterator implements ltx.FileIterator for NATS object store.\ntype ltxFileIterator struct {\n\tfiles []*ltx.FileInfo\n\tindex int\n\terr error\n}\n\n// Next advances the iterator to the next file.\nfunc (itr *ltxFileIterator) Next() bool {\n\titr.index++\n\treturn itr.index \u003c len(itr.files)\n}\n\n// Item returns the current file info.\nfunc (itr *ltxFileIterator) Item() *ltx.FileInfo {\n\tif itr.index \u003c 0 || itr.index \u003e= len(itr.files) {\n\t\treturn nil\n\t}\n\treturn itr.files[itr.index]\n}\n\n// Err returns any error that occurred during iteration.\nfunc (itr *ltxFileIterator) Err() error {\n\treturn itr.err\n}\n\n// Close closes the iterator and returns any error that occurred during iteration.\nfunc (itr *ltxFileIterator) Close() error {\n\treturn itr.err\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[43,52]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[53,59]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[60,65]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[66,77]}},{"name":"url","path":"net/url","span":{"start":[10,1],"end":[10,11],"bytes":[78,88]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[89,94]}},{"name":"sort","path":"sort","span":{"start":[12,1],"end":[12,8],"bytes":[95,102]}},{"name":"strconv","path":"strconv","span":{"start":[13,1],"end":[13,11],"bytes":[103,113]}},{"name":"strings","path":"strings","span":{"start":[14,1],"end":[14,11],"bytes":[114,124]}},{"name":"sync","path":"sync","span":{"start":[15,1],"end":[15,8],"bytes":[125,132]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[133,140]}},{"name":"nats.go","path":"github.com/nats-io/nats.go","span":{"start":[18,1],"end":[18,30],"bytes":[142,171]}},{"name":"jetstream","path":"github.com/nats-io/nats.go/jetstream","span":{"start":[19,1],"end":[19,40],"bytes":[172,211]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[20,1],"end":[20,27],"bytes":[212,238]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[22,1],"end":[22,37],"bytes":[240,276]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[23,1],"end":[23,46],"bytes":[277,322]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient","kind":"struct","span":{"start":[39,1],"end":[77,2],"bytes":[795,2563]},"callables":{"github.com/benbjohnson/litestream/nats.ReplicaClient.Close":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Close","kind":"method","span":{"start":[236,1],"end":[247,2],"bytes":[6815,6987]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"237:2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Close@237:2","span":{"start":[237,2],"end":[237,13],"bytes":[6856,6867]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"238:8":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Close@238:8","span":{"start":[238,8],"end":[238,21],"bytes":[6875,6888]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"241:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Close@241:3","span":{"start":[241,3],"end":[241,15],"bytes":[6910,6922]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","kind":"method","span":{"start":[458,1],"end":[484,2],"bytes":[13661,14464]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[458,1],"end":[458,63],"bytes":[13661,13723]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"459:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@459:12","span":{"start":[459,12],"end":[459,23],"bytes":[13735,13746]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"464:21":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@464:21","span":{"start":[464,21],"end":[464,44],"bytes":[13833,13856]},"callee":null},"467:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@467:23","span":{"start":[467,23],"end":[467,34],"bytes":[13975,13986]},"callee":null},"467:6":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@467:6","span":{"start":[467,6],"end":[467,55],"bytes":[13958,14007]},"callee":"can://litestream/litestream/@external/strings/Contains"},"470:11":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@470:11","span":{"start":[470,11],"end":[470,60],"bytes":[14084,14133]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"475:13":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@475:13","span":{"start":[475,13],"end":[475,52],"bytes":[14192,14231]},"callee":null},"476:8":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@476:8","span":{"start":[476,8],"end":[476,28],"bytes":[14253,14273]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError"},"477:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@477:12","span":{"start":[477,12],"end":[477,75],"bytes":[14287,14350]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"480:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@480:3","span":{"start":[480,3],"end":[480,87],"bytes":[14362,14446]},"callee":null},"480:3/2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll@480:3/2","span":{"start":[480,3],"end":[480,81],"bytes":[14362,14440]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[436,1],"end":[455,2],"bytes":[12935,13607]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[436,1],"end":[436,87],"bytes":[12935,13021]}},{"name":"a","type":"[]invalid type","span":{"start":[436,1],"end":[436,87],"bytes":[12935,13021]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"437:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles@437:12","span":{"start":[437,12],"end":[437,23],"bytes":[13033,13044]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"442:17":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles@442:17","span":{"start":[442,17],"end":[442,78],"bytes":[13122,13183]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath"},"444:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles@444:3","span":{"start":[444,3],"end":[444,141],"bytes":[13187,13325]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"446:13":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles@446:13","span":{"start":[446,13],"end":[446,50],"bytes":[13339,13376]},"callee":null},"447:8":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles@447:8","span":{"start":[447,8],"end":[447,28],"bytes":[13398,13418]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError"},"448:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles@448:12","span":{"start":[448,12],"end":[448,73],"bytes":[13432,13493]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"451:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles@451:3","span":{"start":[451,3],"end":[451,87],"bytes":[13505,13589]},"callee":null},"451:3/2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles@451:3/2","span":{"start":[451,3],"end":[451,81],"bytes":[13505,13583]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.Init":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","kind":"method","span":{"start":[129,1],"end":[148,2],"bytes":[4115,4513]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[129,1],"end":[129,58],"bytes":[4115,4172]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"130:2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init@130:2","span":{"start":[130,2],"end":[130,13],"bytes":[4174,4185]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"131:8":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init@131:8","span":{"start":[131,8],"end":[131,21],"bytes":[4193,4206]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"138:13":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init@138:13","span":{"start":[138,13],"end":[138,27],"bytes":[4282,4296]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect"},"139:11":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init@139:11","span":{"start":[139,11],"end":[139,57],"bytes":[4321,4367]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"143:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init@143:12","span":{"start":[143,12],"end":[143,34],"bytes":[4387,4409]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore"},"144:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init@144:10","span":{"start":[144,10],"end":[144,72],"bytes":[4433,4495]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","kind":"method","span":{"start":[285,1],"end":[351,2],"bytes":[8390,10248]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[285,1],"end":[285,126],"bytes":[8390,8515]}},{"name":"level","type":"int","span":{"start":[285,1],"end":[285,126],"bytes":[8390,8515]}},{"name":"seek","type":"invalid type","span":{"start":[285,1],"end":[285,126],"bytes":[8390,8515]}},{"name":"useMetadata","type":"bool","span":{"start":[285,1],"end":[285,126],"bytes":[8390,8515]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"286:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@286:12","span":{"start":[286,12],"end":[286,23],"bytes":[8527,8538]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"291:2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@291:2","span":{"start":[291,2],"end":[291,84],"bytes":[8610,8692]},"callee":null},"291:2/2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@291:2/2","span":{"start":[291,2],"end":[291,78],"bytes":[8610,8686]},"callee":null},"292:21":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@292:21","span":{"start":[292,21],"end":[292,44],"bytes":[8713,8736]},"callee":null},"295:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@295:23","span":{"start":[295,23],"end":[295,34],"bytes":[8855,8866]},"callee":null},"295:6":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@295:6","span":{"start":[295,6],"end":[295,55],"bytes":[8838,8887]},"callee":"can://litestream/litestream/@external/strings/Contains"},"298:16":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@298:16","span":{"start":[298,16],"end":[298,61],"bytes":[8950,8995]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"302:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@302:12","span":{"start":[302,12],"end":[302,49],"bytes":[9015,9052]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"303:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@303:15","span":{"start":[303,15],"end":[303,56],"bytes":[9073,9114]},"callee":null},"303:40":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@303:40","span":{"start":[303,40],"end":[303,55],"bytes":[9098,9113]},"callee":null},"307:7":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@307:7","span":{"start":[307,7],"end":[307,46],"bytes":[9188,9227]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"311:39":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@311:39","span":{"start":[311,39],"end":[311,67],"bytes":[9285,9313]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath"},"329:64":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@329:64","span":{"start":[329,64],"end":[329,75],"bytes":[9744,9755]},"callee":null},"330:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@330:23","span":{"start":[330,23],"end":[330,62],"bytes":[9784,9823]},"callee":"can://litestream/litestream/@external/time/Parse"},"336:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@336:15","span":{"start":[336,15],"end":[342,5],"bytes":[9892,10060]},"callee":null},"340:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@340:15","span":{"start":[340,15],"end":[340,34],"bytes":[10010,10029]},"callee":null},"346:2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles@346:2","span":{"start":[346,2],"end":[348,4],"bytes":[10086,10186]},"callee":"can://litestream/litestream/@external/sort/Slice"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles.closure_1","kind":"function","span":{"start":[346,1],"end":[348,4],"bytes":[10085,10186]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles.closure_1","parameters":[{"name":"i","type":"int","span":{"start":[346,1],"end":[346,45],"bytes":[10085,10129]}},{"name":"j","type":"int","span":{"start":[346,1],"end":[346,45],"bytes":[10085,10129]}}],"return_type":"bool","body":{}}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[354,1],"end":[387,2],"bytes":[10331,11402]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"level","type":"int","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"minTXID","type":"invalid type","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"maxTXID","type":"invalid type","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"offset","type":"int64","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}},{"name":"size","type":"int64","span":{"start":[354,1],"end":[354,140],"bytes":[10331,10470]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"355:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@355:12","span":{"start":[355,12],"end":[355,23],"bytes":[10482,10493]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"359:16":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@359:16","span":{"start":[359,16],"end":[359,50],"bytes":[10545,10579]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath"},"361:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@361:23","span":{"start":[361,23],"end":[361,57],"bytes":[10603,10637]},"callee":null},"363:6":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@363:6","span":{"start":[363,6],"end":[363,26],"bytes":[10660,10680]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError"},"366:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@366:15","span":{"start":[366,15],"end":[366,73],"bytes":[10731,10789]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"370:2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@370:2","span":{"start":[370,2],"end":[370,83],"bytes":[10814,10895]},"callee":null},"370:2/2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@370:2/2","span":{"start":[370,2],"end":[370,77],"bytes":[10814,10889]},"callee":null},"375:16":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@375:16","span":{"start":[375,16],"end":[375,58],"bytes":[11080,11122]},"callee":"can://litestream/litestream/@external/io/CopyN"},"376:4":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@376:4","span":{"start":[376,4],"end":[376,24],"bytes":[11140,11160]},"callee":null},"377:16":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@377:16","span":{"start":[377,16],"end":[377,69],"bytes":[11176,11229]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"383:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile@383:10","span":{"start":[383,10],"end":[383,54],"bytes":[11321,11365]},"callee":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser"}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.SetLogger","kind":"method","span":{"start":[92,1],"end":[94,2],"bytes":[2978,3084]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[92,1],"end":[92,57],"bytes":[2978,3034]}}],"metrics":{"cyclomatic":1},"body":{"93:13":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.SetLogger@93:13","span":{"start":[93,13],"end":[93,48],"bytes":[3047,3082]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.Type":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Type","kind":"method","span":{"start":[124,1],"end":[126,2],"bytes":[3962,4029]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[390,1],"end":[433,2],"bytes":[11455,12884]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}},{"name":"level","type":"int","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}},{"name":"minTXID","type":"invalid type","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}},{"name":"maxTXID","type":"invalid type","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}},{"name":"r","type":"io.Reader","span":{"start":[390,1],"end":[390,134],"bytes":[11455,11588]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"391:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@391:12","span":{"start":[391,12],"end":[391,23],"bytes":[11600,11611]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init"},"395:16":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@395:16","span":{"start":[395,16],"end":[395,50],"bytes":[11663,11697]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath"},"399:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@399:15","span":{"start":[399,15],"end":[399,36],"bytes":[11808,11829]},"callee":"can://litestream/litestream/@external/io/TeeReader"},"402:17":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@402:17","span":{"start":[402,17],"end":[402,42],"bytes":[11885,11910]},"callee":null},"404:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@404:15","span":{"start":[404,15],"end":[404,71],"bytes":[11942,11998]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"406:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@406:15","span":{"start":[406,15],"end":[406,50],"bytes":[12016,12051]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"406:15/2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@406:15/2","span":{"start":[406,15],"end":[406,44],"bytes":[12016,12045]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"409:32":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@409:32","span":{"start":[409,32],"end":[409,55],"bytes":[12130,12153]},"callee":"can://litestream/litestream/@external/io/MultiReader"},"409:8":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@409:8","span":{"start":[409,8],"end":[409,56],"bytes":[12106,12154]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter"},"412:21":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@412:21","span":{"start":[412,21],"end":[417,8],"bytes":[12252,12422]},"callee":null},"415:25":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@415:25","span":{"start":[415,25],"end":[415,59],"bytes":[12373,12407]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"419:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@419:15","span":{"start":[419,15],"end":[419,73],"bytes":[12454,12512]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"423:2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@423:2","span":{"start":[423,2],"end":[423,83],"bytes":[12537,12618]},"callee":null},"423:2/2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@423:2/2","span":{"start":[423,2],"end":[423,77],"bytes":[12537,12612]},"callee":null},"424:2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@424:2","span":{"start":[424,2],"end":[424,107],"bytes":[12620,12725]},"callee":null},"424:2/2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@424:2/2","span":{"start":[424,2],"end":[424,77],"bytes":[12620,12695]},"callee":null},"424:82":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@424:82","span":{"start":[424,82],"end":[424,106],"bytes":[12700,12724]},"callee":null},"430:14":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile@430:14","span":{"start":[430,14],"end":[430,36],"bytes":[12827,12849]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.connect":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect","kind":"method","span":{"start":[151,1],"end":[171,2],"bytes":[4593,5008]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.connect","parameters":[{"name":"_","type":"context.Context","span":{"start":[151,1],"end":[151,59],"bytes":[4593,4651]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"157:13":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect@157:13","span":{"start":[157,13],"end":[157,46],"bytes":[4722,4755]},"callee":null},"157:31":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect@157:31","span":{"start":[157,31],"end":[157,42],"bytes":[4740,4751]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options"},"159:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect@159:10","span":{"start":[159,10],"end":[159,65],"bytes":[4782,4837]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"162:13":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect@162:13","span":{"start":[162,13],"end":[162,30],"bytes":[4854,4871]},"callee":null},"164:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect@164:3","span":{"start":[164,3],"end":[164,13],"bytes":[4891,4901]},"callee":null},"165:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect@165:10","span":{"start":[165,10],"end":[165,67],"bytes":[4911,4968]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore","kind":"method","span":{"start":[220,1],"end":[233,2],"bytes":[6338,6776]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[220,1],"end":[220,69],"bytes":[6338,6406]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"222:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore@222:10","span":{"start":[222,10],"end":[222,47],"bytes":[6441,6478]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"226:22":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore@226:22","span":{"start":[226,22],"end":[226,57],"bytes":[6555,6590]},"callee":null},"228:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore@228:10","span":{"start":[228,10],"end":[228,122],"bytes":[6617,6729]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","kind":"method","span":{"start":[250,1],"end":[252,2],"bytes":[7041,7185]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","parameters":[{"name":"level","type":"int","span":{"start":[250,1],"end":[250,79],"bytes":[7041,7119]}},{"name":"minTXID","type":"invalid type","span":{"start":[250,1],"end":[250,79],"bytes":[7041,7119]}},{"name":"maxTXID","type":"invalid type","span":{"start":[250,1],"end":[250,79],"bytes":[7041,7119]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"251:9":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath@251:9","span":{"start":[251,9],"end":[251,64],"bytes":[7128,7183]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.options":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options","kind":"method","span":{"start":[173,1],"end":[216,2],"bytes":[5010,6212]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.options","parameters":[],"return_type":"[]invalid type","metrics":{"cyclomatic":11},"body":{"175:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@175:3","span":{"start":[175,3],"end":[175,38],"bytes":[5086,5121]},"callee":null},"176:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@176:3","span":{"start":[176,3],"end":[176,38],"bytes":[5125,5160]},"callee":null},"177:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@177:3","span":{"start":[177,3],"end":[177,63],"bytes":[5164,5224]},"callee":null},"178:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@178:3","span":{"start":[178,3],"end":[178,26],"bytes":[5228,5251]},"callee":null},"179:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@179:3","span":{"start":[179,3],"end":[179,36],"bytes":[5255,5288]},"callee":null},"180:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@180:3","span":{"start":[180,3],"end":[180,42],"bytes":[5292,5331]},"callee":null},"181:3":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@181:3","span":{"start":[181,3],"end":[181,44],"bytes":[5335,5376]},"callee":null},"187:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@187:10","span":{"start":[187,10],"end":[187,58],"bytes":[5463,5511]},"callee":null},"187:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@187:23","span":{"start":[187,23],"end":[187,57],"bytes":[5476,5510]},"callee":null},"189:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@189:10","span":{"start":[189,10],"end":[189,53],"bytes":[5542,5585]},"callee":null},"189:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@189:23","span":{"start":[189,23],"end":[189,52],"bytes":[5555,5584]},"callee":null},"191:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@191:10","span":{"start":[191,10],"end":[191,50],"bytes":[5615,5655]},"callee":null},"191:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@191:23","span":{"start":[191,23],"end":[191,49],"bytes":[5628,5654]},"callee":null},"193:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@193:10","span":{"start":[193,10],"end":[193,61],"bytes":[5709,5760]},"callee":null},"193:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@193:23","span":{"start":[193,23],"end":[193,60],"bytes":[5722,5759]},"callee":null},"195:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@195:10","span":{"start":[195,10],"end":[195,43],"bytes":[5791,5824]},"callee":null},"195:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@195:23","span":{"start":[195,23],"end":[195,42],"bytes":[5804,5823]},"callee":null},"199:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@199:10","span":{"start":[199,10],"end":[199,56],"bytes":[5877,5923]},"callee":null},"199:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@199:23","span":{"start":[199,23],"end":[199,55],"bytes":[5890,5922]},"callee":null},"204:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@204:10","span":{"start":[204,10],"end":[204,37],"bytes":[5971,5998]},"callee":null},"204:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@204:23","span":{"start":[204,23],"end":[204,36],"bytes":[5984,5997]},"callee":null},"208:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@208:10","span":{"start":[208,10],"end":[208,66],"bytes":[6058,6114]},"callee":null},"208:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@208:23","span":{"start":[208,23],"end":[208,65],"bytes":[6071,6113]},"callee":null},"211:5":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@211:5","span":{"start":[211,5],"end":[211,19],"bytes":[6123,6137]},"callee":null},"212:10":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@212:10","span":{"start":[212,10],"end":[212,50],"bytes":[6153,6193]},"callee":null},"212:23":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options@212:23","span":{"start":[212,23],"end":[212,49],"bytes":[6166,6192]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","kind":"method","span":{"start":[255,1],"end":[280,2],"bytes":[7270,8155]},"signature":"github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","parameters":[{"name":"objPath","type":"string","span":{"start":[255,1],"end":[255,105],"bytes":[7270,7374]}}],"return_type":"(int, invalid type, invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"257:21":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@257:21","span":{"start":[257,21],"end":[257,59],"bytes":[7438,7476]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"258:13":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@258:13","span":{"start":[258,13],"end":[258,52],"bytes":[7491,7530]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"262:11":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@262:11","span":{"start":[262,11],"end":[262,38],"bytes":[7604,7631]},"callee":"can://litestream/litestream/@external/strings/Split"},"263:5":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@263:5","span":{"start":[263,5],"end":[263,15],"bytes":[7636,7646]},"callee":null},"264:19":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@264:19","span":{"start":[264,19],"end":[264,62],"bytes":[7692,7735]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"268:18":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@268:18","span":{"start":[268,18],"end":[268,40],"bytes":[7773,7795]},"callee":"can://litestream/litestream/@external/strconv/Atoi"},"269:19":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@269:19","span":{"start":[269,19],"end":[269,75],"bytes":[7828,7884]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"274:33":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@274:33","span":{"start":[274,33],"end":[274,60],"bytes":[7984,8011]},"callee":null},"276:19":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath@276:19","span":{"start":[276,19],"end":[276,78],"bytes":[8047,8106]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}}},"fields":{"BucketName":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/BucketName","kind":"field","type":"string","span":{"start":[50,1],"end":[50,49],"bytes":[1057,1105]}},"ClientCert":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ClientCert","kind":"field","type":"string","span":{"start":[61,1],"end":[61,53],"bytes":[1604,1656]}},"ClientKey":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ClientKey","kind":"field","type":"string","span":{"start":[62,1],"end":[62,45],"bytes":[1657,1701]}},"Creds":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Creds","kind":"field","type":"string","span":{"start":[54,1],"end":[54,46],"bytes":[1277,1322]}},"JWT":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/JWT","kind":"field","type":"string","span":{"start":[52,1],"end":[52,53],"bytes":[1172,1224]}},"MaxPingsOut":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/MaxPingsOut","kind":"field","type":"int","span":{"start":[73,1],"end":[73,91],"bytes":[2264,2354]}},"MaxReconnects":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/MaxReconnects","kind":"field","type":"int","span":{"start":[68,1],"end":[68,99],"bytes":[1861,1959]}},"NKey":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/NKey","kind":"field","type":"string","span":{"start":[55,1],"end":[55,48],"bytes":[1323,1370]}},"Password":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Password","kind":"field","type":"string","span":{"start":[57,1],"end":[57,52],"bytes":[1423,1474]}},"Path":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[51,1],"end":[51,66],"bytes":[1106,1171]}},"PingInterval":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/PingInterval","kind":"field","type":"time.Duration","span":{"start":[72,1],"end":[72,64],"bytes":[2200,2263]}},"ReconnectBufSize":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ReconnectBufSize","kind":"field","type":"int","span":{"start":[74,1],"end":[74,75],"bytes":[2355,2429]}},"ReconnectJitter":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ReconnectJitter","kind":"field","type":"time.Duration","span":{"start":[70,1],"end":[70,81],"bytes":[2050,2130]}},"ReconnectWait":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/ReconnectWait","kind":"field","type":"time.Duration","span":{"start":[69,1],"end":[69,90],"bytes":[1960,2049]}},"RootCAs":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/RootCAs","kind":"field","type":"[]string","span":{"start":[60,1],"end":[60,45],"bytes":[1559,1603]}},"Seed":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Seed","kind":"field","type":"string","span":{"start":[53,1],"end":[53,52],"bytes":[1225,1276]}},"SigCB":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/SigCB","kind":"field","type":"func([]byte) ([]byte, error)","span":{"start":[76,1],"end":[76,69],"bytes":[2493,2561]}},"TLS":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/TLS","kind":"field","type":"bool","span":{"start":[59,1],"end":[59,35],"bytes":[1524,1558]}},"Timeout":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Timeout","kind":"field","type":"time.Duration","span":{"start":[71,1],"end":[71,69],"bytes":[2131,2199]}},"Token":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Token","kind":"field","type":"string","span":{"start":[58,1],"end":[58,49],"bytes":[1475,1523]}},"URL":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/URL","kind":"field","type":"string","span":{"start":[49,1],"end":[49,40],"bytes":[1017,1056]}},"UserJWT":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/UserJWT","kind":"field","type":"func() (string, error)","span":{"start":[75,1],"end":[75,63],"bytes":[2430,2492]}},"Username":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/Username","kind":"field","type":"string","span":{"start":[56,1],"end":[56,52],"bytes":[1371,1422]}},"js":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/js","kind":"field","type":"invalid type","span":{"start":[45,1],"end":[45,33],"bytes":[930,962]}},"logger":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[41,1],"end":[41,21],"bytes":[842,862]}},"mu":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[40,1],"end":[40,19],"bytes":[823,841]}},"nc":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/nc","kind":"field","type":"invalid type","span":{"start":[44,1],"end":[44,24],"bytes":[906,929]}},"objectStore":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/objectStore","kind":"field","type":"invalid type","span":{"start":[46,1],"end":[46,35],"bytes":[963,997]}}}},"ltxFileIterator":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator","kind":"struct","span":{"start":[492,1],"end":[496,2],"bytes":[14755,14833]},"callables":{"github.com/benbjohnson/litestream/nats.ltxFileIterator.Close":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Close","kind":"method","span":{"start":[518,1],"end":[520,2],"bytes":[15366,15427]},"signature":"github.com/benbjohnson/litestream/nats.ltxFileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/nats.ltxFileIterator.Err":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Err","kind":"method","span":{"start":[513,1],"end":[515,2],"bytes":[15222,15281]},"signature":"github.com/benbjohnson/litestream/nats.ltxFileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/nats.ltxFileIterator.Item":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Item","kind":"method","span":{"start":[505,1],"end":[510,2],"bytes":[15015,15163]},"signature":"github.com/benbjohnson/litestream/nats.ltxFileIterator.Item","parameters":[],"return_type":"invalid type","metrics":{"cyclomatic":2},"body":{"506:35":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Item@506:35","span":{"start":[506,35],"end":[506,49],"bytes":[15100,15114]},"callee":null}}},"github.com/benbjohnson/litestream/nats.ltxFileIterator.Next":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Next","kind":"method","span":{"start":[499,1],"end":[502,2],"bytes":[14883,14974]},"signature":"github.com/benbjohnson/litestream/nats.ltxFileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"501:21":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/github.com/benbjohnson/litestream/nats.ltxFileIterator.Next@501:21","span":{"start":[501,21],"end":[501,35],"bytes":[14958,14972]},"callee":null}}}},"fields":{"err":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/err","kind":"field","type":"error","span":{"start":[495,1],"end":[495,13],"bytes":[14819,14831]}},"files":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/files","kind":"field","type":"[]invalid type","span":{"start":[493,1],"end":[493,23],"bytes":[14785,14807]}},"index":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ltxFileIterator/index","kind":"field","type":"int","span":{"start":[494,1],"end":[494,11],"bytes":[14808,14818]}}}}},"functions":{"github.com/benbjohnson/litestream/nats.NewReplicaClient":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","kind":"function","span":{"start":[80,1],"end":[90,2],"bytes":[2626,2976]},"signature":"github.com/benbjohnson/litestream/nats.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/nats.ReplicaClient","metrics":{"cyclomatic":1},"body":{"82:21":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient@82:21","span":{"start":[82,21],"end":[82,64],"bytes":[2711,2754]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"82:21/2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient@82:21/2","span":{"start":[82,21],"end":[82,35],"bytes":[2711,2725]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","kind":"function","span":{"start":[99,1],"end":[121,2],"bytes":[3275,3917]},"signature":"github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}},{"name":"host","type":"string","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}},{"name":"urlPath","type":"string","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}},{"name":"query","type":"net/url.Values","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[99,1],"end":[99,137],"bytes":[3275,3411]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"100:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL@100:12","span":{"start":[100,12],"end":[100,30],"bytes":[3423,3441]},"callee":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient"},"104:16":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL@104:16","span":{"start":[104,16],"end":[104,46],"bytes":[3515,3545]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"109:21":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL@109:21","span":{"start":[109,21],"end":[109,40],"bytes":[3641,3660]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Username"},"110:24":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL@110:24","span":{"start":[110,24],"end":[110,43],"bytes":[3684,3703]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Password"},"114:12":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL@114:12","span":{"start":[114,12],"end":[114,38],"bytes":[3753,3779]},"callee":"can://litestream/litestream/@external/strings/Trim"},"116:15":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL@116:15","span":{"start":[116,15],"end":[116,65],"bytes":[3813,3863]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/nats.init":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.init","kind":"function","span":{"start":[26,1],"end":[28,2],"bytes":[326,415]},"signature":"github.com/benbjohnson/litestream/nats.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"27:2":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.init@27:2","span":{"start":[27,2],"end":[27,74],"bytes":[341,413]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/nats.isNotFoundError":{"id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","kind":"function","span":{"start":[487,1],"end":[489,2],"bytes":[14529,14683]},"signature":"github.com/benbjohnson/litestream/nats.isNotFoundError","parameters":[{"name":"err","type":"error","span":{"start":[487,1],"end":[487,39],"bytes":[14529,14567]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"488:24":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError@488:24","span":{"start":[488,24],"end":[488,67],"bytes":[14591,14634]},"callee":"can://litestream/litestream/@external/errors/Is"},"488:71":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError@488:71","span":{"start":[488,71],"end":[488,113],"bytes":[14638,14680]},"callee":"can://litestream/litestream/@external/strings/Contains"},"488:88":{"kind":"call","id":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError@488:88","span":{"start":[488,88],"end":[488,99],"bytes":[14655,14666]},"callee":null}}}},"content_hash":"f98e6196bb9a1f560d754c595e7899192c063306a4efe6165f2801aa222ba8ec"},"oss/replica_client.go":{"id":"can://litestream/litestream/go/oss/replica_client.go","kind":"module","span":{"start":[1,1],"end":[727,1],"bytes":[0,19595]},"package":"oss","source":"package oss\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss\"\n\t\"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/errgroup\"\n\t\"golang.org/x/sync/semaphore\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"oss\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"oss\"\n\n// MetadataKeyTimestamp is the metadata key for storing LTX file timestamps in OSS.\n// Note: OSS SDK automatically adds \"x-oss-meta-\" prefix when setting metadata.\nconst MetadataKeyTimestamp = \"litestream-timestamp\"\n\n// MaxKeys is the number of keys OSS can operate on per batch.\nconst MaxKeys = 1000\n\n// DefaultRegion is the region used if one is not specified.\nconst DefaultRegion = \"cn-hangzhou\"\n\n// DefaultMetadataConcurrency is the default number of concurrent HeadObject calls\n// for fetching accurate timestamps during timestamp-based restore.\nconst DefaultMetadataConcurrency = 50\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to Alibaba Cloud OSS.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tclient *oss.Client\n\tuploader *oss.Uploader\n\tlogger *slog.Logger\n\n\t// Alibaba Cloud authentication keys.\n\tAccessKeyID string\n\tAccessKeySecret string\n\n\t// OSS bucket information\n\tRegion string\n\tBucket string\n\tPath string\n\tEndpoint string\n\n\t// Upload configuration\n\tPartSize int64 // Part size for multipart uploads (default: 5MB)\n\tConcurrency int // Number of concurrent parts to upload (default: 3)\n\n\t// MetadataConcurrency controls parallel HeadObject calls for timestamp-based restore.\n\t// Higher values improve restore speed for large backup histories.\n\t// Default: 50\n\tMetadataConcurrency int\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: oss://bucket[.oss-region.aliyuncs.com]/path\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\tbucket, region, _ := ParseHost(host)\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for oss replica URL\")\n\t}\n\n\tclient.Bucket = bucket\n\tclient.Region = region\n\tclient.Path = urlPath\n\n\treturn client, nil\n}\n\n// Type returns \"oss\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to OSS. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) (err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.client != nil {\n\t\treturn nil\n\t}\n\n\t// Validate required configuration\n\tif c.Bucket == \"\" {\n\t\treturn fmt.Errorf(\"oss: bucket name is required\")\n\t}\n\n\t// Use default region if not specified\n\tregion := c.Region\n\tif region == \"\" {\n\t\tregion = DefaultRegion\n\t}\n\n\t// Build configuration\n\tcfg := oss.LoadDefaultConfig()\n\n\t// Configure credentials\n\tif c.AccessKeyID != \"\" \u0026\u0026 c.AccessKeySecret != \"\" {\n\t\tcfg = cfg.WithCredentialsProvider(\n\t\t\tcredentials.NewStaticCredentialsProvider(c.AccessKeyID, c.AccessKeySecret),\n\t\t)\n\t} else {\n\t\t// Use environment variable credentials provider\n\t\tcfg = cfg.WithCredentialsProvider(\n\t\t\tcredentials.NewEnvironmentVariableCredentialsProvider(),\n\t\t)\n\t}\n\n\t// Configure region\n\tcfg = cfg.WithRegion(region)\n\n\t// Configure custom endpoint if specified\n\tif c.Endpoint != \"\" {\n\t\tendpoint := c.Endpoint\n\t\t// Add scheme if not present\n\t\tif !strings.HasPrefix(endpoint, \"http://\") \u0026\u0026 !strings.HasPrefix(endpoint, \"https://\") {\n\t\t\tendpoint = \"https://\" + endpoint\n\t\t}\n\t\tcfg = cfg.WithEndpoint(endpoint)\n\t}\n\n\t// Create OSS client\n\tc.client = oss.NewClient(cfg)\n\n\t// Create uploader with configurable part size and concurrency\n\tuploaderOpts := []func(*oss.UploaderOptions){}\n\tif c.PartSize \u003e 0 {\n\t\tuploaderOpts = append(uploaderOpts, func(o *oss.UploaderOptions) {\n\t\t\to.PartSize = c.PartSize\n\t\t})\n\t}\n\tif c.Concurrency \u003e 0 {\n\t\tuploaderOpts = append(uploaderOpts, func(o *oss.UploaderOptions) {\n\t\t\to.ParallelNum = c.Concurrency\n\t\t})\n\t}\n\tc.uploader = c.client.NewUploader(uploaderOpts...)\n\n\treturn nil\n}\n\n// LTXFiles returns an iterator over all LTX files on the replica for the given level.\n// When useMetadata is true, fetches accurate timestamps from OSS metadata via HeadObject.\n// This uses parallel batched requests (controlled by MetadataConcurrency) to avoid hangs\n// with large backup histories (see issue #930).\n// When false, uses fast LastModified timestamps from LIST operation.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn newFileIterator(ctx, c, level, seek, useMetadata), nil\n}\n\n// OpenLTXFile returns a reader for an LTX file.\n// Returns os.ErrNotExist if no matching file is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Build the key from the file info\n\tfilename := ltx.FormatFilename(minTXID, maxTXID)\n\tkey := c.ltxPath(level, filename)\n\n\trequest := \u0026oss.GetObjectRequest{\n\t\tBucket: oss.Ptr(c.Bucket),\n\t\tKey: oss.Ptr(key),\n\t}\n\n\t// Set range header if offset is specified\n\tif size \u003e 0 {\n\t\trequest.RangeBehavior = oss.Ptr(\"standard\")\n\t\trequest.Range = oss.Ptr(fmt.Sprintf(\"bytes=%d-%d\", offset, offset+size-1))\n\t} else if offset \u003e 0 {\n\t\trequest.RangeBehavior = oss.Ptr(\"standard\")\n\t\trequest.Range = oss.Ptr(fmt.Sprintf(\"bytes=%d-\", offset))\n\t}\n\n\tresult, err := c.client.GetObject(ctx, request)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"oss: get object %s: %w\", key, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\n\treturn result.Body, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\n// Extracts timestamp from LTX header and stores it in OSS metadata to preserve original creation time.\n// Uses multipart upload for large files via the uploader.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(r, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\trc := internal.NewReadCounter(io.MultiReader(\u0026buf, r))\n\n\tfilename := ltx.FormatFilename(minTXID, maxTXID)\n\tkey := c.ltxPath(level, filename)\n\n\t// Store timestamp in OSS metadata for accurate timestamp retrieval\n\tmetadata := map[string]string{\n\t\tMetadataKeyTimestamp: timestamp.Format(time.RFC3339Nano),\n\t}\n\n\t// Use uploader for automatic multipart handling (files \u003e5GB)\n\tresult, err := c.uploader.UploadFrom(ctx, \u0026oss.PutObjectRequest{\n\t\tBucket: oss.Ptr(c.Bucket),\n\t\tKey: oss.Ptr(key),\n\t\tMetadata: metadata,\n\t}, rc)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"oss: upload to %s: %w\", key, err)\n\t}\n\n\t// Build file info from the uploaded file\n\tinfo := \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: rc.N(),\n\t\tCreatedAt: timestamp,\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(rc.N()))\n\n\t// ETag indicates successful upload\n\tif result.ETag == nil || *result.ETag == \"\" {\n\t\treturn nil, fmt.Errorf(\"oss: upload failed: no ETag returned\")\n\t}\n\n\treturn info, nil\n}\n\n// DeleteLTXFiles deletes one or more LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\n\t// Convert file infos to object identifiers\n\tobjects := make([]oss.DeleteObject, 0, len(a))\n\tfor _, info := range a {\n\t\tfilename := ltx.FormatFilename(info.MinTXID, info.MaxTXID)\n\t\tkey := c.ltxPath(info.Level, filename)\n\t\tobjects = append(objects, oss.DeleteObject{Key: oss.Ptr(key)})\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"key\", key)\n\t}\n\n\t// Delete in batches\n\tfor len(objects) \u003e 0 {\n\t\tn := min(len(objects), MaxKeys)\n\t\tbatch := objects[:n]\n\n\t\trequest := \u0026oss.DeleteMultipleObjectsRequest{\n\t\t\tBucket: oss.Ptr(c.Bucket),\n\t\t\tObjects: batch,\n\t\t}\n\n\t\tout, err := c.client.DeleteMultipleObjects(ctx, request)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"oss: delete batch of %d objects: %w\", n, err)\n\t\t} else if err := deleteResultError(batch, out); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\n\t\tobjects = objects[n:]\n\t}\n\n\treturn nil\n}\n\n// DeleteAll deletes all files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tvar objects []oss.DeleteObject\n\n\t// Create paginator for listing objects\n\tprefix := c.Path + \"/\"\n\tpaginator := c.client.NewListObjectsV2Paginator(\u0026oss.ListObjectsV2Request{\n\t\tBucket: oss.Ptr(c.Bucket),\n\t\tPrefix: oss.Ptr(prefix),\n\t})\n\n\t// Iterate through all pages\n\tfor paginator.HasNext() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"oss: list objects page: %w\", err)\n\t\t}\n\n\t\t// Collect object identifiers\n\t\tfor _, obj := range page.Contents {\n\t\t\tif obj.Key != nil {\n\t\t\t\tobjects = append(objects, oss.DeleteObject{Key: obj.Key})\n\t\t\t}\n\t\t}\n\t}\n\n\t// Delete all collected objects in batches\n\tfor len(objects) \u003e 0 {\n\t\tn := min(len(objects), MaxKeys)\n\t\tbatch := objects[:n]\n\n\t\trequest := \u0026oss.DeleteMultipleObjectsRequest{\n\t\t\tBucket: oss.Ptr(c.Bucket),\n\t\t\tObjects: batch,\n\t\t}\n\n\t\tout, err := c.client.DeleteMultipleObjects(ctx, request)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"oss: delete all batch of %d objects: %w\", n, err)\n\t\t} else if err := deleteResultError(batch, out); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjects = objects[n:]\n\t}\n\n\treturn nil\n}\n\n// ltxPath returns the full path to an LTX file.\nfunc (c *ReplicaClient) ltxPath(level int, filename string) string {\n\treturn c.Path + \"/\" + fmt.Sprintf(\"%04x/%s\", level, filename)\n}\n\n// fileIterator represents an iterator over LTX files in OSS.\ntype fileIterator struct {\n\tctx context.Context\n\tcancel context.CancelFunc\n\tclient *ReplicaClient\n\tlevel int\n\tseek ltx.TXID\n\n\tuseMetadata bool // When true, fetch accurate timestamps from metadata\n\tmetadataCache map[string]time.Time // key -\u003e timestamp cache for batch fetches\n\n\tpaginator *oss.ListObjectsV2Paginator\n\tpage *oss.ListObjectsV2Result\n\tpageIndex int\n\tinitialized bool\n\n\tclosed bool\n\terr error\n\tinfo *ltx.FileInfo\n}\n\nfunc newFileIterator(ctx context.Context, client *ReplicaClient, level int, seek ltx.TXID, useMetadata bool) *fileIterator {\n\tctx, cancel := context.WithCancel(ctx)\n\n\titr := \u0026fileIterator{\n\t\tctx: ctx,\n\t\tcancel: cancel,\n\t\tclient: client,\n\t\tlevel: level,\n\t\tseek: seek,\n\t\tuseMetadata: useMetadata,\n\t\tmetadataCache: make(map[string]time.Time),\n\t}\n\n\treturn itr\n}\n\n// fetchMetadataBatch fetches timestamps from OSS metadata for a batch of keys in parallel.\nfunc (itr *fileIterator) fetchMetadataBatch(keys []string) error {\n\tif len(keys) == 0 {\n\t\treturn nil\n\t}\n\n\t// Determine concurrency limit\n\tconcurrency := itr.client.MetadataConcurrency\n\tif concurrency \u003c= 0 {\n\t\tconcurrency = DefaultMetadataConcurrency\n\t}\n\n\t// Pre-allocate results map to avoid lock contention during writes\n\tresults := make(map[string]time.Time, len(keys))\n\tvar mu sync.Mutex\n\n\t// Use x/sync/semaphore for precise concurrency control with context support\n\tsem := semaphore.NewWeighted(int64(concurrency))\n\tg, ctx := errgroup.WithContext(itr.ctx)\n\n\tfor _, key := range keys {\n\t\tkey := key // capture for goroutine\n\n\t\tg.Go(func() error {\n\t\t\t// Acquire semaphore slot (blocking with context cancellation)\n\t\t\tif err := sem.Acquire(ctx, 1); err != nil {\n\t\t\t\treturn err // context cancelled\n\t\t\t}\n\t\t\tdefer sem.Release(1)\n\n\t\t\thead, err := itr.client.client.HeadObject(ctx, \u0026oss.HeadObjectRequest{\n\t\t\t\tBucket: oss.Ptr(itr.client.Bucket),\n\t\t\t\tKey: oss.Ptr(key),\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\t// Non-fatal: file might not have metadata, use LastModified\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif head.Metadata != nil {\n\t\t\t\tif ts, ok := head.Metadata[MetadataKeyTimestamp]; ok {\n\t\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, ts); err == nil {\n\t\t\t\t\t\tmu.Lock()\n\t\t\t\t\t\tresults[key] = parsed\n\t\t\t\t\t\tmu.Unlock()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t}\n\n\tif err := g.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\t// Merge results into cache\n\tfor k, v := range results {\n\t\titr.metadataCache[k] = v\n\t}\n\treturn nil\n}\n\n// initPaginator initializes the paginator lazily.\nfunc (itr *fileIterator) initPaginator() {\n\tif itr.initialized {\n\t\treturn\n\t}\n\titr.initialized = true\n\n\t// Create paginator for listing objects with level prefix\n\tprefix := itr.client.ltxPath(itr.level, \"\")\n\titr.paginator = itr.client.client.NewListObjectsV2Paginator(\u0026oss.ListObjectsV2Request{\n\t\tBucket: oss.Ptr(itr.client.Bucket),\n\t\tPrefix: oss.Ptr(prefix),\n\t})\n}\n\n// Close stops iteration and returns any error that occurred during iteration.\nfunc (itr *fileIterator) Close() (err error) {\n\titr.closed = true\n\titr.cancel()\n\treturn itr.err\n}\n\n// Next returns the next file. Returns false when no more files are available.\nfunc (itr *fileIterator) Next() bool {\n\tif itr.closed || itr.err != nil {\n\t\treturn false\n\t}\n\n\t// Initialize paginator on first call\n\titr.initPaginator()\n\n\t// Process objects until we find a valid LTX file\n\tfor {\n\t\t// Load next page if needed\n\t\tif itr.page == nil || itr.pageIndex \u003e= len(itr.page.Contents) {\n\t\t\tif !itr.paginator.HasNext() {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tvar err error\n\t\t\titr.page, err = itr.paginator.NextPage(itr.ctx)\n\t\t\tif err != nil {\n\t\t\t\titr.err = err\n\t\t\t\treturn false\n\t\t\t}\n\t\t\titr.pageIndex = 0\n\n\t\t\t// Batch fetch metadata for the entire page when useMetadata is true.\n\t\t\t// This uses parallel HeadObject calls controlled by MetadataConcurrency\n\t\t\t// to avoid the O(N) sequential calls that caused restore hangs (issue #930).\n\t\t\tif itr.useMetadata \u0026\u0026 len(itr.page.Contents) \u003e 0 {\n\t\t\t\tkeys := make([]string, 0, len(itr.page.Contents))\n\t\t\t\tfor _, obj := range itr.page.Contents {\n\t\t\t\t\tif obj.Key != nil {\n\t\t\t\t\t\tkeys = append(keys, *obj.Key)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif err := itr.fetchMetadataBatch(keys); err != nil {\n\t\t\t\t\titr.err = err\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process current object\n\t\tif itr.pageIndex \u003c len(itr.page.Contents) {\n\t\t\tobj := itr.page.Contents[itr.pageIndex]\n\t\t\titr.pageIndex++\n\n\t\t\tif obj.Key == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Extract file info from key\n\t\t\tfullKey := *obj.Key\n\t\t\tkey := path.Base(fullKey)\n\t\t\tminTXID, maxTXID, err := ltx.ParseFilename(key)\n\t\t\tif err != nil {\n\t\t\t\tcontinue // Skip non-LTX files\n\t\t\t}\n\n\t\t\t// Build file info\n\t\t\tinfo := \u0026ltx.FileInfo{\n\t\t\t\tLevel: itr.level,\n\t\t\t\tMinTXID: minTXID,\n\t\t\t\tMaxTXID: maxTXID,\n\t\t\t}\n\n\t\t\t// Skip if below seek TXID\n\t\t\tif info.MinTXID \u003c itr.seek {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Set file info\n\t\t\tinfo.Size = obj.Size\n\n\t\t\t// Use cached metadata timestamp if available (from batch fetch),\n\t\t\t// otherwise fallback to LastModified from LIST operation.\n\t\t\tif itr.useMetadata {\n\t\t\t\tif ts, ok := itr.metadataCache[fullKey]; ok {\n\t\t\t\t\tinfo.CreatedAt = ts\n\t\t\t\t} else if obj.LastModified != nil {\n\t\t\t\t\tinfo.CreatedAt = obj.LastModified.UTC()\n\t\t\t\t} else {\n\t\t\t\t\tinfo.CreatedAt = time.Now().UTC()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif obj.LastModified != nil {\n\t\t\t\t\tinfo.CreatedAt = obj.LastModified.UTC()\n\t\t\t\t} else {\n\t\t\t\t\tinfo.CreatedAt = time.Now().UTC()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titr.info = info\n\t\t\treturn true\n\t\t}\n\t}\n}\n\n// Item returns the metadata for the current file.\nfunc (itr *fileIterator) Item() *ltx.FileInfo {\n\treturn itr.info\n}\n\n// Err returns any error that occurred during iteration.\nfunc (itr *fileIterator) Err() error {\n\treturn itr.err\n}\n\n// ParseURL parses an OSS URL into its host and path parts.\nfunc ParseURL(s string) (bucket, region, key string, err error) {\n\tu, err := url.Parse(s)\n\tif err != nil {\n\t\treturn \"\", \"\", \"\", err\n\t}\n\n\tif u.Scheme != \"oss\" {\n\t\treturn \"\", \"\", \"\", fmt.Errorf(\"oss: invalid url scheme\")\n\t}\n\n\t// Parse host to extract bucket and region\n\tbucket, region, _ = ParseHost(u.Host)\n\tif bucket == \"\" {\n\t\tbucket = u.Host\n\t}\n\n\tkey = strings.TrimPrefix(u.Path, \"/\")\n\treturn bucket, region, key, nil\n}\n\n// ParseHost parses the host/endpoint for an OSS storage system.\n// Supports formats like:\n// - bucket.oss-cn-hangzhou.aliyuncs.com\n// - bucket.oss-cn-hangzhou-internal.aliyuncs.com\n// - bucket (just bucket name)\nfunc ParseHost(host string) (bucket, region, endpoint string) {\n\t// Check for internal OSS URL format first (more specific pattern)\n\tif a := ossInternalRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tif len(a) \u003e 2 \u0026\u0026 a[2] != \"\" {\n\t\t\tregion = a[2]\n\t\t}\n\t\treturn bucket, region, \"\"\n\t}\n\n\t// Check for standard OSS URL format\n\tif a := ossRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tif len(a) \u003e 2 \u0026\u0026 a[2] != \"\" {\n\t\t\tregion = a[2]\n\t\t}\n\t\treturn bucket, region, \"\"\n\t}\n\n\t// For other hosts, assume it's just the bucket name\n\treturn host, \"\", \"\"\n}\n\nvar (\n\t// oss-cn-hangzhou.aliyuncs.com or bucket.oss-cn-hangzhou.aliyuncs.com\n\tossRegex = regexp.MustCompile(`^(?:([^.]+)\\.)?oss-([^.]+)\\.aliyuncs\\.com$`)\n\t// oss-cn-hangzhou-internal.aliyuncs.com or bucket.oss-cn-hangzhou-internal.aliyuncs.com\n\t// Uses non-greedy .+? to correctly extract region without -internal suffix\n\tossInternalRegex = regexp.MustCompile(`^(?:([^.]+)\\.)?oss-(.+?)-internal\\.aliyuncs\\.com$`)\n)\n\nfunc isNotExists(err error) bool {\n\tvar serviceErr *oss.ServiceError\n\tif errors.As(err, \u0026serviceErr) {\n\t\treturn serviceErr.Code == \"NoSuchKey\"\n\t}\n\treturn false\n}\n\n// deleteResultError checks if all requested objects were deleted.\n// OSS SDK doesn't have explicit per-object error reporting like S3, so we verify\n// all requested keys appear in the deleted list.\nfunc deleteResultError(requested []oss.DeleteObject, out *oss.DeleteMultipleObjectsResult) error {\n\tif out == nil {\n\t\treturn nil\n\t}\n\n\t// Build set of deleted keys for quick lookup\n\tdeleted := make(map[string]struct{}, len(out.DeletedObjects))\n\tfor _, obj := range out.DeletedObjects {\n\t\tif obj.Key != nil {\n\t\t\tdeleted[*obj.Key] = struct{}{}\n\t\t}\n\t}\n\n\t// Check that all requested keys were deleted\n\tvar failed []string\n\tfor _, obj := range requested {\n\t\tif obj.Key == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif _, ok := deleted[*obj.Key]; !ok {\n\t\t\tfailed = append(failed, *obj.Key)\n\t\t}\n\t}\n\n\tif len(failed) == 0 {\n\t\treturn nil\n\t}\n\n\t// Build error message listing failed keys\n\tvar b strings.Builder\n\tb.WriteString(\"oss: failed to delete files:\")\n\tfor _, key := range failed {\n\t\tfmt.Fprintf(\u0026b, \"\\n%s\", key)\n\t}\n\treturn errors.New(b.String())\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[22,30]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[31,41]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[42,51]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[52,58]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[59,64]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[65,76]}},{"name":"url","path":"net/url","span":{"start":[10,1],"end":[10,11],"bytes":[77,87]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[88,93]}},{"name":"path","path":"path","span":{"start":[12,1],"end":[12,8],"bytes":[94,101]}},{"name":"regexp","path":"regexp","span":{"start":[13,1],"end":[13,10],"bytes":[102,111]}},{"name":"strings","path":"strings","span":{"start":[14,1],"end":[14,11],"bytes":[112,122]}},{"name":"sync","path":"sync","span":{"start":[15,1],"end":[15,8],"bytes":[123,130]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[131,138]}},{"name":"oss","path":"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss","span":{"start":[18,1],"end":[18,52],"bytes":[140,191]}},{"name":"credentials","path":"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials","span":{"start":[19,1],"end":[19,64],"bytes":[192,255]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[20,1],"end":[20,27],"bytes":[256,282]}},{"name":"errgroup","path":"golang.org/x/sync/errgroup","span":{"start":[21,1],"end":[21,30],"bytes":[283,312]}},{"name":"semaphore","path":"golang.org/x/sync/semaphore","span":{"start":[22,1],"end":[22,31],"bytes":[313,343]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[24,1],"end":[24,37],"bytes":[345,381]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[25,1],"end":[25,46],"bytes":[382,427]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient","kind":"struct","span":{"start":[52,1],"end":[76,2],"bytes":[1331,1999]},"callables":{"github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","kind":"method","span":{"start":[336,1],"end":[386,2],"bytes":[9636,10832]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[336,1],"end":[336,63],"bytes":[9636,9698]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"337:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@337:12","span":{"start":[337,12],"end":[337,23],"bytes":[9710,9721]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"345:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@345:15","span":{"start":[345,15],"end":[348,4],"bytes":[9865,9986]},"callee":null},"346:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@346:11","span":{"start":[346,11],"end":[346,28],"bytes":[9937,9954]},"callee":null},"347:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@347:11","span":{"start":[347,11],"end":[347,26],"bytes":[9966,9981]},"callee":null},"351:6":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@351:6","span":{"start":[351,6],"end":[351,25],"bytes":[10023,10042]},"callee":null},"352:16":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@352:16","span":{"start":[352,16],"end":[352,39],"bytes":[10060,10083]},"callee":null},"354:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@354:11","span":{"start":[354,11],"end":[354,56],"bytes":[10112,10157]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"360:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@360:15","span":{"start":[360,15],"end":[360,62],"bytes":[10270,10317]},"callee":null},"366:6":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@366:6","span":{"start":[366,6],"end":[366,18],"bytes":[10380,10392]},"callee":null},"367:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@367:12","span":{"start":[367,12],"end":[367,24],"bytes":[10410,10422]},"callee":null},"367:8":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@367:8","span":{"start":[367,8],"end":[367,34],"bytes":[10406,10432]},"callee":null},"371:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@371:13","span":{"start":[371,13],"end":[371,30],"bytes":[10517,10534]},"callee":null},"375:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@375:15","span":{"start":[375,15],"end":[375,59],"bytes":[10574,10618]},"callee":null},"377:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@377:11","span":{"start":[377,11],"end":[377,72],"bytes":[10647,10708]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"378:20":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll@378:20","span":{"start":[378,20],"end":[378,49],"bytes":[10728,10757]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError"}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[291,1],"end":[333,2],"bytes":[8451,9602]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[291,1],"end":[291,87],"bytes":[8451,8537]}},{"name":"a","type":"[]invalid type","span":{"start":[291,1],"end":[291,87],"bytes":[8451,8537]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"292:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@292:12","span":{"start":[292,12],"end":[292,23],"bytes":[8549,8560]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"296:5":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@296:5","span":{"start":[296,5],"end":[296,11],"bytes":[8596,8602]},"callee":null},"301:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@301:13","span":{"start":[301,13],"end":[301,48],"bytes":[8684,8719]},"callee":null},"301:41":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@301:41","span":{"start":[301,41],"end":[301,47],"bytes":[8712,8718]},"callee":null},"303:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@303:15","span":{"start":[303,15],"end":[303,61],"bytes":[8760,8806]},"callee":null},"304:10":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@304:10","span":{"start":[304,10],"end":[304,41],"bytes":[8816,8847]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath"},"305:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@305:13","span":{"start":[305,13],"end":[305,65],"bytes":[8860,8912]},"callee":null},"305:51":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@305:51","span":{"start":[305,51],"end":[305,63],"bytes":[8898,8910]},"callee":null},"307:3":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@307:3","span":{"start":[307,3],"end":[307,121],"bytes":[8916,9034]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"311:6":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@311:6","span":{"start":[311,6],"end":[311,18],"bytes":[9066,9078]},"callee":null},"312:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@312:12","span":{"start":[312,12],"end":[312,24],"bytes":[9096,9108]},"callee":null},"312:8":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@312:8","span":{"start":[312,8],"end":[312,34],"bytes":[9092,9118]},"callee":null},"316:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@316:13","span":{"start":[316,13],"end":[316,30],"bytes":[9203,9220]},"callee":null},"320:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@320:15","span":{"start":[320,15],"end":[320,59],"bytes":[9260,9304]},"callee":null},"322:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@322:11","span":{"start":[322,11],"end":[322,68],"bytes":[9333,9390]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"323:20":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@323:20","span":{"start":[323,20],"end":[323,49],"bytes":[9410,9439]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError"},"327:3":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@327:3","span":{"start":[327,3],"end":[327,87],"bytes":[9475,9559]},"callee":null},"327:3/2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles@327:3/2","span":{"start":[327,3],"end":[327,81],"bytes":[9475,9553]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.Init":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","kind":"method","span":{"start":[113,1],"end":[178,2],"bytes":[3063,4679]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[113,1],"end":[113,64],"bytes":[3063,3126]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"114:2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@114:2","span":{"start":[114,2],"end":[114,13],"bytes":[3128,3139]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"115:8":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@115:8","span":{"start":[115,8],"end":[115,21],"bytes":[3147,3160]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"123:10":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@123:10","span":{"start":[123,10],"end":[123,52],"bytes":[3267,3309]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"133:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@133:9","span":{"start":[133,9],"end":[133,32],"bytes":[3454,3477]},"callee":null},"137:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@137:9","span":{"start":[137,9],"end":[139,4],"bytes":[3566,3677]},"callee":null},"138:4":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@138:4","span":{"start":[138,4],"end":[138,78],"bytes":[3598,3672]},"callee":null},"142:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@142:9","span":{"start":[142,9],"end":[144,4],"bytes":[3747,3839]},"callee":null},"143:4":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@143:4","span":{"start":[143,4],"end":[143,59],"bytes":[3779,3834]},"callee":null},"148:8":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@148:8","span":{"start":[148,8],"end":[148,30],"bytes":[3872,3894]},"callee":null},"154:50":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@154:50","span":{"start":[154,50],"end":[154,89],"bytes":[4067,4106]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"154:7":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@154:7","span":{"start":[154,7],"end":[154,45],"bytes":[4024,4062]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"157:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@157:9","span":{"start":[157,9],"end":[157,35],"bytes":[4157,4183]},"callee":null},"161:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@161:13","span":{"start":[161,13],"end":[161,31],"bytes":[4222,4240]},"callee":null},"166:18":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@166:18","span":{"start":[166,18],"end":[168,5],"bytes":[4392,4475]},"callee":null},"171:18":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@171:18","span":{"start":[171,18],"end":[173,5],"bytes":[4520,4609]},"callee":null},"175:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init@175:15","span":{"start":[175,15],"end":[175,52],"bytes":[4627,4664]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init/github.com/benbjohnson/litestream/oss.ReplicaClient.Init.closure_1","kind":"function","span":{"start":[166,1],"end":[168,5],"bytes":[4375,4475]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.Init.closure_1","parameters":[{"name":"o","type":"invalid type","span":{"start":[166,1],"end":[166,69],"bytes":[4375,4443]}}],"body":{}},"closure_2":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init/github.com/benbjohnson/litestream/oss.ReplicaClient.Init.closure_2","kind":"function","span":{"start":[171,1],"end":[173,5],"bytes":[4503,4609]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.Init.closure_2","parameters":[{"name":"o","type":"invalid type","span":{"start":[171,1],"end":[171,69],"bytes":[4503,4571]}}],"body":{}}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles","kind":"method","span":{"start":[185,1],"end":[190,2],"bytes":[5068,5316]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[185,1],"end":[185,126],"bytes":[5068,5193]}},{"name":"level","type":"int","span":{"start":[185,1],"end":[185,126],"bytes":[5068,5193]}},{"name":"seek","type":"invalid type","span":{"start":[185,1],"end":[185,126],"bytes":[5068,5193]}},{"name":"useMetadata","type":"bool","span":{"start":[185,1],"end":[185,126],"bytes":[5068,5193]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"186:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles@186:12","span":{"start":[186,12],"end":[186,23],"bytes":[5205,5216]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"189:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles@189:9","span":{"start":[189,9],"end":[189,58],"bytes":[5260,5309]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator"}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[194,1],"end":[228,2],"bytes":[5423,6452]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"level","type":"int","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"minTXID","type":"invalid type","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"maxTXID","type":"invalid type","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"offset","type":"int64","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}},{"name":"size","type":"int64","span":{"start":[194,1],"end":[194,140],"bytes":[5423,5562]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"195:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@195:12","span":{"start":[195,12],"end":[195,23],"bytes":[5574,5585]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"200:14":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@200:14","span":{"start":[200,14],"end":[200,50],"bytes":[5672,5708]},"callee":null},"201:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@201:9","span":{"start":[201,9],"end":[201,35],"bytes":[5717,5743]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath"},"204:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@204:11","span":{"start":[204,11],"end":[204,28],"bytes":[5790,5807]},"callee":null},"205:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@205:11","span":{"start":[205,11],"end":[205,23],"bytes":[5819,5831]},"callee":null},"210:27":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@210:27","span":{"start":[210,27],"end":[210,46],"bytes":[5922,5941]},"callee":null},"211:19":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@211:19","span":{"start":[211,19],"end":[211,77],"bytes":[5960,6018]},"callee":null},"211:27":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@211:27","span":{"start":[211,27],"end":[211,76],"bytes":[5968,6017]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"213:27":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@213:27","span":{"start":[213,27],"end":[213,46],"bytes":[6069,6088]},"callee":null},"214:19":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@214:19","span":{"start":[214,19],"end":[214,60],"bytes":[6107,6148]},"callee":null},"214:27":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@214:27","span":{"start":[214,27],"end":[214,59],"bytes":[6115,6147]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"217:17":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@217:17","span":{"start":[217,17],"end":[217,49],"bytes":[6169,6201]},"callee":null},"219:6":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@219:6","span":{"start":[219,6],"end":[219,22],"bytes":[6224,6240]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.isNotExists"},"222:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@222:15","span":{"start":[222,15],"end":[222,61],"bytes":[6291,6337]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"225:2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@225:2","span":{"start":[225,2],"end":[225,83],"bytes":[6343,6424]},"callee":null},"225:2/2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile@225:2/2","span":{"start":[225,2],"end":[225,77],"bytes":[6343,6418]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.SetLogger","kind":"method","span":{"start":[85,1],"end":[87,2],"bytes":[2188,2294]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[85,1],"end":[85,57],"bytes":[2188,2244]}}],"metrics":{"cyclomatic":1},"body":{"86:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.SetLogger@86:13","span":{"start":[86,13],"end":[86,48],"bytes":[2257,2292]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.Type":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Type","kind":"method","span":{"start":[108,1],"end":[110,2],"bytes":[2921,2988]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[233,1],"end":[288,2],"bytes":[6668,8400]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}},{"name":"level","type":"int","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}},{"name":"minTXID","type":"invalid type","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}},{"name":"maxTXID","type":"invalid type","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}},{"name":"r","type":"io.Reader","span":{"start":[233,1],"end":[233,134],"bytes":[6668,6801]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"234:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@234:12","span":{"start":[234,12],"end":[234,23],"bytes":[6813,6824]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init"},"240:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@240:15","span":{"start":[240,15],"end":[240,36],"bytes":[6970,6991]},"callee":"can://litestream/litestream/@external/io/TeeReader"},"243:17":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@243:17","span":{"start":[243,17],"end":[243,42],"bytes":[7047,7072]},"callee":null},"245:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@245:15","span":{"start":[245,15],"end":[245,71],"bytes":[7104,7160]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"247:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@247:15","span":{"start":[247,15],"end":[247,50],"bytes":[7178,7213]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"247:15/2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@247:15/2","span":{"start":[247,15],"end":[247,44],"bytes":[7178,7207]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"250:32":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@250:32","span":{"start":[250,32],"end":[250,55],"bytes":[7292,7315]},"callee":"can://litestream/litestream/@external/io/MultiReader"},"250:8":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@250:8","span":{"start":[250,8],"end":[250,56],"bytes":[7268,7316]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter"},"252:14":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@252:14","span":{"start":[252,14],"end":[252,50],"bytes":[7331,7367]},"callee":null},"253:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@253:9","span":{"start":[253,9],"end":[253,35],"bytes":[7376,7402]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath"},"257:25":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@257:25","span":{"start":[257,25],"end":[257,59],"bytes":[7529,7563]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"261:17":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@261:17","span":{"start":[261,17],"end":[265,8],"bytes":[7648,7784]},"callee":null},"262:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@262:13","span":{"start":[262,13],"end":[262,30],"bytes":[7710,7727]},"callee":null},"263:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@263:13","span":{"start":[263,13],"end":[263,25],"bytes":[7741,7753]},"callee":null},"267:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@267:15","span":{"start":[267,15],"end":[267,60],"bytes":[7816,7861]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"275:14":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@275:14","span":{"start":[275,14],"end":[275,20],"bytes":[8010,8016]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"},"279:2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@279:2","span":{"start":[279,2],"end":[279,83],"bytes":[8047,8128]},"callee":null},"279:2/2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@279:2/2","span":{"start":[279,2],"end":[279,77],"bytes":[8047,8122]},"callee":null},"280:2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@280:2","span":{"start":[280,2],"end":[280,98],"bytes":[8130,8226]},"callee":null},"280:2/2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@280:2/2","span":{"start":[280,2],"end":[280,77],"bytes":[8130,8205]},"callee":null},"280:82":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@280:82","span":{"start":[280,82],"end":[280,97],"bytes":[8210,8225]},"callee":null},"280:90":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@280:90","span":{"start":[280,90],"end":[280,96],"bytes":[8218,8224]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"},"284:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile@284:15","span":{"start":[284,15],"end":[284,65],"bytes":[8326,8376]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","kind":"method","span":{"start":[389,1],"end":[391,2],"bytes":[10883,11016]},"signature":"github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","parameters":[{"name":"level","type":"int","span":{"start":[389,1],"end":[389,69],"bytes":[10883,10951]}},{"name":"filename","type":"string","span":{"start":[389,1],"end":[389,69],"bytes":[10883,10951]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"390:24":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath@390:24","span":{"start":[390,24],"end":[390,63],"bytes":[10975,11014]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}}},"fields":{"AccessKeyID":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/AccessKeyID","kind":"field","type":"string","span":{"start":[59,1],"end":[59,24],"bytes":[1489,1512]}},"AccessKeySecret":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/AccessKeySecret","kind":"field","type":"string","span":{"start":[60,1],"end":[60,24],"bytes":[1513,1536]}},"Bucket":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Bucket","kind":"field","type":"string","span":{"start":[64,1],"end":[64,17],"bytes":[1582,1598]}},"Concurrency":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Concurrency","kind":"field","type":"int","span":{"start":[70,1],"end":[70,72],"bytes":[1728,1799]}},"Endpoint":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Endpoint","kind":"field","type":"string","span":{"start":[66,1],"end":[66,17],"bytes":[1616,1632]}},"MetadataConcurrency":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/MetadataConcurrency","kind":"field","type":"int","span":{"start":[75,1],"end":[75,25],"bytes":[1973,1997]}},"PartSize":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/PartSize","kind":"field","type":"int64","span":{"start":[69,1],"end":[69,69],"bytes":[1659,1727]}},"Path":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[65,1],"end":[65,17],"bytes":[1599,1615]}},"Region":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/Region","kind":"field","type":"string","span":{"start":[63,1],"end":[63,17],"bytes":[1565,1581]}},"client":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/client","kind":"field","type":"invalid type","span":{"start":[54,1],"end":[54,22],"bytes":[1380,1401]}},"logger":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[56,1],"end":[56,23],"bytes":[1426,1448]}},"mu":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[53,1],"end":[53,21],"bytes":[1359,1379]}},"uploader":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/uploader","kind":"field","type":"invalid type","span":{"start":[55,1],"end":[55,24],"bytes":[1402,1425]}}}},"fileIterator":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator","kind":"struct","span":{"start":[394,1],"end":[412,2],"bytes":[11080,11547]},"callables":{"github.com/benbjohnson/litestream/oss.fileIterator.Close":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Close","kind":"method","span":{"start":[509,1],"end":[513,2],"bytes":[14035,14132]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"511:2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Close@511:2","span":{"start":[511,2],"end":[511,14],"bytes":[14102,14114]},"callee":null}}},"github.com/benbjohnson/litestream/oss.fileIterator.Err":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Err","kind":"method","span":{"start":[619,1],"end":[621,2],"bytes":[16662,16718]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/oss.fileIterator.Item":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Item","kind":"method","span":{"start":[614,1],"end":[616,2],"bytes":[16537,16603]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.Item","parameters":[],"return_type":"invalid type","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/oss.fileIterator.Next":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","kind":"method","span":{"start":[516,1],"end":[611,2],"bytes":[14213,16484]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":18},"body":{"522:2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@522:2","span":{"start":[522,2],"end":[522,21],"bytes":[14346,14365]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator"},"527:42":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@527:42","span":{"start":[527,42],"end":[527,64],"bytes":[14496,14518]},"callee":null},"528:8":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@528:8","span":{"start":[528,8],"end":[528,31],"bytes":[14528,14551]},"callee":null},"533:20":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@533:20","span":{"start":[533,20],"end":[533,51],"bytes":[14613,14644]},"callee":null},"543:26":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@543:26","span":{"start":[543,26],"end":[543,48],"bytes":[14981,15003]},"callee":null},"544:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@544:13","span":{"start":[544,13],"end":[544,54],"bytes":[15022,15063]},"callee":null},"544:31":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@544:31","span":{"start":[544,31],"end":[544,53],"bytes":[15040,15062]},"callee":null},"547:14":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@547:14","span":{"start":[547,14],"end":[547,36],"bytes":[15146,15168]},"callee":null},"550:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@550:15","span":{"start":[550,15],"end":[550,43],"bytes":[15196,15224]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch"},"558:22":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@558:22","span":{"start":[558,22],"end":[558,44],"bytes":[15341,15363]},"callee":null},"568:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@568:11","span":{"start":[568,11],"end":[568,29],"bytes":[15537,15555]},"callee":"can://litestream/litestream/@external/path/Base"},"569:29":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@569:29","span":{"start":[569,29],"end":[569,51],"bytes":[15584,15606]},"callee":null},"595:23":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@595:23","span":{"start":[595,23],"end":[595,45],"bytes":[16207,16229]},"callee":null},"597:23":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@597:23","span":{"start":[597,23],"end":[597,39],"bytes":[16265,16281]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"597:23/2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@597:23/2","span":{"start":[597,23],"end":[597,33],"bytes":[16265,16275]},"callee":"can://litestream/litestream/@external/time/Now"},"601:23":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@601:23","span":{"start":[601,23],"end":[601,45],"bytes":[16355,16377]},"callee":null},"603:23":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@603:23","span":{"start":[603,23],"end":[603,39],"bytes":[16413,16429]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"603:23/2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next@603:23/2","span":{"start":[603,23],"end":[603,33],"bytes":[16413,16423]},"callee":"can://litestream/litestream/@external/time/Now"}}},"github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch","kind":"method","span":{"start":[431,1],"end":[491,2],"bytes":[12043,13537]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch","parameters":[{"name":"keys","type":"[]string","span":{"start":[431,1],"end":[431,67],"bytes":[12043,12109]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"432:5":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch@432:5","span":{"start":[432,5],"end":[432,14],"bytes":[12114,12123]},"callee":null},"443:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch@443:13","span":{"start":[443,13],"end":[443,50],"bytes":[12377,12414]},"callee":null},"443:40":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch@443:40","span":{"start":[443,40],"end":[443,49],"bytes":[12404,12413]},"callee":null},"447:31":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch@447:31","span":{"start":[447,31],"end":[447,49],"bytes":[12543,12561]},"callee":null},"447:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch@447:9","span":{"start":[447,9],"end":[447,50],"bytes":[12521,12562]},"callee":null},"448:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch@448:12","span":{"start":[448,12],"end":[448,41],"bytes":[12574,12603]},"callee":null},"453:3":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch@453:3","span":{"start":[453,3],"end":[479,5],"bytes":[12674,13380]},"callee":null},"482:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch@482:12","span":{"start":[482,12],"end":[482,20],"bytes":[13396,13404]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1","kind":"function","span":{"start":[453,1],"end":[479,5],"bytes":[12672,13380]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1","parameters":[],"return_type":"error","error_channel":["error"],"body":{"455:14":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1@455:14","span":{"start":[455,14],"end":[455,33],"bytes":[12773,12792]},"callee":null},"458:10":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1@458:10","span":{"start":[458,10],"end":[458,24],"bytes":[12857,12871]},"callee":null,"is_deferred":true},"460:17":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1@460:17","span":{"start":[460,17],"end":[463,6],"bytes":[12889,13018]},"callee":null},"461:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1@461:13","span":{"start":[461,13],"end":[461,39],"bytes":[12959,12985]},"callee":null},"462:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1@462:13","span":{"start":[462,13],"end":[462,25],"bytes":[12999,13011]},"callee":null},"471:24":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1@471:24","span":{"start":[471,24],"end":[471,56],"bytes":[13235,13267]},"callee":"can://litestream/litestream/@external/time/Parse"},"472:7":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1@472:7","span":{"start":[472,7],"end":[472,16],"bytes":[13288,13297]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"474:7":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1@474:7","span":{"start":[474,7],"end":[474,18],"bytes":[13332,13343]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}}}}},"github.com/benbjohnson/litestream/oss.fileIterator.initPaginator":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator","kind":"method","span":{"start":[494,1],"end":[506,2],"bytes":[13590,13954]},"signature":"github.com/benbjohnson/litestream/oss.fileIterator.initPaginator","parameters":[],"metrics":{"cyclomatic":2},"body":{"501:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator@501:12","span":{"start":[501,12],"end":[501,45],"bytes":[13762,13795]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath"},"502:18":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator@502:18","span":{"start":[502,18],"end":[505,4],"bytes":[13813,13952]},"callee":null},"503:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator@503:11","span":{"start":[503,11],"end":[503,37],"bytes":[13894,13920]},"callee":null},"504:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator@504:11","span":{"start":[504,11],"end":[504,26],"bytes":[13932,13947]},"callee":null}}}},"fields":{"cancel":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[396,1],"end":[396,27],"bytes":[11131,11157]}},"client":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/client","kind":"field","type":"*github.com/benbjohnson/litestream/oss.ReplicaClient","span":{"start":[397,1],"end":[397,23],"bytes":[11158,11180]}},"closed":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/closed","kind":"field","type":"bool","span":{"start":[409,1],"end":[409,13],"bytes":[11497,11509]}},"ctx":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/ctx","kind":"field","type":"context.Context","span":{"start":[395,1],"end":[395,24],"bytes":[11107,11130]}},"err":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/err","kind":"field","type":"error","span":{"start":[410,1],"end":[410,14],"bytes":[11510,11523]}},"info":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/info","kind":"field","type":"invalid type","span":{"start":[411,1],"end":[411,22],"bytes":[11524,11545]}},"initialized":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/initialized","kind":"field","type":"bool","span":{"start":[407,1],"end":[407,18],"bytes":[11478,11495]}},"level":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/level","kind":"field","type":"int","span":{"start":[398,1],"end":[398,12],"bytes":[11181,11192]}},"metadataCache":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/metadataCache","kind":"field","type":"map[string]time.Time","span":{"start":[402,1],"end":[402,80],"bytes":[11301,11380]}},"page":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/page","kind":"field","type":"invalid type","span":{"start":[405,1],"end":[405,38],"bytes":[11423,11460]}},"pageIndex":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/pageIndex","kind":"field","type":"int","span":{"start":[406,1],"end":[406,17],"bytes":[11461,11477]}},"paginator":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/paginator","kind":"field","type":"invalid type","span":{"start":[404,1],"end":[404,41],"bytes":[11382,11422]}},"seek":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/seek","kind":"field","type":"invalid type","span":{"start":[399,1],"end":[399,17],"bytes":[11193,11209]}},"useMetadata":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/useMetadata","kind":"field","type":"bool","span":{"start":[401,1],"end":[401,90],"bytes":[11211,11300]}}}}},"functions":{"github.com/benbjohnson/litestream/oss.NewReplicaClient":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","kind":"function","span":{"start":[79,1],"end":[83,2],"bytes":[2062,2186]},"signature":"github.com/benbjohnson/litestream/oss.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/oss.ReplicaClient","metrics":{"cyclomatic":1},"body":{"81:11":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient@81:11","span":{"start":[81,11],"end":[81,54],"bytes":[2137,2180]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"81:11/2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient@81:11/2","span":{"start":[81,11],"end":[81,25],"bytes":[2137,2151]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","kind":"function","span":{"start":[92,1],"end":[105,2],"bytes":[2491,2877]},"signature":"github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}},{"name":"host","type":"string","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}},{"name":"urlPath","type":"string","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}},{"name":"query","type":"net/url.Values","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[92,1],"end":[92,137],"bytes":[2491,2627]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"93:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL@93:12","span":{"start":[93,12],"end":[93,30],"bytes":[2639,2657]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient"},"95:23":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL@95:23","span":{"start":[95,23],"end":[95,38],"bytes":[2681,2696]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost"},"97:15":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL@97:15","span":{"start":[97,15],"end":[97,64],"bytes":[2730,2779]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/oss.ParseHost":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","kind":"function","span":{"start":[649,1],"end":[670,2],"bytes":[17421,17991]},"signature":"github.com/benbjohnson/litestream/oss.ParseHost","parameters":[{"name":"host","type":"string","span":{"start":[649,1],"end":[649,64],"bytes":[17421,17484]}}],"return_type":"(string, string, string)","metrics":{"cyclomatic":5},"body":{"651:10":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost@651:10","span":{"start":[651,10],"end":[651,51],"bytes":[17562,17603]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"651:53":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost@651:53","span":{"start":[651,53],"end":[651,59],"bytes":[17605,17611]},"callee":null},"653:6":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost@653:6","span":{"start":[653,6],"end":[653,12],"bytes":[17639,17645]},"callee":null},"660:10":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost@660:10","span":{"start":[660,10],"end":[660,43],"bytes":[17766,17799]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"660:45":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost@660:45","span":{"start":[660,45],"end":[660,51],"bytes":[17801,17807]},"callee":null},"662:6":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost@662:6","span":{"start":[662,6],"end":[662,12],"bytes":[17835,17841]},"callee":null}}},"github.com/benbjohnson/litestream/oss.ParseURL":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL","kind":"function","span":{"start":[624,1],"end":[642,2],"bytes":[16780,17200]},"signature":"github.com/benbjohnson/litestream/oss.ParseURL","parameters":[{"name":"s","type":"string","span":{"start":[624,1],"end":[624,66],"bytes":[16780,16845]}}],"return_type":"(string, string, string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"625:12":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL@625:12","span":{"start":[625,12],"end":[625,24],"bytes":[16857,16869]},"callee":"can://litestream/litestream/@external/net/url/Parse"},"631:22":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL@631:22","span":{"start":[631,22],"end":[631,59],"bytes":[16961,16998]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"635:22":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL@635:22","span":{"start":[635,22],"end":[635,39],"bytes":[17068,17085]},"callee":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost"},"640:8":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL@640:8","span":{"start":[640,8],"end":[640,39],"bytes":[17134,17165]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"}}},"github.com/benbjohnson/litestream/oss.deleteResultError":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","kind":"function","span":{"start":[691,1],"end":[726,2],"bytes":[18772,19594]},"signature":"github.com/benbjohnson/litestream/oss.deleteResultError","parameters":[{"name":"requested","type":"[]invalid type","span":{"start":[691,1],"end":[691,99],"bytes":[18772,18870]}},{"name":"out","type":"invalid type","span":{"start":[691,1],"end":[691,99],"bytes":[18772,18870]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"697:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError@697:13","span":{"start":[697,13],"end":[697,63],"bytes":[18964,19014]},"callee":null},"697:39":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError@697:39","span":{"start":[697,39],"end":[697,62],"bytes":[18990,19013]},"callee":null},"711:13":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError@711:13","span":{"start":[711,13],"end":[711,37],"bytes":[19311,19335]},"callee":null},"715:5":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError@715:5","span":{"start":[715,5],"end":[715,16],"bytes":[19348,19359]},"callee":null},"721:2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError@721:2","span":{"start":[721,2],"end":[721,47],"bytes":[19452,19497]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"723:3":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError@723:3","span":{"start":[723,3],"end":[723,31],"bytes":[19530,19558]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"},"725:20":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError@725:20","span":{"start":[725,20],"end":[725,30],"bytes":[19581,19591]},"callee":"can://litestream/litestream/@external/strings/Builder.String"},"725:9":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError@725:9","span":{"start":[725,9],"end":[725,31],"bytes":[19570,19592]},"callee":"can://litestream/litestream/@external/errors/New"}}},"github.com/benbjohnson/litestream/oss.init":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.init","kind":"function","span":{"start":[28,1],"end":[30,2],"bytes":[431,519]},"signature":"github.com/benbjohnson/litestream/oss.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"29:2":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.init@29:2","span":{"start":[29,2],"end":[29,73],"bytes":[446,517]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/oss.isNotExists":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.isNotExists","kind":"function","span":{"start":[680,1],"end":[686,2],"bytes":[18410,18571]},"signature":"github.com/benbjohnson/litestream/oss.isNotExists","parameters":[{"name":"err","type":"error","span":{"start":[680,1],"end":[680,35],"bytes":[18410,18444]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"682:5":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.isNotExists@682:5","span":{"start":[682,5],"end":[682,32],"bytes":[18483,18510]},"callee":"can://litestream/litestream/@external/errors/As"}}},"github.com/benbjohnson/litestream/oss.newFileIterator":{"id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator","kind":"function","span":{"start":[414,1],"end":[428,2],"bytes":[11549,11949]},"signature":"github.com/benbjohnson/litestream/oss.newFileIterator","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}},{"name":"client","type":"*github.com/benbjohnson/litestream/oss.ReplicaClient","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}},{"name":"level","type":"int","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}},{"name":"seek","type":"invalid type","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}},{"name":"useMetadata","type":"bool","span":{"start":[414,1],"end":[414,125],"bytes":[11549,11673]}}],"return_type":"*github.com/benbjohnson/litestream/oss.fileIterator","metrics":{"cyclomatic":1},"body":{"415:17":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator@415:17","span":{"start":[415,17],"end":[415,40],"bytes":[11690,11713]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"424:18":{"kind":"call","id":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator@424:18","span":{"start":[424,18],"end":[424,44],"bytes":[11904,11930]},"callee":null}}}},"content_hash":"c4aa5689e4bfc9330f1ff5f76ce0208a37895f43f5de7ca9427f243d3f037e17"},"replica.go":{"id":"can://litestream/litestream/go/replica.go","kind":"module","span":{"start":[1,1],"end":[1847,1],"bytes":[0,54263]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"crypto/rand\"\n\t\"database/sql\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/semaphore\"\n\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// Default replica settings.\nconst (\n\tDefaultSyncInterval = 1 * time.Second\n\tDefaultMaxSyncLTXFiles = 256\n)\n\nvar errReplicaWaitForData = errors.New(\"no position, waiting for data\")\n\n// Replica connects a database to a replication destination via a ReplicaClient.\n// The replica manages periodic synchronization and maintaining the current\n// replica position.\ntype Replica struct {\n\tdb *DB\n\n\tmu sync.RWMutex\n\tpos ltx.Pos // current replicated position\n\n\tsyncSem *semaphore.Weighted\n\tsyncWaiters atomic.Int64 // diagnostic instrumentation: goroutines queued on syncSem\n\n\tmuf sync.Mutex\n\tf *os.File // long-running file descriptor to avoid non-OFD lock issues\n\n\twg sync.WaitGroup\n\tcancel func()\n\n\t// Client used to connect to the remote replica.\n\tClient ReplicaClient\n\n\t// Time between syncs with the shadow WAL.\n\tSyncInterval time.Duration\n\n\t// Maximum L0 files to upload in a single monitor sync batch.\n\t// Set to zero to process all pending L0 files in one batch.\n\tMaxSyncLTXFiles int\n\n\t// If true, replica monitors database for changes automatically.\n\t// Set to false if replica is being used synchronously (such as in tests).\n\tMonitorEnabled bool\n\n\t// If true, automatically reset local state when LTX errors are detected.\n\t// This allows recovery from corrupted/missing LTX files by resetting\n\t// the position file and removing local LTX files, forcing a fresh sync.\n\t// Disabled by default to prevent silent data loss scenarios.\n\tAutoRecoverEnabled bool\n}\n\nfunc NewReplica(db *DB) *Replica {\n\tr := \u0026Replica{\n\t\tdb: db,\n\t\tsyncSem: semaphore.NewWeighted(1),\n\t\tcancel: func() {},\n\n\t\tSyncInterval: DefaultSyncInterval,\n\t\tMaxSyncLTXFiles: DefaultMaxSyncLTXFiles,\n\t\tMonitorEnabled: true,\n\t}\n\n\treturn r\n}\n\nfunc NewReplicaWithClient(db *DB, client ReplicaClient) *Replica {\n\tr := NewReplica(db)\n\tr.Client = client\n\treturn r\n}\n\n// Logger returns the DB sub-logger for this replica.\nfunc (r *Replica) Logger() *slog.Logger {\n\tlogger := slog.Default()\n\tif r.db != nil {\n\t\tlogger = r.db.Logger\n\t}\n\treturn logger.With(\"replica\", r.Client.Type())\n}\n\n// DB returns a reference to the database the replica is attached to, if any.\nfunc (r *Replica) DB() *DB { return r.db }\n\n// Starts replicating in a background goroutine.\nfunc (r *Replica) Start(ctx context.Context) error {\n\t// Ignore if replica is being used sychronously.\n\tif !r.MonitorEnabled {\n\t\treturn nil\n\t}\n\n\t// Stop previous replication.\n\tr.Stop(false)\n\n\t// Wrap context with cancelation.\n\tctx, r.cancel = context.WithCancel(ctx)\n\n\t// Start goroutine to replicate data.\n\tr.wg.Add(1)\n\tgo func() { defer r.wg.Done(); r.monitor(ctx) }()\n\n\treturn nil\n}\n\n// Stop cancels any outstanding replication and blocks until finished.\n//\n// Performing a hard stop will close the DB file descriptor which could release\n// locks on per-process locks. Hard stops should only be performed when\n// stopping the entire process.\nfunc (r *Replica) Stop(hard bool) (err error) {\n\tr.cancel()\n\tr.wg.Wait()\n\n\tr.muf.Lock()\n\tdefer r.muf.Unlock()\n\tif hard \u0026\u0026 r.f != nil {\n\t\tif e := r.f.Close(); e != nil \u0026\u0026 err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\treturn err\n}\n\n// Sync copies new WAL frames from the shadow WAL to the replica client.\n// Only one Sync can run at a time to prevent concurrent uploads of the same file.\nfunc (r *Replica) Sync(ctx context.Context) (err error) {\n\treturn r.sync(ctx, 0)\n}\n\nfunc (r *Replica) sync(ctx context.Context, maxSyncLTXFiles int) error {\n\tfor {\n\t\tresult, err := r.syncOnce(ctx, maxSyncLTXFiles)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t} else if !result.limited {\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\ntype replicaSyncResult struct {\n\tsynced bool\n\tlimited bool\n}\n\nfunc (r *Replica) syncOnce(ctx context.Context, maxSyncLTXFiles int) (result replicaSyncResult, err error) {\n\tif err := r.lockSync(ctx); err != nil {\n\t\treturn result, err\n\t}\n\tdefer r.syncSem.Release(1)\n\n\t// Clear last position if if an error occurs during sync.\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tr.mu.Lock()\n\t\t\tr.pos = ltx.Pos{}\n\t\t\tr.mu.Unlock()\n\t\t}\n\t}()\n\n\tif err := ctx.Err(); err != nil {\n\t\treturn result, context.Cause(ctx)\n\t}\n\n\t// Calculate current replica position, if unknown.\n\tif r.Pos().IsZero() {\n\t\tpos, err := r.calcPos(ctx)\n\t\tif err != nil {\n\t\t\treturn result, fmt.Errorf(\"calc pos: %w\", err)\n\t\t}\n\t\tr.SetPos(pos)\n\t}\n\n\t// Find current position of database.\n\tdpos, err := r.db.Pos()\n\tif err != nil {\n\t\treturn result, fmt.Errorf(\"cannot determine current position: %w\", err)\n\t} else if dpos.IsZero() {\n\t\treturn result, errReplicaWaitForData\n\t}\n\n\tr.Logger().Debug(\"replica sync\",\n\t\tslog.Group(\"txid\",\n\t\t\tslog.String(\"replica\", r.Pos().TXID.String()),\n\t\t\tslog.String(\"db\", dpos.TXID.String()),\n\t\t))\n\n\t// Replicate all L0 LTX files since last replica position.\n\tfor txID, syncedFileN := r.Pos().TXID+1, 0; txID \u003c= dpos.TXID; txID = r.Pos().TXID + 1 {\n\t\tif maxSyncLTXFiles \u003e 0 \u0026\u0026 syncedFileN \u003e= maxSyncLTXFiles {\n\t\t\tresult.limited = true\n\t\t\t// Uploads succeeded, so record sync health; otherwise a\n\t\t\t// sustained backlog reads as unhealthy while progressing.\n\t\t\tr.db.RecordSuccessfulSync()\n\t\t\tr.Logger().Debug(\"replica sync limited\",\n\t\t\t\t\"synced_files\", syncedFileN,\n\t\t\t\t\"db_txid\", dpos.TXID.String(),\n\t\t\t\t\"replica_txid\", r.Pos().TXID.String())\n\t\t\treturn result, nil\n\t\t}\n\t\tif err := ctx.Err(); err != nil {\n\t\t\treturn result, context.Cause(ctx)\n\t\t}\n\t\tif err := r.uploadLTXFile(ctx, 0, txID, txID); err != nil {\n\t\t\treturn result, err\n\t\t}\n\t\tr.SetPos(ltx.Pos{TXID: txID})\n\t\tresult.synced = true\n\t\tsyncedFileN++\n\t}\n\n\t// Record successful sync for heartbeat monitoring.\n\tr.db.RecordSuccessfulSync()\n\n\treturn result, nil\n}\n\nfunc (r *Replica) lockSync(ctx context.Context) error {\n\tif r.syncSem.TryAcquire(1) {\n\t\treturn nil\n\t}\n\tr.syncWaiters.Add(1)\n\tdefer r.syncWaiters.Add(-1)\n\tif err := r.syncSem.Acquire(ctx, 1); err != nil {\n\t\treturn fmt.Errorf(\"wait for replica sync: %w\", context.Cause(ctx))\n\t}\n\treturn nil\n}\n\nfunc (r *Replica) uploadLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID) (err error) {\n\tfilename := r.db.LTXPath(level, minTXID, maxTXID)\n\tf, err := os.Open(filename)\n\tif err != nil {\n\t\treturn NewLTXError(\"open\", filename, level, uint64(minTXID), uint64(maxTXID), err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tinfo, err := r.Client.WriteLTXFile(ctx, level, minTXID, maxTXID, f)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"write ltx file: %w\", err)\n\t}\n\tr.Logger().Debug(\"ltx file uploaded\",\n\t\t\"level\", info.Level,\n\t\t\"minTXID\", info.MinTXID,\n\t\t\"maxTXID\", info.MaxTXID,\n\t\t\"size\", info.Size)\n\n\t// Track current position\n\t//replicaWALIndexGaugeVec.WithLabelValues(r.db.Path(), r.Name()).Set(float64(rd.Pos().Index))\n\t//replicaWALOffsetGaugeVec.WithLabelValues(r.db.Path(), r.Name()).Set(float64(rd.Pos().Offset))\n\n\treturn nil\n}\n\n// calcPos returns the last position saved to the replica for level 0.\nfunc (r *Replica) calcPos(ctx context.Context) (pos ltx.Pos, err error) {\n\tinfo, err := r.MaxLTXFileInfo(ctx, 0)\n\tif err != nil {\n\t\treturn pos, fmt.Errorf(\"max ltx file: %w\", err)\n\t}\n\treturn ltx.Pos{TXID: info.MaxTXID}, nil\n}\n\n// MaxLTXFileInfo returns metadata about the last LTX file for a given level.\n// Returns nil if no files exist for the level.\nfunc (r *Replica) MaxLTXFileInfo(ctx context.Context, level int) (info ltx.FileInfo, err error) {\n\t// Normal operation - use fast timestamps\n\titr, err := r.Client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn info, err\n\t}\n\tdefer itr.Close()\n\n\tfor itr.Next() {\n\t\titem := itr.Item()\n\t\tif item.MaxTXID \u003e info.MaxTXID {\n\t\t\tinfo = *item\n\t\t}\n\t}\n\treturn info, itr.Close()\n}\n\n// Pos returns the current replicated position.\n// Returns a zero value if the current position cannot be determined.\nfunc (r *Replica) Pos() ltx.Pos {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\treturn r.pos\n}\n\n// SetPos sets the current replicated position.\nfunc (r *Replica) SetPos(pos ltx.Pos) {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tr.pos = pos\n}\n\n// EnforceRetention forces a new snapshot once the retention interval has passed.\n// Older snapshots and WAL files are then removed.\nfunc (r *Replica) EnforceRetention(ctx context.Context) (err error) {\n\tpanic(\"TODO(ltx): Re-implement after multi-level compaction\")\n\n\t/*\n\t\t// Obtain list of snapshots that are within the retention period.\n\t\tsnapshots, err := r.Snapshots(ctx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"snapshots: %w\", err)\n\t\t}\n\t\tretained := FilterSnapshotsAfter(snapshots, time.Now().Add(-r.Retention))\n\n\t\t// If no retained snapshots exist, create a new snapshot.\n\t\tif len(retained) == 0 {\n\t\t\tsnapshot, err := r.Snapshot(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"snapshot: %w\", err)\n\t\t\t}\n\t\t\tretained = append(retained, snapshot)\n\t\t}\n\n\t\t// Delete unretained snapshots \u0026 WAL files.\n\t\tsnapshot := FindMinSnapshot(retained)\n\n\t\t// Otherwise remove all earlier snapshots \u0026 WAL segments.\n\t\tif err := r.deleteSnapshotsBeforeIndex(ctx, snapshot.Index); err != nil {\n\t\t\treturn fmt.Errorf(\"delete snapshots before index: %w\", err)\n\t\t} else if err := r.deleteWALSegmentsBeforeIndex(ctx, snapshot.Index); err != nil {\n\t\t\treturn fmt.Errorf(\"delete wal segments before index: %w\", err)\n\t\t}\n\n\t\treturn nil\n\t*/\n}\n\n/*\nfunc (r *Replica) deleteBeforeTXID(ctx context.Context, level int, txID ltx.TXID) error {\n\titr, err := r.Client.LTXFiles(ctx, level)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar a []*ltx.FileInfo\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\t\tif info.MinTXID \u003e= txID {\n\t\t\tcontinue\n\t\t}\n\t\ta = append(a, info)\n\t}\n\tif err := itr.Close(); err != nil {\n\t\treturn err\n\t}\n\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\n\tif err := r.Client.DeleteLTXFiles(ctx, a); err != nil {\n\t\treturn fmt.Errorf(\"delete wal segments: %w\", err)\n\t}\n\n\tr.Logger().Info(\"ltx files deleted before\",\n\t\tslog.Int(\"level\", level),\n\t\tslog.String(\"txID\", txID.String()),\n\t\tslog.Int(\"n\", len(a)))\n\n\treturn nil\n}\n*/\n\n// monitor runs in a separate goroutine and continuously replicates the DB.\n// Implements exponential backoff on repeated sync errors to prevent log spam\n// and reduce load when persistent errors occur. See issue #927.\nfunc (r *Replica) monitor(ctx context.Context) {\n\tticker := time.NewTicker(r.SyncInterval)\n\tdefer ticker.Stop()\n\n\tnotify := r.db.Notify()\n\n\tvar backoff time.Duration\n\tvar lastLogTime time.Time\n\tvar consecutiveErrs int\n\n\tfor initial := true; ; initial = false {\n\t\t// Enforce a minimum time between synchronization.\n\t\tif !initial {\n\t\t\tselect {\n\t\t\tcase \u003c-ctx.Done():\n\t\t\t\treturn\n\t\t\tcase \u003c-ticker.C:\n\t\t\t}\n\t\t}\n\n\t\t// If in backoff mode, wait additional time before retrying.\n\t\tif backoff \u003e 0 {\n\t\t\tselect {\n\t\t\tcase \u003c-ctx.Done():\n\t\t\t\treturn\n\t\t\tcase \u003c-time.After(backoff):\n\t\t\t}\n\t\t}\n\n\t\t// If the position is unavailable, skip the wait so Sync() surfaces\n\t\t// the error to the backoff \u0026 auto-recovery handling below.\n\t\tif pos, err := r.db.Pos(); err == nil \u0026\u0026 pos.TXID \u003c= r.Pos().TXID {\n\t\t\t// Wait for new data, but still sync on an interval so idle\n\t\t\t// databases continue recording sync health for heartbeats.\n\t\t\tselect {\n\t\t\tcase \u003c-ctx.Done():\n\t\t\t\treturn\n\t\t\tcase \u003c-ticker.C:\n\t\t\tcase \u003c-notify:\n\t\t\t}\n\t\t} else if ctx.Err() != nil {\n\t\t\treturn\n\t\t}\n\n\t\t// Fetch new notify channel before replicating data.\n\t\tnotify = r.db.Notify()\n\n\t\t// Synchronize the shadow wal into the replication directory.\n\t\tif err := r.sync(ctx, r.MaxSyncLTXFiles); err != nil {\n\t\t\tif errors.Is(err, errReplicaWaitForData) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Don't log context cancellation errors during shutdown\n\t\t\tif !isShutdownError(ctx, err) {\n\t\t\t\tconsecutiveErrs++\n\n\t\t\t\t// Exponential backoff: SyncInterval -\u003e 2x -\u003e 4x -\u003e ... -\u003e max\n\t\t\t\tif backoff == 0 {\n\t\t\t\t\tbackoff = r.SyncInterval\n\t\t\t\t} else {\n\t\t\t\t\tbackoff *= 2\n\t\t\t\t\tif backoff \u003e DefaultSyncBackoffMax {\n\t\t\t\t\t\tbackoff = DefaultSyncBackoffMax\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check for LTX errors and include recovery hints\n\t\t\t\tvar ltxErr *LTXError\n\t\t\t\tif errors.As(err, \u0026ltxErr) {\n\t\t\t\t\t// Log with rate limiting to avoid log spam during persistent errors.\n\t\t\t\t\tif time.Since(lastLogTime) \u003e= SyncErrorLogInterval {\n\t\t\t\t\t\tif ltxErr.Hint != \"\" {\n\t\t\t\t\t\t\tr.Logger().Error(\"monitor error\",\n\t\t\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\t\t\"path\", ltxErr.Path,\n\t\t\t\t\t\t\t\t\"hint\", ltxErr.Hint,\n\t\t\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\t\t\"backoff\", backoff)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tr.Logger().Error(\"monitor error\",\n\t\t\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\t\t\"path\", ltxErr.Path,\n\t\t\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\t\t\"backoff\", backoff)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastLogTime = time.Now()\n\t\t\t\t\t}\n\n\t\t\t\t\t// Attempt auto-recovery only for missing/corrupt LTX files.\n\t\t\t\t\t// Transient OS errors (EMFILE, EIO, EACCES) should retry\n\t\t\t\t\t// with backoff rather than destructively resetting state.\n\t\t\t\t\tif r.AutoRecoverEnabled \u0026\u0026 ltxErr.IsAutoRecoverable() {\n\t\t\t\t\t\tr.Logger().Warn(\"auto-recovery enabled, resetting local state\")\n\t\t\t\t\t\tif resetErr := r.db.ResetLocalState(ctx); resetErr != nil {\n\t\t\t\t\t\t\tr.Logger().Error(\"auto-recovery failed\", \"error\", resetErr)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tr.Logger().Info(\"auto-recovery complete, resuming replication\")\n\t\t\t\t\t\t\t// Reset backoff after successful recovery\n\t\t\t\t\t\t\tbackoff = 0\n\t\t\t\t\t\t\tconsecutiveErrs = 0\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Log with rate limiting to avoid log spam during persistent errors.\n\t\t\t\t\tif time.Since(lastLogTime) \u003e= SyncErrorLogInterval {\n\t\t\t\t\t\tr.Logger().Error(\"monitor error\",\n\t\t\t\t\t\t\t\"error\", err,\n\t\t\t\t\t\t\t\"consecutive_errors\", consecutiveErrs,\n\t\t\t\t\t\t\t\"backoff\", backoff)\n\t\t\t\t\t\tlastLogTime = time.Now()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Success - reset backoff and error counter.\n\t\tif consecutiveErrs \u003e 0 {\n\t\t\tr.Logger().Info(\"replica sync recovered\", \"previous_errors\", consecutiveErrs)\n\t\t}\n\t\tbackoff = 0\n\t\tconsecutiveErrs = 0\n\t}\n}\n\n// CreatedAt returns the earliest creation time of any LTX file.\n// Returns zero time if no LTX files exist.\nfunc (r *Replica) CreatedAt(ctx context.Context) (time.Time, error) {\n\tvar min time.Time\n\n\t// Normal operation - use fast timestamps\n\titr, err := r.Client.LTXFiles(ctx, 0, 0, false)\n\tif err != nil {\n\t\treturn min, err\n\t}\n\tdefer itr.Close()\n\n\tif itr.Next() {\n\t\tmin = itr.Item().CreatedAt\n\t}\n\treturn min, itr.Close()\n}\n\n// TimeBounds returns the creation time \u0026 last updated time.\n// Returns zero time if no LTX files exist.\nfunc (r *Replica) TimeBounds(ctx context.Context) (createdAt, updatedAt time.Time, err error) {\n\tfor level := SnapshotLevel; level \u003e= 0; level-- {\n\t\titr, err := r.Client.LTXFiles(ctx, level, 0, false)\n\t\tif err != nil {\n\t\t\treturn createdAt, updatedAt, err\n\t\t}\n\n\t\tfor itr.Next() {\n\t\t\tinfo := itr.Item()\n\t\t\tif createdAt.IsZero() || info.CreatedAt.Before(createdAt) {\n\t\t\t\tcreatedAt = info.CreatedAt\n\t\t\t}\n\t\t\tif updatedAt.IsZero() || info.CreatedAt.After(updatedAt) {\n\t\t\t\tupdatedAt = info.CreatedAt\n\t\t\t}\n\t\t}\n\t\tif err := itr.Close(); err != nil {\n\t\t\treturn createdAt, updatedAt, err\n\t\t}\n\t}\n\treturn createdAt, updatedAt, nil\n}\n\n// CalcRestoreTarget returns a target time restore from.\nfunc (r *Replica) CalcRestoreTarget(ctx context.Context, opt RestoreOptions) (updatedAt time.Time, err error) {\n\t// Determine the replicated time bounds from LTX files.\n\tcreatedAt, updatedAt, err := r.TimeBounds(ctx)\n\tif err != nil {\n\t\treturn time.Time{}, fmt.Errorf(\"created at: %w\", err)\n\t}\n\n\t// Also check v0.3.x time bounds if client supports it.\n\tif client, ok := r.Client.(ReplicaClientV3); ok {\n\t\tv3CreatedAt, v3UpdatedAt, err := r.TimeBoundsV3(ctx, client)\n\t\tif err != nil {\n\t\t\treturn time.Time{}, fmt.Errorf(\"v0.3.x time bounds: %w\", err)\n\t\t}\n\t\t// Extend time bounds to include v0.3.x backups.\n\t\tif !v3CreatedAt.IsZero() \u0026\u0026 (createdAt.IsZero() || v3CreatedAt.Before(createdAt)) {\n\t\t\tcreatedAt = v3CreatedAt\n\t\t}\n\t\tif !v3UpdatedAt.IsZero() \u0026\u0026 (updatedAt.IsZero() || v3UpdatedAt.After(updatedAt)) {\n\t\t\tupdatedAt = v3UpdatedAt\n\t\t}\n\t}\n\n\t// Skip if it does not contain timestamp.\n\tif !opt.Timestamp.IsZero() {\n\t\tif createdAt.IsZero() \u0026\u0026 updatedAt.IsZero() {\n\t\t\treturn time.Time{}, fmt.Errorf(\"no backups found\")\n\t\t}\n\t\tif opt.Timestamp.Before(createdAt) || opt.Timestamp.After(updatedAt) {\n\t\t\treturn time.Time{}, fmt.Errorf(\"timestamp does not exist\")\n\t\t}\n\t}\n\n\treturn updatedAt, nil\n}\n\n// Replica restores the database from a replica based on the options given.\n// This method will restore into opt.OutputPath, if specified, or into the\n// DB's original database path. It can optionally restore from a specific\n// replica or it will automatically choose the best one. Finally,\n// a timestamp can be specified to restore the database to a specific\n// point-in-time.\n//\n// When the replica contains both v0.3.x and LTX format backups, this method\n// compares snapshots from both formats and uses whichever has the better backup:\n// - With timestamp: uses the format with the most recent snapshot before timestamp\n// - Without timestamp: uses the format with the most recent backup overall\nfunc (r *Replica) Restore(ctx context.Context, opt RestoreOptions) (err error) {\n\t// Validate options.\n\tif opt.OutputPath == \"\" {\n\t\treturn fmt.Errorf(\"output path required\")\n\t} else if opt.TXID != 0 \u0026\u0026 !opt.Timestamp.IsZero() {\n\t\treturn fmt.Errorf(\"cannot specify index \u0026 timestamp to restore\")\n\t} else if opt.Follow \u0026\u0026 opt.TXID != 0 {\n\t\treturn fmt.Errorf(\"cannot use follow mode with -txid\")\n\t} else if opt.Follow \u0026\u0026 !opt.Timestamp.IsZero() {\n\t\treturn fmt.Errorf(\"cannot use follow mode with -timestamp\")\n\t} else if opt.IntegrityCheck != IntegrityCheckNone \u0026\u0026 opt.IntegrityCheck != IntegrityCheckQuick \u0026\u0026 opt.IntegrityCheck != IntegrityCheckFull {\n\t\treturn fmt.Errorf(\"unsupported integrity check mode: %d\", opt.IntegrityCheck)\n\t}\n\n\t// In follow mode, if the database already exists, attempt crash recovery\n\t// by reading the last applied TXID from the sidecar file.\n\tif opt.Follow {\n\t\tif _, statErr := os.Stat(opt.OutputPath); statErr == nil {\n\t\t\ttxid, readErr := ReadTXIDFile(opt.OutputPath)\n\t\t\tif readErr != nil {\n\t\t\t\treturn fmt.Errorf(\"read txid file for crash recovery: %w\", readErr)\n\t\t\t}\n\t\t\tif txid == 0 {\n\t\t\t\treturn fmt.Errorf(\"cannot resume follow mode: database exists but no -txid file found; delete the database to re-restore: %s\", opt.OutputPath)\n\t\t\t}\n\t\t\t// Validate saved TXID is still reachable. If the earliest snapshot\n\t\t\t// starts after our saved TXID, retention has pruned the history\n\t\t\t// and we can't catch up incrementally.\n\t\t\tsnapshotItr, itrErr := r.Client.LTXFiles(ctx, SnapshotLevel, 0, false)\n\t\t\tif itrErr != nil {\n\t\t\t\treturn fmt.Errorf(\"cannot validate saved TXID for crash recovery: %w\", itrErr)\n\t\t\t}\n\n\t\t\tvar latestSnapshot *ltx.FileInfo\n\t\t\tfor snapshotItr.Next() {\n\t\t\t\tlatestSnapshot = snapshotItr.Item()\n\t\t\t}\n\t\t\tif err := snapshotItr.Err(); err != nil {\n\t\t\t\t_ = snapshotItr.Close()\n\t\t\t\treturn fmt.Errorf(\"iterate snapshots for crash recovery validation: %w\", err)\n\t\t\t}\n\t\t\t_ = snapshotItr.Close()\n\n\t\t\tif latestSnapshot != nil {\n\t\t\t\tif latestSnapshot.MinTXID \u003e txid {\n\t\t\t\t\treturn fmt.Errorf(\"cannot resume follow mode: saved TXID %s is behind the earliest snapshot (min TXID %s); replica history has been pruned -- delete %s and %s-txid to re-restore\", txid, latestSnapshot.MinTXID, opt.OutputPath, opt.OutputPath)\n\t\t\t\t}\n\t\t\t\tif txid \u003e latestSnapshot.MaxTXID {\n\t\t\t\t\treturn fmt.Errorf(\"cannot resume follow mode: saved TXID %s is ahead of latest snapshot (max TXID %s); delete %s and %s-txid to re-restore\", txid, latestSnapshot.MaxTXID, opt.OutputPath, opt.OutputPath)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tr.Logger().Info(\"resuming follow mode from crash recovery\", \"txid\", txid, \"output\", opt.OutputPath)\n\t\t\treturn r.follow(ctx, opt.OutputPath, txid, opt.FollowInterval)\n\t\t}\n\t}\n\n\t// Ensure output path does not already exist.\n\tif _, err := os.Stat(opt.OutputPath); err == nil {\n\t\treturn fmt.Errorf(\"cannot restore, output path already exists: %s\", opt.OutputPath)\n\t} else if !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\n\t// Compare v0.3.x and LTX formats to find the best backup (unless TXID is specified).\n\t// Skip V3 format when follow mode is enabled (V3 doesn't support incremental following).\n\tif opt.TXID == 0 \u0026\u0026 !opt.Follow {\n\t\tif client, ok := r.Client.(ReplicaClientV3); ok {\n\t\t\tuseV3, err := r.shouldUseV3Restore(ctx, client, opt.Timestamp)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif useV3 {\n\t\t\t\treturn r.RestoreV3(ctx, opt)\n\t\t\t}\n\t\t}\n\t}\n\n\tinfos, err := CalcRestorePlan(ctx, r.Client, opt.TXID, opt.Timestamp, r.Logger())\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot calc restore plan: %w\", err)\n\t}\n\n\tr.Logger().Debug(\"restore plan\", \"n\", len(infos), \"txid\", infos[len(infos)-1].MaxTXID, \"timestamp\", infos[len(infos)-1].CreatedAt)\n\n\trdrs := make([]io.Reader, 0, len(infos))\n\tdefer func() {\n\t\tfor _, rd := range rdrs {\n\t\t\tif closer, ok := rd.(io.Closer); ok {\n\t\t\t\t_ = closer.Close()\n\t\t\t}\n\t\t}\n\t}()\n\n\tfor _, info := range infos {\n\t\t// Validate file size - must be at least header size to be readable\n\t\tif info.Size \u003c ltx.HeaderSize {\n\t\t\treturn fmt.Errorf(\"invalid ltx file: level=%d min=%s max=%s has size %d bytes (minimum %d)\",\n\t\t\t\tinfo.Level, info.MinTXID, info.MaxTXID, info.Size, ltx.HeaderSize)\n\t\t}\n\n\t\tr.Logger().Debug(\"opening ltx file for restore\", \"level\", info.Level, \"min\", info.MinTXID, \"max\", info.MaxTXID)\n\n\t\trdrs = append(rdrs, internal.NewResumableReader(ctx, r.Client, info.Level, info.MinTXID, info.MaxTXID, info.Size, nil, r.Logger()))\n\t}\n\n\tif len(rdrs) == 0 {\n\t\treturn fmt.Errorf(\"no matching backup files available\")\n\t}\n\n\t// Create parent directory if it doesn't exist.\n\tvar dirInfo os.FileInfo\n\tif db := r.DB(); db != nil {\n\t\tdirInfo = db.dirInfo\n\t}\n\tif err := internal.MkdirAll(filepath.Dir(opt.OutputPath), dirInfo); err != nil {\n\t\treturn fmt.Errorf(\"create parent directory: %w\", err)\n\t}\n\n\t// Output to temp file \u0026 atomically rename.\n\ttmpOutputPath := opt.OutputPath + \".tmp\"\n\tr.Logger().Debug(\"compacting into database\", \"path\", tmpOutputPath, \"n\", len(rdrs))\n\tdefer func() { _ = os.Remove(tmpOutputPath) }()\n\n\tf, err := os.Create(tmpOutputPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create temp database path: %w\", err)\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tpr, pw := io.Pipe()\n\n\tgo func() {\n\t\tc, err := ltx.NewCompactor(pw, rdrs)\n\t\tif err != nil {\n\t\t\tpw.CloseWithError(fmt.Errorf(\"new ltx compactor: %w\", err))\n\t\t\treturn\n\t\t}\n\t\tc.HeaderFlags = ltx.HeaderFlagNoChecksum\n\t\t_ = pw.CloseWithError(c.Compact(ctx))\n\t}()\n\n\tdec := ltx.NewDecoder(pr)\n\tif err := dec.DecodeDatabaseTo(f); err != nil {\n\t\treturn fmt.Errorf(\"decode database: %w\", err)\n\t}\n\n\tif err := f.Sync(); err != nil {\n\t\treturn err\n\t} else if err := f.Close(); err != nil {\n\t\treturn err\n\t}\n\n\t// Copy file to final location.\n\tr.Logger().Debug(\"renaming database from temporary location\")\n\tif err := os.Rename(tmpOutputPath, opt.OutputPath); err != nil {\n\t\treturn err\n\t}\n\tif err := internal.FsyncDir(filepath.Dir(opt.OutputPath)); err != nil {\n\t\treturn fmt.Errorf(\"sync restore output dir: %w\", err)\n\t}\n\n\tif opt.IntegrityCheck != IntegrityCheckNone {\n\t\tif err := checkIntegrity(ctx, opt.OutputPath, opt.IntegrityCheck); err != nil {\n\t\t\tif ctx.Err() == nil {\n\t\t\t\t_ = os.Remove(opt.OutputPath)\n\t\t\t\t_ = os.Remove(opt.OutputPath + \"-shm\")\n\t\t\t\t_ = os.Remove(opt.OutputPath + \"-wal\")\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"post-restore integrity check: %w\", err)\n\t\t}\n\t\tr.Logger().Info(\"post-restore integrity check passed\")\n\t}\n\n\t// Enter follow mode if enabled, continuously applying new LTX files.\n\tif opt.Follow {\n\t\tfor _, rd := range rdrs {\n\t\t\tif closer, ok := rd.(io.Closer); ok {\n\t\t\t\t_ = closer.Close()\n\t\t\t}\n\t\t}\n\t\trdrs = nil\n\n\t\tmaxTXID := infos[len(infos)-1].MaxTXID\n\t\tif err := WriteTXIDFile(opt.OutputPath, maxTXID); err != nil {\n\t\t\treturn fmt.Errorf(\"write initial txid file: %w\", err)\n\t\t}\n\t\treturn r.follow(ctx, opt.OutputPath, maxTXID, opt.FollowInterval)\n\t}\n\n\treturn nil\n}\n\n// follow enters a continuous restore loop, polling for new LTX files and\n// applying them to the restored database. It blocks until the context is\n// cancelled (e.g. Ctrl+C). Returns nil on clean shutdown.\nfunc (r *Replica) follow(ctx context.Context, outputPath string, lastTXID ltx.TXID, interval time.Duration) error {\n\tf, err := os.OpenFile(outputPath, os.O_RDWR, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database for follow: %w\", err)\n\t}\n\tdefer func() {\n\t\t_ = f.Sync()\n\t\t_ = f.Close()\n\t}()\n\n\t// Read page size from SQLite header (offset 16, 2 bytes, big-endian).\n\tvar buf [2]byte\n\tif _, err := f.ReadAt(buf[:], 16); err != nil {\n\t\treturn fmt.Errorf(\"read page size from database header: %w\", err)\n\t}\n\tpageSize := uint32(buf[0])\u003c\u003c8 | uint32(buf[1])\n\tif pageSize == 1 {\n\t\tpageSize = 65536\n\t}\n\n\tif interval \u003c= 0 {\n\t\tinterval = DefaultFollowInterval\n\t}\n\n\tr.Logger().Info(\"entering follow mode\", \"output\", outputPath, \"txid\", lastTXID, \"interval\", interval)\n\n\tticker := time.NewTicker(interval)\n\tdefer ticker.Stop()\n\n\tvar consecutiveErrors int\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\tr.Logger().Info(\"follow mode stopped\")\n\t\t\treturn nil\n\t\tcase \u003c-ticker.C:\n\t\t\tnewTXID, err := r.applyNewLTXFiles(ctx, f, lastTXID, pageSize)\n\t\t\tif err != nil {\n\t\t\t\tif ctx.Err() != nil {\n\t\t\t\t\tr.Logger().Info(\"follow mode stopped\")\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tconsecutiveErrors++\n\t\t\t\tr.Logger().Error(\"follow: error applying updates\", \"err\", err, \"consecutive_errors\", consecutiveErrors)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif newTXID \u003e lastTXID {\n\t\t\t\tif err := WriteTXIDFile(outputPath, newTXID); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"write txid file: %w\", err)\n\t\t\t\t}\n\t\t\t\tr.Logger().Info(\"follow: applied updates\", \"from_txid\", lastTXID, \"to_txid\", newTXID)\n\t\t\t\tlastTXID = newTXID\n\t\t\t\tconsecutiveErrors = 0\n\t\t\t}\n\t\t}\n\t}\n}\n\n// applyNewLTXFiles polls for new LTX files and applies them to the database.\n// It starts from level 0 and falls back to higher levels if there are gaps\n// (e.g., level 0 files were compacted away).\nfunc (r *Replica) applyNewLTXFiles(ctx context.Context, f *os.File, afterTXID ltx.TXID, pageSize uint32) (ltx.TXID, error) {\n\tcurrentTXID := afterTXID\n\n\t// Poll level 0 for the most recent incremental files.\n\titr, err := r.Client.LTXFiles(ctx, 0, currentTXID+1, false)\n\tif err != nil {\n\t\treturn currentTXID, fmt.Errorf(\"list level 0 ltx files: %w\", err)\n\t}\n\tcloseLevel0 := func(retErr error) (ltx.TXID, error) {\n\t\tif closeErr := itr.Close(); closeErr != nil {\n\t\t\tcloseErr = fmt.Errorf(\"close level 0 ltx iterator: %w\", closeErr)\n\t\t\tif retErr != nil {\n\t\t\t\treturn currentTXID, errors.Join(retErr, closeErr)\n\t\t\t}\n\t\t\treturn currentTXID, closeErr\n\t\t}\n\t\treturn currentTXID, retErr\n\t}\n\n\tvar sawLevel0 bool\n\tfor itr.Next() {\n\t\tsawLevel0 = true\n\t\tinfo := itr.Item()\n\n\t\t// If there's a gap, try to fill it from higher compaction levels.\n\t\tif info.MinTXID \u003e currentTXID+1 {\n\t\t\tbridgedTXID, err := r.fillFollowGap(ctx, f, currentTXID, info.MinTXID, pageSize)\n\t\t\tif err != nil {\n\t\t\t\treturn closeLevel0(err)\n\t\t\t}\n\t\t\tcurrentTXID = bridgedTXID\n\n\t\t\t// Re-check if this file is still needed after bridging.\n\t\t\tif info.MaxTXID \u003c= currentTXID {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif info.MinTXID \u003e currentTXID+1 {\n\t\t\t\treturn closeLevel0(nil)\n\t\t\t}\n\t\t}\n\n\t\t// Skip if already covered by a higher-level file.\n\t\tif info.MaxTXID \u003c= currentTXID {\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := r.applyLTXFile(ctx, f, info, pageSize); err != nil {\n\t\t\treturn closeLevel0(fmt.Errorf(\n\t\t\t\t\"apply ltx file (level=%d, min=%s, max=%s): %w\",\n\t\t\t\tinfo.Level, info.MinTXID, info.MaxTXID, err,\n\t\t\t))\n\t\t}\n\t\tcurrentTXID = info.MaxTXID\n\t}\n\n\tif iterErr := itr.Err(); iterErr != nil {\n\t\treturn closeLevel0(fmt.Errorf(\"iterate level 0 ltx files: %w\", iterErr))\n\t}\n\tif _, err := closeLevel0(nil); err != nil {\n\t\treturn currentTXID, err\n\t}\n\n\tif !sawLevel0 {\n\t\tbridgedTXID, err := r.fillFollowGap(ctx, f, currentTXID, currentTXID+1, pageSize)\n\t\tif err != nil {\n\t\t\treturn currentTXID, err\n\t\t}\n\t\tcurrentTXID = bridgedTXID\n\t}\n\n\treturn currentTXID, nil\n}\n\n// applyLTXFile applies a single LTX file's pages to the database file.\n// This follows the same pattern as Hydrator.ApplyLTX (vfs.go:712-747).\n//\n// To prevent concurrent SQLite readers from seeing partial updates, we acquire\n// an exclusive file lock before writing. We also rewrite the SQLite header\n// (bytes 18-19) to indicate DELETE journal mode instead of WAL mode, and\n// randomize the schema change counter (bytes 24-27) to invalidate cached\n// schemas in other connections.\nfunc (r *Replica) applyLTXFile(ctx context.Context, f *os.File, info *ltx.FileInfo, pageSize uint32) error {\n\trc, err := r.Client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, 0, 0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\tdefer rc.Close()\n\n\tdec := ltx.NewDecoder(rc)\n\tif err := dec.DecodeHeader(); err != nil {\n\t\treturn fmt.Errorf(\"decode header: %w\", err)\n\t}\n\n\thdr := dec.Header()\n\n\tif err := internal.LockFileExclusive(f); err != nil {\n\t\treturn fmt.Errorf(\"acquire exclusive lock: %w\", err)\n\t}\n\tdefer internal.UnlockFile(f)\n\n\tfor {\n\t\tvar phdr ltx.PageHeader\n\t\tdata := make([]byte, pageSize)\n\t\tif err := dec.DecodePage(\u0026phdr, data); err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"decode page: %w\", err)\n\t\t}\n\n\t\tif phdr.Pgno == 1 \u0026\u0026 len(data) \u003e= 28 {\n\t\t\tdata[18], data[19] = 0x01, 0x01\n\t\t\t_, _ = rand.Read(data[24:28])\n\t\t}\n\n\t\toff := int64(phdr.Pgno-1) * int64(pageSize)\n\t\tif _, err := f.WriteAt(data, off); err != nil {\n\t\t\treturn fmt.Errorf(\"write page %d: %w\", phdr.Pgno, err)\n\t\t}\n\t}\n\n\tif hdr.Commit \u003e 0 {\n\t\tif err := f.Sync(); err != nil {\n\t\t\treturn fmt.Errorf(\"sync before truncate: %w\", err)\n\t\t}\n\t\tnewSize := int64(hdr.Commit) * int64(pageSize)\n\t\tif err := f.Truncate(newSize); err != nil {\n\t\t\treturn fmt.Errorf(\"truncate: %w\", err)\n\t\t}\n\t}\n\n\tif err := dec.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close decoder: %w\", err)\n\t}\n\n\treturn f.Sync()\n}\n\n// fillFollowGap attempts to bridge a gap in level 0 files by searching\n// higher compaction levels for a file that covers the missing TXID range.\nfunc (r *Replica) fillFollowGap(ctx context.Context, f *os.File, afterTXID ltx.TXID, gapMinTXID ltx.TXID, pageSize uint32) (ltx.TXID, error) {\n\tcurrentTXID := afterTXID\n\n\tfor level := 1; level \u003c SnapshotLevel; level++ {\n\t\titr, err := r.Client.LTXFiles(ctx, level, 0, false)\n\t\tif err != nil {\n\t\t\treturn currentTXID, fmt.Errorf(\"list level %d ltx files: %w\", level, err)\n\t\t}\n\t\tcloseLevel := func(retErr error) (ltx.TXID, error) {\n\t\t\tif closeErr := itr.Close(); closeErr != nil {\n\t\t\t\tcloseErr = fmt.Errorf(\"close level %d ltx iterator: %w\", level, closeErr)\n\t\t\t\tif retErr != nil {\n\t\t\t\t\treturn currentTXID, errors.Join(retErr, closeErr)\n\t\t\t\t}\n\t\t\t\treturn currentTXID, closeErr\n\t\t\t}\n\t\t\treturn currentTXID, retErr\n\t\t}\n\n\t\tfor itr.Next() {\n\t\t\tinfo := itr.Item()\n\n\t\t\t// Skip if there's a gap at this level too.\n\t\t\tif info.MinTXID \u003e currentTXID+1 {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Skip if already covered.\n\t\t\tif info.MaxTXID \u003c= currentTXID {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif err := r.applyLTXFile(ctx, f, info, pageSize); err != nil {\n\t\t\t\treturn closeLevel(fmt.Errorf(\n\t\t\t\t\t\"apply gap-fill ltx file (level=%d, min=%s, max=%s): %w\",\n\t\t\t\t\tinfo.Level, info.MinTXID, info.MaxTXID, err,\n\t\t\t\t))\n\t\t\t}\n\t\t\tcurrentTXID = info.MaxTXID\n\n\t\t\t// If we've bridged past the gap, we're done.\n\t\t\tif currentTXID+1 \u003e= gapMinTXID {\n\t\t\t\treturn closeLevel(nil)\n\t\t\t}\n\t\t}\n\n\t\tif iterErr := itr.Err(); iterErr != nil {\n\t\t\treturn closeLevel(fmt.Errorf(\"iterate level %d ltx files: %w\", level, iterErr))\n\t\t}\n\t\tif _, err := closeLevel(nil); err != nil {\n\t\t\treturn currentTXID, err\n\t\t}\n\n\t\t// If we made progress at this level, restart from level 1.\n\t\tif currentTXID \u003e afterTXID {\n\t\t\treturn currentTXID, nil\n\t\t}\n\t}\n\n\treturn currentTXID, nil\n}\n\n// RestoreV3 restores from a v0.3.x format backup.\nfunc (r *Replica) RestoreV3(ctx context.Context, opt RestoreOptions) error {\n\tclient, ok := r.Client.(ReplicaClientV3)\n\tif !ok {\n\t\treturn fmt.Errorf(\"replica client does not support v0.3.x restore\")\n\t}\n\n\t// Validate options.\n\tif opt.OutputPath == \"\" {\n\t\treturn fmt.Errorf(\"output path required\")\n\t} else if opt.IntegrityCheck != IntegrityCheckNone \u0026\u0026 opt.IntegrityCheck != IntegrityCheckQuick \u0026\u0026 opt.IntegrityCheck != IntegrityCheckFull {\n\t\treturn fmt.Errorf(\"unsupported integrity check mode: %d\", opt.IntegrityCheck)\n\t}\n\n\t// Ensure output path does not already exist.\n\tif _, err := os.Stat(opt.OutputPath); err == nil {\n\t\treturn fmt.Errorf(\"cannot restore, output path already exists: %s\", opt.OutputPath)\n\t} else if !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\n\t// Find all generations.\n\tgenerations, err := client.GenerationsV3(ctx)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"list generations: %w\", err)\n\t}\n\tif len(generations) == 0 {\n\t\treturn ErrNoSnapshots\n\t}\n\n\t// Collect all snapshots across all generations.\n\tvar allSnapshots []SnapshotInfoV3\n\tfor _, gen := range generations {\n\t\tsnapshots, err := client.SnapshotsV3(ctx, gen)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"list snapshots for generation %s: %w\", gen, err)\n\t\t}\n\t\tallSnapshots = append(allSnapshots, snapshots...)\n\t}\n\tif len(allSnapshots) == 0 {\n\t\treturn ErrNoSnapshots\n\t}\n\n\t// Sort all snapshots by CreatedAt for timestamp-based selection.\n\tsortSnapshotsV3ByCreatedAt(allSnapshots)\n\n\t// Find best snapshot across all generations (latest, or before timestamp if specified).\n\tsnapshot := findBestSnapshotV3(allSnapshots, opt.Timestamp)\n\tif snapshot == nil {\n\t\treturn ErrNoSnapshots\n\t}\n\n\tr.Logger().Debug(\"selected v0.3.x snapshot\",\n\t\t\"generation\", snapshot.Generation,\n\t\t\"index\", snapshot.Index,\n\t\t\"created_at\", snapshot.CreatedAt)\n\n\t// Get WAL segments for the snapshot's generation.\n\tsegments, err := client.WALSegmentsV3(ctx, snapshot.Generation)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"list WAL segments: %w\", err)\n\t}\n\tsegments = filterWALSegmentsV3(segments, snapshot.Index, opt.Timestamp)\n\n\tr.Logger().Debug(\"found v0.3.x WAL segments\", \"n\", len(segments))\n\n\t// Create parent directory if it doesn't exist.\n\tvar dirInfo os.FileInfo\n\tif db := r.DB(); db != nil {\n\t\tdirInfo = db.DirInfo()\n\t}\n\tif err := internal.MkdirAll(filepath.Dir(opt.OutputPath), dirInfo); err != nil {\n\t\treturn fmt.Errorf(\"create parent directory: %w\", err)\n\t}\n\n\t// Create temp file for restore.\n\ttmpPath := opt.OutputPath + \".tmp\"\n\tdefer func() { _ = os.Remove(tmpPath) }()\n\n\t// Download and decompress snapshot.\n\tif err := r.downloadSnapshotV3(ctx, client, snapshot.Generation, snapshot.Index, tmpPath); err != nil {\n\t\treturn fmt.Errorf(\"download snapshot: %w\", err)\n\t}\n\n\t// Apply WAL segments.\n\tif err := r.applyWALSegmentsV3(ctx, client, snapshot.Generation, snapshot.Index, segments, tmpPath); err != nil {\n\t\treturn fmt.Errorf(\"apply WAL segments: %w\", err)\n\t}\n\n\t// Rename to final path.\n\tif err := os.Rename(tmpPath, opt.OutputPath); err != nil {\n\t\treturn fmt.Errorf(\"rename to output path: %w\", err)\n\t}\n\tif err := internal.FsyncDir(filepath.Dir(opt.OutputPath)); err != nil {\n\t\treturn fmt.Errorf(\"sync restore output dir: %w\", err)\n\t}\n\n\tif opt.IntegrityCheck != IntegrityCheckNone {\n\t\tif err := checkIntegrity(ctx, opt.OutputPath, opt.IntegrityCheck); err != nil {\n\t\t\tif ctx.Err() == nil {\n\t\t\t\t_ = os.Remove(opt.OutputPath)\n\t\t\t\t_ = os.Remove(opt.OutputPath + \"-shm\")\n\t\t\t\t_ = os.Remove(opt.OutputPath + \"-wal\")\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"post-restore integrity check: %w\", err)\n\t\t}\n\t\tr.Logger().Info(\"post-restore integrity check passed\")\n\t}\n\n\treturn nil\n}\n\n// sortSnapshotsV3ByCreatedAt sorts snapshots by creation time in ascending order.\nfunc sortSnapshotsV3ByCreatedAt(snapshots []SnapshotInfoV3) {\n\tfor i := 0; i \u003c len(snapshots)-1; i++ {\n\t\tfor j := i + 1; j \u003c len(snapshots); j++ {\n\t\t\tif snapshots[i].CreatedAt.After(snapshots[j].CreatedAt) {\n\t\t\t\tsnapshots[i], snapshots[j] = snapshots[j], snapshots[i]\n\t\t\t}\n\t\t}\n\t}\n}\n\n// findBestSnapshotV3 finds the best snapshot for restore.\n// If timestamp is zero, returns the latest snapshot.\n// Otherwise, returns the latest snapshot created before or at the timestamp.\nfunc findBestSnapshotV3(snapshots []SnapshotInfoV3, timestamp time.Time) *SnapshotInfoV3 {\n\tif len(snapshots) == 0 {\n\t\treturn nil\n\t}\n\tif timestamp.IsZero() {\n\t\treturn \u0026snapshots[len(snapshots)-1]\n\t}\n\tfor i := len(snapshots) - 1; i \u003e= 0; i-- {\n\t\tif !snapshots[i].CreatedAt.After(timestamp) {\n\t\t\treturn \u0026snapshots[i]\n\t\t}\n\t}\n\treturn nil\n}\n\n// filterWALSegmentsV3 filters WAL segments to those at or after the snapshot index\n// and optionally before the timestamp.\nfunc filterWALSegmentsV3(segments []WALSegmentInfoV3, snapshotIndex int, timestamp time.Time) []WALSegmentInfoV3 {\n\tvar result []WALSegmentInfoV3\n\tfor _, seg := range segments {\n\t\tif seg.Index \u003c snapshotIndex {\n\t\t\tcontinue\n\t\t}\n\t\tif !timestamp.IsZero() \u0026\u0026 seg.CreatedAt.After(timestamp) {\n\t\t\tcontinue\n\t\t}\n\t\tresult = append(result, seg)\n\t}\n\treturn result\n}\n\n// downloadSnapshotV3 downloads and decompresses a v0.3.x snapshot to the destination path.\nfunc (r *Replica) downloadSnapshotV3(ctx context.Context, client ReplicaClientV3, generation string, index int, destPath string) error {\n\trc, err := client.OpenSnapshotV3(ctx, generation, index)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() { _ = rc.Close() }()\n\n\tf, err := os.Create(destPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() { _ = f.Close() }()\n\n\tif _, err := io.Copy(f, rc); err != nil {\n\t\treturn err\n\t}\n\treturn f.Sync()\n}\n\n// applyWALSegmentsV3 applies WAL segments to the database file.\nfunc (r *Replica) applyWALSegmentsV3(ctx context.Context, client ReplicaClientV3, generation string, snapshotIndex int, segments []WALSegmentInfoV3, dbPath string) error {\n\tif len(segments) == 0 {\n\t\treturn nil\n\t}\n\n\t// Write all WAL segments to the WAL file.\n\twalPath := dbPath + \"-wal\"\n\tvar f *os.File\n\tvar err error\n\texpectedIndex := snapshotIndex\n\toffset := int64(0)\n\n\tdefer func() {\n\t\tif f != nil {\n\t\t\t_ = f.Close()\n\t\t}\n\t}()\n\n\tapplyLastWalFile := func() error {\n\t\tif f == nil {\n\t\t\treturn nil\n\t\t} else if err = f.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tf = nil\n\t\tif err = checkpointV3(dbPath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tr.Logger().Debug(\"applied WAL index\", \"generation\", generation, \"index\", expectedIndex-1, \"bytes\", offset)\n\t\treturn nil\n\t}\n\n\t// Reconstruct each wal file, appending non-zero offsets, and apply them\n\t// to the db.\n\tfor _, seg := range segments {\n\t\tif seg.Offset == 0 {\n\t\t\t// Apply the last WAL file, if any\n\t\t\tif err = applyLastWalFile(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif seg.Index != expectedIndex {\n\t\t\t\treturn fmt.Errorf(\"missing WAL index: expected %d/0, got %d/%d\", expectedIndex, seg.Index, seg.Offset)\n\t\t\t}\n\t\t\toffset = 0\n\t\t\t// Open a new WAL file\n\t\t\tif f, err = os.OpenFile(walPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\texpectedIndex++\n\t\t} else if seg.Offset != offset {\n\t\t\treturn fmt.Errorf(\"missing WAL segment: expected %d/%d, got %d/%d\", seg.Index, offset, seg.Index, seg.Offset)\n\t\t}\n\t\tif n, err := r.appendWALSegmentV3(ctx, client, generation, seg, f); err != nil {\n\t\t\treturn fmt.Errorf(\"write WAL segment %d/%d: %w\", seg.Index, seg.Offset, err)\n\t\t} else {\n\t\t\toffset += n\n\t\t\tr.Logger().Debug(\"wrote WAL segment\", \"generation\", generation, \"index\", seg.Index, \"offset\", seg.Offset, \"bytes\", n)\n\t\t}\n\t}\n\n\treturn applyLastWalFile()\n}\n\n// appendWALSegmentV3 appends the specified segment to an open WAL file f.\nfunc (r *Replica) appendWALSegmentV3(ctx context.Context, client ReplicaClientV3, generation string, seg WALSegmentInfoV3, f *os.File) (int64, error) {\n\t// Download WAL segment.\n\trc, err := client.OpenWALSegmentV3(ctx, generation, seg.Index, seg.Offset)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tdefer func() { _ = rc.Close() }()\n\n\treturn io.Copy(f, rc)\n}\n\n// checkpointV3 checkpoints the WAL file into the database.\nfunc checkpointV3(dbPath string) error {\n\tdb, err := sql.Open(\"sqlite\", dbPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer func() { _ = db.Close() }()\n\n\t_, err = db.Exec(\"PRAGMA wal_checkpoint(TRUNCATE)\")\n\treturn err\n}\n\n// checkIntegrity runs a SQLite integrity check on the database at dbPath.\nfunc checkIntegrity(ctx context.Context, dbPath string, mode IntegrityCheckMode) error {\n\tif mode == IntegrityCheckNone {\n\t\treturn nil\n\t}\n\n\tdb, err := sql.Open(\"sqlite\", dbPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"open database for integrity check: %w\", err)\n\t}\n\tdefer func() { _ = db.Close() }()\n\n\tvar pragma string\n\tswitch mode {\n\tcase IntegrityCheckQuick:\n\t\tpragma = \"quick_check\"\n\tcase IntegrityCheckFull:\n\t\tpragma = \"integrity_check\"\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported integrity check mode: %d\", mode)\n\t}\n\n\tvar result string\n\tif err := db.QueryRowContext(ctx, \"PRAGMA \"+pragma).Scan(\u0026result); err != nil {\n\t\treturn fmt.Errorf(\"integrity check: %w\", err)\n\t}\n\tif result != \"ok\" {\n\t\treturn fmt.Errorf(\"integrity check failed: %s\", result)\n\t}\n\n\t// Clean up -shm and -wal files that SQLite may create during the PRAGMA.\n\t_ = os.Remove(dbPath + \"-shm\")\n\t_ = os.Remove(dbPath + \"-wal\")\n\n\treturn nil\n}\n\n// findBestV3SnapshotForTimestamp returns the best v0.3.x snapshot for the given timestamp.\n// Returns nil if no suitable snapshot exists.\nfunc (r *Replica) findBestV3SnapshotForTimestamp(ctx context.Context, client ReplicaClientV3, timestamp time.Time) (*SnapshotInfoV3, error) {\n\tgenerations, err := client.GenerationsV3(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"list v0.3.x generations: %w\", err)\n\t}\n\tif len(generations) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tvar allSnapshots []SnapshotInfoV3\n\tfor _, gen := range generations {\n\t\tsnapshots, err := client.SnapshotsV3(ctx, gen)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"list v0.3.x snapshots for generation %s: %w\", gen, err)\n\t\t}\n\t\tallSnapshots = append(allSnapshots, snapshots...)\n\t}\n\n\tif len(allSnapshots) == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Sort by CreatedAt for timestamp-based selection.\n\tsortSnapshotsV3ByCreatedAt(allSnapshots)\n\n\treturn findBestSnapshotV3(allSnapshots, timestamp), nil\n}\n\n// shouldUseV3Restore determines whether to use v0.3.x restore instead of LTX.\n// Returns true if v0.3.x has a better backup for the given options.\nfunc (r *Replica) shouldUseV3Restore(ctx context.Context, client ReplicaClientV3, timestamp time.Time) (bool, error) {\n\t// Get v0.3.x time bounds.\n\t_, v3UpdatedAt, err := r.TimeBoundsV3(ctx, client)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"get v0.3.x time bounds: %w\", err)\n\t}\n\n\t// Get LTX time bounds.\n\t_, ltxUpdatedAt, err := r.TimeBounds(ctx)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"get LTX time bounds: %w\", err)\n\t}\n\n\t// If no v0.3.x backups exist, use LTX.\n\tif v3UpdatedAt.IsZero() {\n\t\treturn false, nil\n\t}\n\n\t// If no LTX backups exist, use v0.3.x.\n\tif ltxUpdatedAt.IsZero() {\n\t\tr.Logger().Debug(\"using v0.3.x restore (no LTX backups)\")\n\t\treturn true, nil\n\t}\n\n\t// Both formats have backups - compare based on timestamp or latest.\n\tif !timestamp.IsZero() {\n\t\t// With timestamp: use format with best snapshot before timestamp.\n\t\tv3Snapshot, err := r.findBestV3SnapshotForTimestamp(ctx, client, timestamp)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"find v0.3.x snapshot: %w\", err)\n\t\t}\n\n\t\tltxSnapshot, err := r.findBestLTXSnapshotForTimestamp(ctx, timestamp)\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"find LTX snapshot: %w\", err)\n\t\t}\n\n\t\tif v3Snapshot != nil \u0026\u0026 (ltxSnapshot == nil || v3Snapshot.CreatedAt.After(ltxSnapshot.CreatedAt)) {\n\t\t\tr.Logger().Debug(\"using v0.3.x restore (better snapshot for timestamp)\",\n\t\t\t\t\"v3_snapshot\", v3Snapshot.CreatedAt,\n\t\t\t\t\"ltx_snapshot\", ltxSnapshot)\n\t\t\treturn true, nil\n\t\t}\n\t} else {\n\t\t// Without timestamp: use format with most recent backup.\n\t\tif v3UpdatedAt.After(ltxUpdatedAt) {\n\t\t\tr.Logger().Debug(\"using v0.3.x restore (more recent backup)\",\n\t\t\t\t\"v3_updated_at\", v3UpdatedAt,\n\t\t\t\t\"ltx_updated_at\", ltxUpdatedAt)\n\t\t\treturn true, nil\n\t\t}\n\t}\n\n\treturn false, nil\n}\n\n// TimeBoundsV3 returns the time bounds of v0.3.x backups.\n// Returns zero times if no v0.3.x backups exist.\nfunc (r *Replica) TimeBoundsV3(ctx context.Context, client ReplicaClientV3) (createdAt, updatedAt time.Time, err error) {\n\tgenerations, err := client.GenerationsV3(ctx)\n\tif err != nil {\n\t\treturn time.Time{}, time.Time{}, err\n\t}\n\n\tfor _, gen := range generations {\n\t\tsnapshots, err := client.SnapshotsV3(ctx, gen)\n\t\tif err != nil {\n\t\t\treturn time.Time{}, time.Time{}, err\n\t\t}\n\t\tfor _, snap := range snapshots {\n\t\t\tif createdAt.IsZero() || snap.CreatedAt.Before(createdAt) {\n\t\t\t\tcreatedAt = snap.CreatedAt\n\t\t\t}\n\t\t\tif updatedAt.IsZero() || snap.CreatedAt.After(updatedAt) {\n\t\t\t\tupdatedAt = snap.CreatedAt\n\t\t\t}\n\t\t}\n\n\t\tsegments, err := client.WALSegmentsV3(ctx, gen)\n\t\tif err != nil {\n\t\t\treturn time.Time{}, time.Time{}, err\n\t\t}\n\t\tfor _, seg := range segments {\n\t\t\tif createdAt.IsZero() || seg.CreatedAt.Before(createdAt) {\n\t\t\t\tcreatedAt = seg.CreatedAt\n\t\t\t}\n\t\t\tif updatedAt.IsZero() || seg.CreatedAt.After(updatedAt) {\n\t\t\t\tupdatedAt = seg.CreatedAt\n\t\t\t}\n\t\t}\n\t}\n\n\treturn createdAt, updatedAt, nil\n}\n\n// findBestLTXSnapshotForTimestamp returns the best LTX snapshot for the given timestamp.\n// Returns nil if no suitable snapshot exists.\nfunc (r *Replica) findBestLTXSnapshotForTimestamp(ctx context.Context, timestamp time.Time) (*ltx.FileInfo, error) {\n\t// Find snapshots at the snapshot level that are before the timestamp.\n\tsnapshots, err := FindLTXFiles(ctx, r.Client, SnapshotLevel, true, func(info *ltx.FileInfo) (bool, error) {\n\t\treturn info.CreatedAt.Before(timestamp), nil\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"find LTX snapshots: %w\", err)\n\t}\n\tif len(snapshots) == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Return the latest snapshot before the timestamp (last in the sorted list).\n\treturn snapshots[len(snapshots)-1], nil\n}\n\n// CalcRestorePlan returns a list of storage paths to restore a snapshot at the given TXID.\nfunc CalcRestorePlan(ctx context.Context, client ReplicaClient, txID ltx.TXID, timestamp time.Time, logger *slog.Logger) ([]*ltx.FileInfo, error) {\n\tif txID != 0 \u0026\u0026 !timestamp.IsZero() {\n\t\treturn nil, fmt.Errorf(\"cannot specify both TXID \u0026 timestamp to restore\")\n\t}\n\n\tvar infos ltx.FileInfoSlice\n\tlogger = logger.With(\"target\", txID)\n\n\t// Start with latest snapshot before target TXID or timestamp.\n\t// Pass useMetadata flag to enable accurate timestamp fetching for timestamp-based restore.\n\tvar snapshot *ltx.FileInfo\n\tsnapshotItr, err := client.LTXFiles(ctx, SnapshotLevel, 0, !timestamp.IsZero())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor snapshotItr.Next() {\n\t\tinfo := snapshotItr.Item()\n\t\tlogger.Debug(\"finding snapshot before target TXID or timestamp\", \"snapshot\", info.MaxTXID)\n\t\tif txID != 0 \u0026\u0026 info.MaxTXID \u003e txID {\n\t\t\tcontinue\n\t\t}\n\t\tif !timestamp.IsZero() \u0026\u0026 !info.CreatedAt.Before(timestamp) {\n\t\t\tcontinue\n\t\t}\n\t\tsnapshot = info\n\t}\n\tif err := snapshotItr.Close(); err != nil {\n\t\treturn nil, err\n\t}\n\tif snapshot != nil {\n\t\tlogger.Debug(\"found snapshot before target TXID or timestamp\", \"snapshot\", snapshot.MaxTXID)\n\t\tinfos = append(infos, snapshot)\n\t}\n\n\t// Collect candidates across all compaction levels and pick the next file\n\t// from any level that extends the longest contiguous TXID range.\n\tconst maxLevel = SnapshotLevel - 1\n\tstartTXID := infos.MaxTXID()\n\tcurrentMax := startTXID\n\tif txID != 0 \u0026\u0026 currentMax \u003e= txID {\n\t\treturn infos, nil\n\t}\n\n\tcursors := make([]*restoreLevelCursor, 0, maxLevel+1)\n\tfor level := maxLevel; level \u003e= 0; level-- {\n\t\tlogger.Debug(\"finding ltx files for level\", \"level\", level)\n\t\titr, err := client.LTXFiles(ctx, level, 0, !timestamp.IsZero())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcursors = append(cursors, \u0026restoreLevelCursor{\n\t\t\titr: itr,\n\t\t})\n\t}\n\tdefer func() {\n\t\tfor _, cursor := range cursors {\n\t\t\tif cursor != nil {\n\t\t\t\t_ = cursor.itr.Close()\n\t\t\t}\n\t\t}\n\t}()\n\n\tfor {\n\t\tvar next *restoreLevelCursor\n\t\tfor _, cursor := range cursors {\n\t\t\tif err := cursor.refresh(currentMax, txID, timestamp); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif cursor.candidate == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif next == nil || restoreCandidateBetter(next.candidate, cursor.candidate) {\n\t\t\t\tnext = cursor\n\t\t\t}\n\t\t}\n\n\t\tif next == nil || next.candidate == nil {\n\t\t\tbreak\n\t\t}\n\n\t\tif next.candidate.MaxTXID \u003c= currentMax {\n\t\t\tnext.candidate = nil\n\t\t\tcontinue\n\t\t}\n\n\t\tlogger.Debug(\"matching LTX file for restore\",\n\t\t\t\"filename\", ltx.FormatFilename(next.candidate.MinTXID, next.candidate.MaxTXID),\n\t\t\t\"level\", next.candidate.Level)\n\t\tinfos = append(infos, next.candidate)\n\t\tcurrentMax = next.candidate.MaxTXID\n\t\tnext.candidate = nil\n\n\t\tif txID != 0 \u0026\u0026 currentMax \u003e= txID {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif len(infos) \u003e 0 \u0026\u0026 txID == 0 \u0026\u0026 timestamp.IsZero() {\n\t\tfor _, cursor := range cursors {\n\t\t\tif err := cursor.ensureCurrent(); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif cursor.current != nil \u0026\u0026 cursor.current.MinTXID \u003e currentMax+1 {\n\t\t\t\treturn nil, fmt.Errorf(\"non-contiguous ltx files: have up to %s but next file starts at %s\", currentMax, cursor.current.MinTXID)\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(infos) == 0 {\n\t\treturn nil, ErrTxNotAvailable\n\t}\n\tif txID != 0 \u0026\u0026 infos.MaxTXID() \u003c txID {\n\t\treturn nil, ErrTxNotAvailable\n\t}\n\n\treturn infos, nil\n}\n\ntype restoreLevelCursor struct {\n\t// itr streams LTX file infos for a single level in filename order.\n\titr ltx.FileIterator\n\t// current holds the last item read from itr but not yet evaluated.\n\tcurrent *ltx.FileInfo\n\t// candidate is the best eligible file at this level for the currentMax.\n\tcandidate *ltx.FileInfo\n\t// done indicates the iterator has been exhausted or errored.\n\tdone bool\n}\n\nfunc (c *restoreLevelCursor) refresh(currentMax, txID ltx.TXID, timestamp time.Time) error {\n\t// Advance the iterator until we've evaluated all files that could be\n\t// contiguous with currentMax. Keep the best eligible candidate.\n\tif c.done {\n\t\treturn nil\n\t}\n\tif c.candidate != nil \u0026\u0026 c.candidate.MaxTXID \u003c= currentMax {\n\t\tc.candidate = nil\n\t}\n\n\tfor {\n\t\tif err := c.ensureCurrent(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif c.done {\n\t\t\treturn nil\n\t\t}\n\n\t\tinfo := c.current\n\t\tif info.MinTXID \u003e currentMax+1 {\n\t\t\treturn nil\n\t\t}\n\t\tc.current = nil\n\n\t\tif info.MaxTXID \u003c= currentMax {\n\t\t\tcontinue\n\t\t}\n\t\tif txID != 0 \u0026\u0026 info.MaxTXID \u003e txID {\n\t\t\tcontinue\n\t\t}\n\t\tif !timestamp.IsZero() \u0026\u0026 !info.CreatedAt.Before(timestamp) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif c.candidate == nil || restoreCandidateBetter(c.candidate, info) {\n\t\t\tc.candidate = info\n\t\t}\n\t}\n}\n\nfunc (c *restoreLevelCursor) ensureCurrent() error {\n\t// Ensure current is populated with the next iterator item, or mark done.\n\tif c.done || c.current != nil {\n\t\treturn nil\n\t}\n\tif !c.itr.Next() {\n\t\tif err := c.itr.Err(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc.done = true\n\t\treturn nil\n\t}\n\tc.current = c.itr.Item()\n\treturn nil\n}\n\nfunc restoreCandidateBetter(curr, next *ltx.FileInfo) bool {\n\tif next.MaxTXID != curr.MaxTXID {\n\t\treturn next.MaxTXID \u003e curr.MaxTXID\n\t}\n\tif next.MinTXID != curr.MinTXID {\n\t\treturn next.MinTXID \u003c curr.MinTXID\n\t}\n\tif next.Level != curr.Level {\n\t\treturn next.Level \u003e curr.Level\n\t}\n\treturn next.CreatedAt.Before(curr.CreatedAt)\n}\n\n// TXIDPath returns the path to the TXID sidecar file for the given database path.\n// Uses -txid suffix to match SQLite's naming convention for associated files (-wal, -shm).\nfunc TXIDPath(outputPath string) string {\n\treturn outputPath + \"-txid\"\n}\n\n// WriteTXIDFile atomically writes a TXID to a sidecar file at \u003coutputPath\u003e-txid.\n// Uses temp-file + fsync + rename for crash safety.\nfunc WriteTXIDFile(outputPath string, txid ltx.TXID) error {\n\ttxidPath := TXIDPath(outputPath)\n\ttmpPath := txidPath + \".tmp\"\n\n\tf, err := os.Create(tmpPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"create txid temp file: %w\", err)\n\t}\n\tdefer f.Close()\n\tdefer os.Remove(tmpPath)\n\n\tif _, err := fmt.Fprintln(f, txid); err != nil {\n\t\treturn fmt.Errorf(\"write txid: %w\", err)\n\t}\n\n\tif err := f.Sync(); err != nil {\n\t\treturn fmt.Errorf(\"sync txid file: %w\", err)\n\t}\n\n\tif err := f.Close(); err != nil {\n\t\treturn fmt.Errorf(\"close txid file: %w\", err)\n\t}\n\n\tif err := os.Rename(tmpPath, txidPath); err != nil {\n\t\treturn fmt.Errorf(\"rename txid file: %w\", err)\n\t}\n\n\tif err := internal.FsyncDir(filepath.Dir(txidPath)); err != nil {\n\t\treturn fmt.Errorf(\"sync txid dir: %w\", err)\n\t}\n\treturn nil\n}\n\n// ReadTXIDFile reads the TXID from a sidecar file at \u003coutputPath\u003e-txid.\n// Returns 0, nil if the file does not exist (first run).\nfunc ReadTXIDFile(outputPath string) (ltx.TXID, error) {\n\ttxidPath := TXIDPath(outputPath)\n\n\tdata, err := os.ReadFile(txidPath)\n\tif os.IsNotExist(err) {\n\t\treturn 0, nil\n\t} else if err != nil {\n\t\treturn 0, fmt.Errorf(\"read txid file: %w\", err)\n\t}\n\n\ttxid, err := ltx.ParseTXID(strings.TrimSpace(string(data)))\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"parse txid file: %w\", err)\n\t}\n\n\treturn txid, nil\n}\n\n// ValidationError represents a single validation issue.\ntype ValidationError struct {\n\tLevel int // compaction level\n\tType string // \"gap\", \"overlap\", or \"unsorted\"\n\tMessage string // human-readable description\n\tPrevFile *ltx.FileInfo // previous file\n\tCurrFile *ltx.FileInfo // current file that caused error\n}\n\n// ValidateLevel checks LTX files at the given level are sorted and contiguous.\n// Returns a slice of validation errors (empty if valid).\nfunc (r *Replica) ValidateLevel(ctx context.Context, level int) ([]ValidationError, error) {\n\titr, err := r.Client.LTXFiles(ctx, level, 0, false)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fetch ltx files: %w\", err)\n\t}\n\tdefer itr.Close()\n\n\tvar errors []ValidationError\n\tvar prevInfo *ltx.FileInfo\n\n\tfor itr.Next() {\n\t\tinfo := itr.Item()\n\n\t\t// Skip first file - nothing to compare against\n\t\tif prevInfo == nil {\n\t\t\tprevInfo = info\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check for sort order: curr.MinTXID should be \u003e= prev.MinTXID\n\t\tif info.MinTXID \u003c prevInfo.MinTXID {\n\t\t\terrors = append(errors, ValidationError{\n\t\t\t\tLevel: level,\n\t\t\t\tType: \"unsorted\",\n\t\t\t\tMessage: fmt.Sprintf(\"files out of order: curr.MinTXID=%s \u003c prev.MinTXID=%s\", info.MinTXID, prevInfo.MinTXID),\n\t\t\t\tPrevFile: prevInfo,\n\t\t\t\tCurrFile: info,\n\t\t\t})\n\t\t\tprevInfo = info\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check for TXID contiguity: prev.MaxTXID + 1 should equal curr.MinTXID\n\t\texpectedMinTXID := prevInfo.MaxTXID + 1\n\t\tif info.MinTXID != expectedMinTXID {\n\t\t\tif info.MinTXID \u003e expectedMinTXID {\n\t\t\t\terrors = append(errors, ValidationError{\n\t\t\t\t\tLevel: level,\n\t\t\t\t\tType: \"gap\",\n\t\t\t\t\tMessage: fmt.Sprintf(\"TXID gap: prev.MaxTXID=%s, curr.MinTXID=%s (expected %s)\", prevInfo.MaxTXID, info.MinTXID, expectedMinTXID),\n\t\t\t\t\tPrevFile: prevInfo,\n\t\t\t\t\tCurrFile: info,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\terrors = append(errors, ValidationError{\n\t\t\t\t\tLevel: level,\n\t\t\t\t\tType: \"overlap\",\n\t\t\t\t\tMessage: fmt.Sprintf(\"TXID overlap: prev.MaxTXID=%s, curr.MinTXID=%s\", prevInfo.MaxTXID, info.MinTXID),\n\t\t\t\t\tPrevFile: prevInfo,\n\t\t\t\t\tCurrFile: info,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tprevInfo = info\n\t}\n\n\tif err := itr.Close(); err != nil {\n\t\treturn nil, fmt.Errorf(\"close iterator: %w\", err)\n\t}\n\n\treturn errors, nil\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"rand","path":"crypto/rand","span":{"start":[5,1],"end":[5,15],"bytes":[40,54]}},{"name":"sql","path":"database/sql","span":{"start":[6,1],"end":[6,16],"bytes":[55,70]}},{"name":"errors","path":"errors","span":{"start":[7,1],"end":[7,10],"bytes":[71,80]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[81,87]}},{"name":"io","path":"io","span":{"start":[9,1],"end":[9,6],"bytes":[88,93]}},{"name":"slog","path":"log/slog","span":{"start":[10,1],"end":[10,12],"bytes":[94,105]}},{"name":"os","path":"os","span":{"start":[11,1],"end":[11,6],"bytes":[106,111]}},{"name":"filepath","path":"path/filepath","span":{"start":[12,1],"end":[12,17],"bytes":[112,128]}},{"name":"strings","path":"strings","span":{"start":[13,1],"end":[13,11],"bytes":[129,139]}},{"name":"sync","path":"sync","span":{"start":[14,1],"end":[14,8],"bytes":[140,147]}},{"name":"atomic","path":"sync/atomic","span":{"start":[15,1],"end":[15,15],"bytes":[148,162]}},{"name":"time","path":"time","span":{"start":[16,1],"end":[16,8],"bytes":[163,170]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[18,1],"end":[18,27],"bytes":[172,198]}},{"name":"semaphore","path":"golang.org/x/sync/semaphore","span":{"start":[19,1],"end":[19,31],"bytes":[199,229]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[21,1],"end":[21,46],"bytes":[231,276]}}],"types":{"Replica":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica","kind":"struct","span":{"start":[35,1],"end":[69,2],"bytes":[643,1754]},"callables":{"github.com/benbjohnson/litestream.Replica.CalcRestoreTarget":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","kind":"method","span":{"start":[562,1],"end":[595,2],"bytes":[15010,16196]},"signature":"github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[562,1],"end":[562,112],"bytes":[15010,15121]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[562,1],"end":[562,112],"bytes":[15010,15121]}}],"return_type":"(time.Time, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"564:31":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@564:31","span":{"start":[564,31],"end":[564,48],"bytes":[15209,15226]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds"},"566:23":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@566:23","span":{"start":[566,23],"end":[566,56],"bytes":[15266,15299]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"571:36":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@571:36","span":{"start":[571,36],"end":[571,63],"bytes":[15447,15474]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3"},"573:24":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@573:24","span":{"start":[573,24],"end":[573,65],"bytes":[15516,15557]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"576:32":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@576:32","span":{"start":[576,32],"end":[576,50],"bytes":[15644,15662]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"576:54":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@576:54","span":{"start":[576,54],"end":[576,83],"bytes":[15666,15695]},"callee":"can://litestream/litestream/@external/time/Time.Before"},"576:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@576:7","span":{"start":[576,7],"end":[576,27],"bytes":[15619,15639]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"579:32":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@579:32","span":{"start":[579,32],"end":[579,50],"bytes":[15761,15779]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"579:54":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@579:54","span":{"start":[579,54],"end":[579,82],"bytes":[15783,15811]},"callee":"can://litestream/litestream/@external/time/Time.After"},"579:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@579:7","span":{"start":[579,7],"end":[579,27],"bytes":[15736,15756]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"585:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@585:6","span":{"start":[585,6],"end":[585,28],"bytes":[15898,15920]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"586:28":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@586:28","span":{"start":[586,28],"end":[586,46],"bytes":[15950,15968]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"586:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@586:6","span":{"start":[586,6],"end":[586,24],"bytes":[15928,15946]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"587:24":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@587:24","span":{"start":[587,24],"end":[587,54],"bytes":[15994,16024]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"589:41":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@589:41","span":{"start":[589,41],"end":[589,71],"bytes":[16069,16099]},"callee":"can://litestream/litestream/@external/time/Time.After"},"589:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@589:6","span":{"start":[589,6],"end":[589,37],"bytes":[16034,16065]},"callee":"can://litestream/litestream/@external/time/Time.Before"},"590:24":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget@590:24","span":{"start":[590,24],"end":[590,62],"bytes":[16125,16163]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.Replica.CreatedAt":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt","kind":"method","span":{"start":[520,1],"end":[534,2],"bytes":[13911,14226]},"signature":"github.com/benbjohnson/litestream.Replica.CreatedAt","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[520,1],"end":[520,70],"bytes":[13911,13980]}}],"return_type":"(time.Time, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"524:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt@524:14","span":{"start":[524,14],"end":[524,49],"bytes":[14057,14092]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"528:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt@528:8","span":{"start":[528,8],"end":[528,19],"bytes":[14138,14149]},"callee":null,"is_deferred":true},"530:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt@530:5","span":{"start":[530,5],"end":[530,15],"bytes":[14155,14165]},"callee":null},"531:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt@531:9","span":{"start":[531,9],"end":[531,19],"bytes":[14176,14186]},"callee":null},"533:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt@533:14","span":{"start":[533,14],"end":[533,25],"bytes":[14213,14224]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.DB":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB","kind":"method","span":{"start":[101,1],"end":[101,43],"bytes":[2422,2464]},"signature":"github.com/benbjohnson/litestream.Replica.DB","parameters":[],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.Replica.EnforceRetention":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.EnforceRetention","kind":"method","span":{"start":[318,1],"end":[350,2],"bytes":[8223,9303]},"signature":"github.com/benbjohnson/litestream.Replica.EnforceRetention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[318,1],"end":[318,70],"bytes":[8223,8292]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"319:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.EnforceRetention@319:2","span":{"start":[319,2],"end":[319,63],"bytes":[8294,8355]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.Logger":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","kind":"method","span":{"start":[92,1],"end":[98,2],"bytes":[2181,2342]},"signature":"github.com/benbjohnson/litestream.Replica.Logger","parameters":[],"return_type":"*log/slog.Logger","metrics":{"cyclomatic":2},"body":{"93:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger@93:12","span":{"start":[93,12],"end":[93,26],"bytes":[2234,2248]},"callee":"can://litestream/litestream/@external/log/slog/Default"},"97:32":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger@97:32","span":{"start":[97,32],"end":[97,47],"bytes":[2324,2339]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type"},"97:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger@97:9","span":{"start":[97,9],"end":[97,48],"bytes":[2301,2340]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"}}},"github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","kind":"method","span":{"start":[284,1],"end":[299,2],"bytes":[7368,7745]},"signature":"github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[284,1],"end":[284,98],"bytes":[7368,7465]}},{"name":"level","type":"int","span":{"start":[284,1],"end":[284,98],"bytes":[7368,7465]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"286:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo@286:14","span":{"start":[286,14],"end":[286,53],"bytes":[7522,7561]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"290:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo@290:8","span":{"start":[290,8],"end":[290,19],"bytes":[7608,7619]},"callee":null,"is_deferred":true},"292:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo@292:6","span":{"start":[292,6],"end":[292,16],"bytes":[7626,7636]},"callee":null},"293:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo@293:11","span":{"start":[293,11],"end":[293,21],"bytes":[7649,7659]},"callee":null},"298:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo@298:15","span":{"start":[298,15],"end":[298,26],"bytes":[7732,7743]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.Pos":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","kind":"method","span":{"start":[303,1],"end":[307,2],"bytes":[7865,7950]},"signature":"github.com/benbjohnson/litestream.Replica.Pos","parameters":[],"return_type":"invalid type","metrics":{"cyclomatic":1},"body":{"304:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos@304:2","span":{"start":[304,2],"end":[304,14],"bytes":[7900,7912]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"},"305:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos@305:8","span":{"start":[305,8],"end":[305,22],"bytes":[7920,7934]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","is_deferred":true}}},"github.com/benbjohnson/litestream.Replica.Restore":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","kind":"method","span":{"start":[608,1],"end":[799,2],"bytes":[16899,23659]},"signature":"github.com/benbjohnson/litestream.Replica.Restore","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[608,1],"end":[608,81],"bytes":[16899,16979]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[608,1],"end":[608,81],"bytes":[16899,16979]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":44},"body":{"611:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@611:10","span":{"start":[611,10],"end":[611,44],"bytes":[17038,17072]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"612:30":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@612:30","span":{"start":[612,30],"end":[612,52],"bytes":[17102,17124]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"613:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@613:10","span":{"start":[613,10],"end":[613,67],"bytes":[17136,17193]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"615:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@615:10","span":{"start":[615,10],"end":[615,57],"bytes":[17244,17291]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"616:27":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@616:27","span":{"start":[616,27],"end":[616,49],"bytes":[17318,17340]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"617:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@617:10","span":{"start":[617,10],"end":[617,62],"bytes":[17352,17404]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"619:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@619:10","span":{"start":[619,10],"end":[619,80],"bytes":[17557,17627]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"625:20":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@625:20","span":{"start":[625,20],"end":[625,43],"bytes":[17803,17826]},"callee":"can://litestream/litestream/@external/os/Stat"},"626:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@626:21","span":{"start":[626,21],"end":[626,49],"bytes":[17865,17893]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile"},"628:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@628:12","span":{"start":[628,12],"end":[628,72],"bytes":[17928,17988]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"631:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@631:12","span":{"start":[631,12],"end":[631,147],"bytes":[18023,18158]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"636:27":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@636:27","span":{"start":[636,27],"end":[636,74],"bytes":[18372,18419]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"638:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@638:12","span":{"start":[638,12],"end":[638,83],"bytes":[18453,18524]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"642:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@642:8","span":{"start":[642,8],"end":[642,26],"bytes":[18574,18592]},"callee":null},"643:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@643:22","span":{"start":[643,22],"end":[643,40],"bytes":[18616,18634]},"callee":null},"645:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@645:14","span":{"start":[645,14],"end":[645,31],"bytes":[18653,18670]},"callee":null},"646:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@646:9","span":{"start":[646,9],"end":[646,28],"bytes":[18693,18712]},"callee":null},"647:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@647:12","span":{"start":[647,12],"end":[647,82],"bytes":[18724,18794]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"649:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@649:8","span":{"start":[649,8],"end":[649,27],"bytes":[18807,18826]},"callee":null},"653:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@653:13","span":{"start":[653,13],"end":[653,247],"bytes":[18909,19143]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"656:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@656:13","span":{"start":[656,13],"end":[656,208],"bytes":[19201,19396]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"660:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@660:4","span":{"start":[660,4],"end":[660,103],"bytes":[19412,19511]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"660:4/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@660:4/2","span":{"start":[660,4],"end":[660,14],"bytes":[19412,19422]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"661:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@661:11","span":{"start":[661,11],"end":[661,66],"bytes":[19522,19577]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow"},"666:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@666:15","span":{"start":[666,15],"end":[666,38],"bytes":[19647,19670]},"callee":"can://litestream/litestream/@external/os/Stat"},"667:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@667:10","span":{"start":[667,10],"end":[667,86],"bytes":[19694,19770]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"668:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@668:13","span":{"start":[668,13],"end":[668,31],"bytes":[19783,19801]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"676:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@676:18","span":{"start":[676,18],"end":[676,66],"bytes":[20103,20151]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore"},"681:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@681:12","span":{"start":[681,12],"end":[681,33],"bytes":[20216,20237]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3"},"686:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@686:16","span":{"start":[686,16],"end":[686,83],"bytes":[20266,20333]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan"},"686:72":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@686:72","span":{"start":[686,72],"end":[686,82],"bytes":[20322,20332]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"688:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@688:10","span":{"start":[688,10],"end":[688,57],"bytes":[20360,20407]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"691:108":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@691:108","span":{"start":[691,108],"end":[691,118],"bytes":[20519,20529]},"callee":null},"691:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@691:2","span":{"start":[691,2],"end":[691,132],"bytes":[20413,20543]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"691:2/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@691:2/2","span":{"start":[691,2],"end":[691,12],"bytes":[20413,20423]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"691:40":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@691:40","span":{"start":[691,40],"end":[691,50],"bytes":[20451,20461]},"callee":null},"691:66":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@691:66","span":{"start":[691,66],"end":[691,76],"bytes":[20477,20487]},"callee":null},"693:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@693:10","span":{"start":[693,10],"end":[693,42],"bytes":[20554,20586]},"callee":null},"693:31":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@693:31","span":{"start":[693,31],"end":[693,41],"bytes":[20575,20585]},"callee":null},"694:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@694:8","span":{"start":[694,8],"end":[700,5],"bytes":[20594,20708]},"callee":null,"is_deferred":true},"705:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@705:11","span":{"start":[705,11],"end":[706,71],"bytes":[20854,21010]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"709:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@709:3","span":{"start":[709,3],"end":[709,114],"bytes":[21018,21129]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"709:3/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@709:3/2","span":{"start":[709,3],"end":[709,13],"bytes":[21018,21028]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"711:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@711:10","span":{"start":[711,10],"end":[711,134],"bytes":[21140,21264]},"callee":null},"711:122":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@711:122","span":{"start":[711,122],"end":[711,132],"bytes":[21252,21262]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"711:23":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@711:23","span":{"start":[711,23],"end":[711,133],"bytes":[21153,21263]},"callee":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader"},"714:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@714:5","span":{"start":[714,5],"end":[714,14],"bytes":[21273,21282]},"callee":null},"715:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@715:10","span":{"start":[715,10],"end":[715,58],"bytes":[21299,21347]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"720:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@720:11","span":{"start":[720,11],"end":[720,17],"bytes":[21436,21442]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB"},"723:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@723:12","span":{"start":[723,12],"end":[723,68],"bytes":[21493,21549]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"723:30":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@723:30","span":{"start":[723,30],"end":[723,58],"bytes":[21511,21539]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"724:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@724:10","span":{"start":[724,10],"end":[724,56],"bytes":[21573,21619]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"729:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@729:2","span":{"start":[729,2],"end":[729,85],"bytes":[21712,21795]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"729:2/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@729:2/2","span":{"start":[729,2],"end":[729,12],"bytes":[21712,21722]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"729:75":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@729:75","span":{"start":[729,75],"end":[729,84],"bytes":[21785,21794]},"callee":null},"730:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@730:8","span":{"start":[730,8],"end":[730,49],"bytes":[21803,21844]},"callee":null,"is_deferred":true},"732:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@732:12","span":{"start":[732,12],"end":[732,36],"bytes":[21857,21881]},"callee":"can://litestream/litestream/@external/os/Create"},"734:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@734:10","span":{"start":[734,10],"end":[734,58],"bytes":[21908,21956]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"736:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@736:8","span":{"start":[736,8],"end":[736,34],"bytes":[21967,21993]},"callee":null,"is_deferred":true},"738:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@738:12","span":{"start":[738,12],"end":[738,21],"bytes":[22006,22015]},"callee":"can://litestream/litestream/@external/io/Pipe"},"740:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@740:5","span":{"start":[740,5],"end":[748,5],"bytes":[22021,22251]},"callee":null,"is_goroutine":true},"750:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@750:9","span":{"start":[750,9],"end":[750,27],"bytes":[22261,22279]},"callee":null},"751:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@751:12","span":{"start":[751,12],"end":[751,35],"bytes":[22291,22314]},"callee":null},"752:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@752:10","span":{"start":[752,10],"end":[752,48],"bytes":[22338,22376]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"755:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@755:12","span":{"start":[755,12],"end":[755,20],"bytes":[22392,22400]},"callee":"can://litestream/litestream/@external/os/File.Sync"},"757:19":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@757:19","span":{"start":[757,19],"end":[757,28],"bytes":[22446,22455]},"callee":"can://litestream/litestream/@external/os/File.Close"},"762:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@762:2","span":{"start":[762,2],"end":[762,63],"bytes":[22521,22582]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"762:2/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@762:2/2","span":{"start":[762,2],"end":[762,12],"bytes":[22521,22531]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"763:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@763:12","span":{"start":[763,12],"end":[763,52],"bytes":[22594,22634]},"callee":"can://litestream/litestream/@external/os/Rename"},"766:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@766:12","span":{"start":[766,12],"end":[766,59],"bytes":[22676,22723]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"766:30":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@766:30","span":{"start":[766,30],"end":[766,58],"bytes":[22694,22722]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"767:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@767:10","span":{"start":[767,10],"end":[767,56],"bytes":[22747,22793]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"771:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@771:13","span":{"start":[771,13],"end":[771,68],"bytes":[22857,22912]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity"},"772:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@772:7","span":{"start":[772,7],"end":[772,16],"bytes":[22933,22942]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"773:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@773:9","span":{"start":[773,9],"end":[773,34],"bytes":[22960,22985]},"callee":"can://litestream/litestream/@external/os/Remove"},"774:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@774:9","span":{"start":[774,9],"end":[774,43],"bytes":[22994,23028]},"callee":"can://litestream/litestream/@external/os/Remove"},"775:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@775:9","span":{"start":[775,9],"end":[775,43],"bytes":[23037,23071]},"callee":"can://litestream/litestream/@external/os/Remove"},"777:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@777:11","span":{"start":[777,11],"end":[777,62],"bytes":[23087,23138]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"779:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@779:3","span":{"start":[779,3],"end":[779,57],"bytes":[23145,23199]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"779:3/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@779:3/2","span":{"start":[779,3],"end":[779,13],"bytes":[23145,23155]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"786:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@786:9","span":{"start":[786,9],"end":[786,23],"bytes":[23369,23383]},"callee":"can://litestream/litestream/@external/io/Closer.Close"},"791:20":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@791:20","span":{"start":[791,20],"end":[791,30],"bytes":[23426,23436]},"callee":null},"792:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@792:13","span":{"start":[792,13],"end":[792,51],"bytes":[23460,23498]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile"},"793:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@793:11","span":{"start":[793,11],"end":[793,57],"bytes":[23523,23569]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"795:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore@795:10","span":{"start":[795,10],"end":[795,68],"bytes":[23583,23641]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_1","kind":"function","span":{"start":[694,1],"end":[700,5],"bytes":[20587,20708]},"signature":"github.com/benbjohnson/litestream.Replica.Restore.closure_1","parameters":[],"body":{"697:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_1@697:9","span":{"start":[697,9],"end":[697,23],"bytes":[20680,20694]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}},"closure_2":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_2","kind":"function","span":{"start":[730,1],"end":[730,49],"bytes":[21796,21844]},"signature":"github.com/benbjohnson/litestream.Replica.Restore.closure_2","parameters":[],"body":{"730:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_2@730:21","span":{"start":[730,21],"end":[730,45],"bytes":[21816,21840]},"callee":"can://litestream/litestream/@external/os/Remove"}}},"closure_3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_3","kind":"function","span":{"start":[736,1],"end":[736,34],"bytes":[21960,21993]},"signature":"github.com/benbjohnson/litestream.Replica.Restore.closure_3","parameters":[],"body":{"736:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_3@736:21","span":{"start":[736,21],"end":[736,30],"bytes":[21980,21989]},"callee":"can://litestream/litestream/@external/os/File.Close"}}},"closure_4":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4","kind":"function","span":{"start":[740,1],"end":[748,5],"bytes":[22017,22251]},"signature":"github.com/benbjohnson/litestream.Replica.Restore.closure_4","parameters":[],"body":{"741:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4@741:13","span":{"start":[741,13],"end":[741,39],"bytes":[22042,22068]},"callee":null},"743:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4@743:22","span":{"start":[743,22],"end":[743,62],"bytes":[22108,22148]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"743:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4@743:4","span":{"start":[743,4],"end":[743,63],"bytes":[22090,22149]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"},"747:25":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4@747:25","span":{"start":[747,25],"end":[747,39],"bytes":[22231,22245]},"callee":null},"747:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4@747:7","span":{"start":[747,7],"end":[747,40],"bytes":[22213,22246]},"callee":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError"}}}}},"github.com/benbjohnson/litestream.Replica.RestoreV3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","kind":"method","span":{"start":[1067,1],"end":[1176,2],"bytes":[31404,34995]},"signature":"github.com/benbjohnson/litestream.Replica.RestoreV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1067,1],"end":[1067,77],"bytes":[31404,31480]}},{"name":"opt","type":"github.com/benbjohnson/litestream.RestoreOptions","span":{"start":[1067,1],"end":[1067,77],"bytes":[31404,31480]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":22},"body":{"1070:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1070:10","span":{"start":[1070,10],"end":[1070,70],"bytes":[31542,31602]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1075:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1075:10","span":{"start":[1075,10],"end":[1075,44],"bytes":[31665,31699]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1077:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1077:10","span":{"start":[1077,10],"end":[1077,80],"bytes":[31852,31922]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1081:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1081:15","span":{"start":[1081,15],"end":[1081,38],"bytes":[31988,32011]},"callee":"can://litestream/litestream/@external/os/Stat"},"1082:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1082:10","span":{"start":[1082,10],"end":[1082,86],"bytes":[32035,32111]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1083:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1083:13","span":{"start":[1083,13],"end":[1083,31],"bytes":[32124,32142]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"1088:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1088:22","span":{"start":[1088,22],"end":[1088,47],"bytes":[32209,32234]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3"},"1090:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1090:10","span":{"start":[1090,10],"end":[1090,49],"bytes":[32261,32300]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1092:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1092:5","span":{"start":[1092,5],"end":[1092,21],"bytes":[32308,32324]},"callee":null},"1099:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1099:21","span":{"start":[1099,21],"end":[1099,49],"bytes":[32500,32528]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3"},"1101:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1101:11","span":{"start":[1101,11],"end":[1101,71],"bytes":[32557,32617]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1103:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1103:18","span":{"start":[1103,18],"end":[1103,52],"bytes":[32639,32673]},"callee":null},"1105:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1105:5","span":{"start":[1105,5],"end":[1105,22],"bytes":[32681,32698]},"callee":null},"1110:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1110:2","span":{"start":[1110,2],"end":[1110,42],"bytes":[32802,32842]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt"},"1113:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1113:14","span":{"start":[1113,14],"end":[1113,61],"bytes":[32947,32994]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3"},"1118:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1118:2","span":{"start":[1118,2],"end":[1121,36],"bytes":[33046,33190]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1118:2/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1118:2/2","span":{"start":[1118,2],"end":[1118,12],"bytes":[33046,33056]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"1124:19":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1124:19","span":{"start":[1124,19],"end":[1124,65],"bytes":[33262,33308]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3"},"1126:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1126:10","span":{"start":[1126,10],"end":[1126,50],"bytes":[33335,33375]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1128:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1128:13","span":{"start":[1128,13],"end":[1128,73],"bytes":[33391,33451]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3"},"1130:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1130:2","span":{"start":[1130,2],"end":[1130,67],"bytes":[33454,33519]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1130:2/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1130:2/2","span":{"start":[1130,2],"end":[1130,12],"bytes":[33454,33464]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"1130:53":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1130:53","span":{"start":[1130,53],"end":[1130,66],"bytes":[33505,33518]},"callee":null},"1134:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1134:11","span":{"start":[1134,11],"end":[1134,17],"bytes":[33605,33611]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB"},"1135:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1135:13","span":{"start":[1135,13],"end":[1135,25],"bytes":[33637,33649]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo"},"1137:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1137:12","span":{"start":[1137,12],"end":[1137,68],"bytes":[33664,33720]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll"},"1137:30":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1137:30","span":{"start":[1137,30],"end":[1137,58],"bytes":[33682,33710]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"1138:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1138:10","span":{"start":[1138,10],"end":[1138,56],"bytes":[33744,33790]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1143:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1143:8","span":{"start":[1143,8],"end":[1143,43],"bytes":[33872,33907]},"callee":null,"is_deferred":true},"1146:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1146:12","span":{"start":[1146,12],"end":[1146,91],"bytes":[33958,34037]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3"},"1147:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1147:10","span":{"start":[1147,10],"end":[1147,50],"bytes":[34061,34101]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1151:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1151:12","span":{"start":[1151,12],"end":[1151,101],"bytes":[34141,34230]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3"},"1152:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1152:10","span":{"start":[1152,10],"end":[1152,51],"bytes":[34254,34295]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1156:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1156:12","span":{"start":[1156,12],"end":[1156,46],"bytes":[34337,34371]},"callee":"can://litestream/litestream/@external/os/Rename"},"1157:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1157:10","span":{"start":[1157,10],"end":[1157,54],"bytes":[34395,34439]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1159:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1159:12","span":{"start":[1159,12],"end":[1159,59],"bytes":[34454,34501]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"1159:30":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1159:30","span":{"start":[1159,30],"end":[1159,58],"bytes":[34472,34500]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"1160:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1160:10","span":{"start":[1160,10],"end":[1160,56],"bytes":[34525,34571]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1164:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1164:13","span":{"start":[1164,13],"end":[1164,68],"bytes":[34635,34690]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity"},"1165:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1165:7","span":{"start":[1165,7],"end":[1165,16],"bytes":[34711,34720]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"1166:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1166:9","span":{"start":[1166,9],"end":[1166,34],"bytes":[34738,34763]},"callee":"can://litestream/litestream/@external/os/Remove"},"1167:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1167:9","span":{"start":[1167,9],"end":[1167,43],"bytes":[34772,34806]},"callee":"can://litestream/litestream/@external/os/Remove"},"1168:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1168:9","span":{"start":[1168,9],"end":[1168,43],"bytes":[34815,34849]},"callee":"can://litestream/litestream/@external/os/Remove"},"1170:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1170:11","span":{"start":[1170,11],"end":[1170,62],"bytes":[34865,34916]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1172:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1172:3","span":{"start":[1172,3],"end":[1172,57],"bytes":[34923,34977]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"1172:3/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3@1172:3/2","span":{"start":[1172,3],"end":[1172,13],"bytes":[34923,34933]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3/github.com/benbjohnson/litestream.Replica.RestoreV3.closure_1","kind":"function","span":{"start":[1143,1],"end":[1143,43],"bytes":[33865,33907]},"signature":"github.com/benbjohnson/litestream.Replica.RestoreV3.closure_1","parameters":[],"body":{"1143:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3/github.com/benbjohnson/litestream.Replica.RestoreV3.closure_1@1143:21","span":{"start":[1143,21],"end":[1143,39],"bytes":[33885,33903]},"callee":"can://litestream/litestream/@external/os/Remove"}}}}},"github.com/benbjohnson/litestream.Replica.SetPos":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos","kind":"method","span":{"start":[310,1],"end":[314,2],"bytes":[8000,8088]},"signature":"github.com/benbjohnson/litestream.Replica.SetPos","parameters":[{"name":"pos","type":"invalid type","span":{"start":[310,1],"end":[310,40],"bytes":[8000,8039]}}],"metrics":{"cyclomatic":1},"body":{"311:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos@311:2","span":{"start":[311,2],"end":[311,13],"bytes":[8041,8052]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"312:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos@312:8","span":{"start":[312,8],"end":[312,21],"bytes":[8060,8073]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.Replica.Start":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start","kind":"method","span":{"start":[104,1],"end":[121,2],"bytes":[2515,2900]},"signature":"github.com/benbjohnson/litestream.Replica.Start","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[104,1],"end":[104,53],"bytes":[2515,2567]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"111:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start@111:2","span":{"start":[111,2],"end":[111,15],"bytes":[2691,2704]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop"},"114:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start@114:18","span":{"start":[114,18],"end":[114,41],"bytes":[2758,2781]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"117:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start@117:2","span":{"start":[117,2],"end":[117,13],"bytes":[2823,2834]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"118:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start@118:5","span":{"start":[118,5],"end":[118,51],"bytes":[2839,2885]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start/github.com/benbjohnson/litestream.Replica.Start.closure_1","kind":"function","span":{"start":[118,1],"end":[118,51],"bytes":[2835,2885]},"signature":"github.com/benbjohnson/litestream.Replica.Start.closure_1","parameters":[],"body":{"118:20":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start/github.com/benbjohnson/litestream.Replica.Start.closure_1@118:20","span":{"start":[118,20],"end":[118,31],"bytes":[2854,2865]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"118:33":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start/github.com/benbjohnson/litestream.Replica.Start.closure_1@118:33","span":{"start":[118,33],"end":[118,47],"bytes":[2867,2881]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor"}}}}},"github.com/benbjohnson/litestream.Replica.Stop":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","kind":"method","span":{"start":[128,1],"end":[140,2],"bytes":[3160,3374]},"signature":"github.com/benbjohnson/litestream.Replica.Stop","parameters":[{"name":"hard","type":"bool","span":{"start":[128,1],"end":[128,48],"bytes":[3160,3207]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"129:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop@129:2","span":{"start":[129,2],"end":[129,12],"bytes":[3209,3219]},"callee":null},"130:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop@130:2","span":{"start":[130,2],"end":[130,13],"bytes":[3221,3232]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Wait"},"132:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop@132:2","span":{"start":[132,2],"end":[132,14],"bytes":[3235,3247]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"133:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop@133:8","span":{"start":[133,8],"end":[133,22],"bytes":[3255,3269]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"135:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop@135:11","span":{"start":[135,11],"end":[135,22],"bytes":[3305,3316]},"callee":"can://litestream/litestream/@external/os/File.Close"}}},"github.com/benbjohnson/litestream.Replica.Sync":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","kind":"method","span":{"start":[144,1],"end":[146,2],"bytes":[3532,3614]},"signature":"github.com/benbjohnson/litestream.Replica.Sync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[144,1],"end":[144,58],"bytes":[3532,3589]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"145:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync@145:9","span":{"start":[145,9],"end":[145,23],"bytes":[3598,3612]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync"}}},"github.com/benbjohnson/litestream.Replica.TimeBounds":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","kind":"method","span":{"start":[538,1],"end":[559,2],"bytes":[14333,14951]},"signature":"github.com/benbjohnson/litestream.Replica.TimeBounds","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[538,1],"end":[538,96],"bytes":[14333,14428]}}],"return_type":"(time.Time, time.Time, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"540:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds@540:15","span":{"start":[540,15],"end":[540,54],"bytes":[14494,14533]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"545:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds@545:7","span":{"start":[545,7],"end":[545,17],"bytes":[14599,14609]},"callee":null},"546:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds@546:12","span":{"start":[546,12],"end":[546,22],"bytes":[14623,14633]},"callee":null},"547:29":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds@547:29","span":{"start":[547,29],"end":[547,61],"bytes":[14662,14694]},"callee":null},"547:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds@547:7","span":{"start":[547,7],"end":[547,25],"bytes":[14640,14658]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"550:29":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds@550:29","span":{"start":[550,29],"end":[550,60],"bytes":[14761,14792]},"callee":null},"550:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds@550:7","span":{"start":[550,7],"end":[550,25],"bytes":[14739,14757]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"554:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds@554:13","span":{"start":[554,13],"end":[554,24],"bytes":[14847,14858]},"callee":null}}},"github.com/benbjohnson/litestream.Replica.TimeBoundsV3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","kind":"method","span":{"start":[1458,1],"end":[1493,2],"bytes":[43406,44399]},"signature":"github.com/benbjohnson/litestream.Replica.TimeBoundsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1458,1],"end":[1458,122],"bytes":[43406,43527]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1458,1],"end":[1458,122],"bytes":[43406,43527]}}],"return_type":"(time.Time, time.Time, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1459:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1459:22","span":{"start":[1459,22],"end":[1459,47],"bytes":[43549,43574]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3"},"1465:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1465:21","span":{"start":[1465,21],"end":[1465,49],"bytes":[43690,43718]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3"},"1470:29":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1470:29","span":{"start":[1470,29],"end":[1470,61],"bytes":[43844,43876]},"callee":"can://litestream/litestream/@external/time/Time.Before"},"1470:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1470:7","span":{"start":[1470,7],"end":[1470,25],"bytes":[43822,43840]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1473:29":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1473:29","span":{"start":[1473,29],"end":[1473,60],"bytes":[43943,43974]},"callee":"can://litestream/litestream/@external/time/Time.After"},"1473:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1473:7","span":{"start":[1473,7],"end":[1473,25],"bytes":[43921,43939]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1478:20":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1478:20","span":{"start":[1478,20],"end":[1478,50],"bytes":[44037,44067]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3"},"1483:29":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1483:29","span":{"start":[1483,29],"end":[1483,60],"bytes":[44191,44222]},"callee":"can://litestream/litestream/@external/time/Time.Before"},"1483:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1483:7","span":{"start":[1483,7],"end":[1483,25],"bytes":[44169,44187]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1486:29":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1486:29","span":{"start":[1486,29],"end":[1486,59],"bytes":[44288,44318]},"callee":"can://litestream/litestream/@external/time/Time.After"},"1486:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3@1486:7","span":{"start":[1486,7],"end":[1486,25],"bytes":[44266,44284]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"}}},"github.com/benbjohnson/litestream.Replica.ValidateLevel":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel","kind":"method","span":{"start":[1784,1],"end":[1846,2],"bytes":[52529,54262]},"signature":"github.com/benbjohnson/litestream.Replica.ValidateLevel","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1784,1],"end":[1784,93],"bytes":[52529,52621]}},{"name":"level","type":"int","span":{"start":[1784,1],"end":[1784,93],"bytes":[52529,52621]}}],"return_type":"([]github.com/benbjohnson/litestream.ValidationError, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"1785:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1785:14","span":{"start":[1785,14],"end":[1785,53],"bytes":[52635,52674]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"1787:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1787:15","span":{"start":[1787,15],"end":[1787,53],"bytes":[52706,52744]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1789:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1789:8","span":{"start":[1789,8],"end":[1789,19],"bytes":[52755,52766]},"callee":null,"is_deferred":true},"1794:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1794:6","span":{"start":[1794,6],"end":[1794,16],"bytes":[52832,52842]},"callee":null},"1795:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1795:11","span":{"start":[1795,11],"end":[1795,21],"bytes":[52855,52865]},"callee":null},"1805:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1805:13","span":{"start":[1805,13],"end":[1811,6],"bytes":[53093,53337]},"callee":null},"1808:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1808:15","span":{"start":[1808,15],"end":[1808,115],"bytes":[53186,53286]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1820:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1820:14","span":{"start":[1820,14],"end":[1826,7],"bytes":[53582,53847]},"callee":null},"1823:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1823:16","span":{"start":[1823,16],"end":[1823,136],"bytes":[53673,53793]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1828:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1828:14","span":{"start":[1828,14],"end":[1834,7],"bytes":[53873,54115]},"callee":null},"1831:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1831:16","span":{"start":[1831,16],"end":[1831,109],"bytes":[53968,54061]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1841:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1841:12","span":{"start":[1841,12],"end":[1841,23],"bytes":[54159,54170]},"callee":null},"1842:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel@1842:15","span":{"start":[1842,15],"end":[1842,52],"bytes":[54199,54236]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.Replica.appendWALSegmentV3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","kind":"method","span":{"start":[1308,1],"end":[1317,2],"bytes":[38865,39215]},"signature":"github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}},{"name":"generation","type":"string","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}},{"name":"seg","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}},{"name":"f","type":"*os.File","span":{"start":[1308,1],"end":[1308,152],"bytes":[38865,39016]}}],"return_type":"(int64, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1310:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3@1310:13","span":{"start":[1310,13],"end":[1310,76],"bytes":[39055,39118]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3"},"1314:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3@1314:8","span":{"start":[1314,8],"end":[1314,35],"bytes":[39162,39189]},"callee":null,"is_deferred":true},"1316:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3@1316:9","span":{"start":[1316,9],"end":[1316,23],"bytes":[39199,39213]},"callee":"can://litestream/litestream/@external/io/Copy"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3.closure_1","kind":"function","span":{"start":[1314,1],"end":[1314,35],"bytes":[39155,39189]},"signature":"github.com/benbjohnson/litestream.Replica.appendWALSegmentV3.closure_1","parameters":[],"body":{"1314:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3.closure_1@1314:21","span":{"start":[1314,21],"end":[1314,31],"bytes":[39175,39185]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}}}},"github.com/benbjohnson/litestream.Replica.applyLTXFile":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","kind":"method","span":{"start":[946,1],"end":[1000,2],"bytes":[28110,29522]},"signature":"github.com/benbjohnson/litestream.Replica.applyLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[946,1],"end":[946,109],"bytes":[28110,28218]}},{"name":"f","type":"*os.File","span":{"start":[946,1],"end":[946,109],"bytes":[28110,28218]}},{"name":"info","type":"invalid type","span":{"start":[946,1],"end":[946,109],"bytes":[28110,28218]}},{"name":"pageSize","type":"uint32","span":{"start":[946,1],"end":[946,109],"bytes":[28110,28218]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"947:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@947:13","span":{"start":[947,13],"end":[947,84],"bytes":[28231,28302]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"949:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@949:10","span":{"start":[949,10],"end":[949,46],"bytes":[28329,28365]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"951:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@951:8","span":{"start":[951,8],"end":[951,18],"bytes":[28376,28386]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"953:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@953:9","span":{"start":[953,9],"end":[953,27],"bytes":[28396,28414]},"callee":null},"954:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@954:12","span":{"start":[954,12],"end":[954,30],"bytes":[28426,28444]},"callee":null},"955:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@955:10","span":{"start":[955,10],"end":[955,46],"bytes":[28468,28504]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"958:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@958:9","span":{"start":[958,9],"end":[958,21],"bytes":[28517,28529]},"callee":null},"960:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@960:12","span":{"start":[960,12],"end":[960,41],"bytes":[28542,28571]},"callee":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive"},"961:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@961:10","span":{"start":[961,10],"end":[961,55],"bytes":[28595,28640]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"963:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@963:8","span":{"start":[963,8],"end":[963,30],"bytes":[28651,28673]},"callee":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile","is_deferred":true},"967:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@967:11","span":{"start":[967,11],"end":[967,33],"bytes":[28718,28740]},"callee":null},"968:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@968:13","span":{"start":[968,13],"end":[968,40],"bytes":[28753,28780]},"callee":null},"971:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@971:11","span":{"start":[971,11],"end":[971,45],"bytes":[28842,28876]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"974:24":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@974:24","span":{"start":[974,24],"end":[974,33],"bytes":[28905,28914]},"callee":null},"976:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@976:11","span":{"start":[976,11],"end":[976,33],"bytes":[28968,28990]},"callee":"can://litestream/litestream/@external/crypto/rand/Read"},"979:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@979:10","span":{"start":[979,10],"end":[979,28],"bytes":[29005,29023]},"callee":null},"979:31":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@979:31","span":{"start":[979,31],"end":[979,46],"bytes":[29026,29041]},"callee":null},"980:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@980:16","span":{"start":[980,16],"end":[980,36],"bytes":[29057,29077]},"callee":"can://litestream/litestream/@external/os/File.WriteAt"},"981:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@981:11","span":{"start":[981,11],"end":[981,58],"bytes":[29102,29149]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"986:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@986:13","span":{"start":[986,13],"end":[986,21],"bytes":[29191,29199]},"callee":"can://litestream/litestream/@external/os/File.Sync"},"987:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@987:11","span":{"start":[987,11],"end":[987,54],"bytes":[29224,29267]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"989:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@989:14","span":{"start":[989,14],"end":[989,31],"bytes":[29285,29302]},"callee":null},"989:34":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@989:34","span":{"start":[989,34],"end":[989,49],"bytes":[29305,29320]},"callee":null},"990:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@990:13","span":{"start":[990,13],"end":[990,32],"bytes":[29333,29352]},"callee":"can://litestream/litestream/@external/os/File.Truncate"},"991:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@991:11","span":{"start":[991,11],"end":[991,42],"bytes":[29377,29408]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"995:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@995:12","span":{"start":[995,12],"end":[995,23],"bytes":[29428,29439]},"callee":null},"996:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@996:10","span":{"start":[996,10],"end":[996,46],"bytes":[29463,29499]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"999:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile@999:9","span":{"start":[999,9],"end":[999,17],"bytes":[29512,29520]},"callee":"can://litestream/litestream/@external/os/File.Sync"}}},"github.com/benbjohnson/litestream.Replica.applyNewLTXFiles":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","kind":"method","span":{"start":[865,1],"end":[936,2],"bytes":[25653,27624]},"signature":"github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[865,1],"end":[865,125],"bytes":[25653,25777]}},{"name":"f","type":"*os.File","span":{"start":[865,1],"end":[865,125],"bytes":[25653,25777]}},{"name":"afterTXID","type":"invalid type","span":{"start":[865,1],"end":[865,125],"bytes":[25653,25777]}},{"name":"pageSize","type":"uint32","span":{"start":[865,1],"end":[865,125],"bytes":[25653,25777]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":15},"body":{"869:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@869:14","span":{"start":[869,14],"end":[869,61],"bytes":[25874,25921]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"871:23":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@871:23","span":{"start":[871,23],"end":[871,68],"bytes":[25961,26006]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"885:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@885:6","span":{"start":[885,6],"end":[885,16],"bytes":[26357,26367]},"callee":null},"887:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@887:11","span":{"start":[887,11],"end":[887,21],"bytes":[26399,26409]},"callee":null},"891:24":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@891:24","span":{"start":[891,24],"end":[891,84],"bytes":[26539,26599]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap"},"893:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@893:12","span":{"start":[893,12],"end":[893,28],"bytes":[26630,26646]},"callee":null},"902:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@902:12","span":{"start":[902,12],"end":[902,28],"bytes":[26844,26860]},"callee":null},"911:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@911:13","span":{"start":[911,13],"end":[911,51],"bytes":[26988,27026]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile"},"912:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@912:11","span":{"start":[912,11],"end":[915,6],"bytes":[27051,27182]},"callee":null},"912:23":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@912:23","span":{"start":[912,23],"end":[915,5],"bytes":[27063,27181]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"920:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@920:16","span":{"start":[920,16],"end":[920,25],"bytes":[27235,27244]},"callee":null},"921:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@921:10","span":{"start":[921,10],"end":[921,75],"bytes":[27272,27337]},"callee":null},"921:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@921:22","span":{"start":[921,22],"end":[921,74],"bytes":[27284,27336]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"923:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@923:15","span":{"start":[923,15],"end":[923,31],"bytes":[27355,27371]},"callee":null},"928:23":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles@928:23","span":{"start":[928,23],"end":[928,84],"bytes":[27455,27516]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1","kind":"function","span":{"start":[873,1],"end":[882,3],"bytes":[26010,26330]},"signature":"github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1","parameters":[{"name":"retErr","type":"error","span":{"start":[873,1],"end":[873,55],"bytes":[26010,26064]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"874:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1@874:18","span":{"start":[874,18],"end":[874,29],"bytes":[26082,26093]},"callee":null},"875:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1@875:15","span":{"start":[875,15],"end":[875,69],"bytes":[26127,26181]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"877:25":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1@877:25","span":{"start":[877,25],"end":[877,54],"bytes":[26228,26257]},"callee":"can://litestream/litestream/@external/errors/Join"}}}}},"github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","kind":"method","span":{"start":[1244,1],"end":[1305,2],"bytes":[36970,38788]},"signature":"github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"generation","type":"string","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"snapshotIndex","type":"int","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"segments","type":"[]github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}},{"name":"dbPath","type":"string","span":{"start":[1244,1],"end":[1244,172],"bytes":[36970,37141]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"1245:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1245:5","span":{"start":[1245,5],"end":[1245,18],"bytes":[37146,37159]},"callee":null},"1254:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1254:12","span":{"start":[1254,12],"end":[1254,20],"bytes":[37330,37338]},"callee":null},"1256:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1256:8","span":{"start":[1256,8],"end":[1260,5],"bytes":[37347,37397]},"callee":null,"is_deferred":true},"1281:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1281:13","span":{"start":[1281,13],"end":[1281,31],"bytes":[37919,37937]},"callee":null},"1285:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1285:12","span":{"start":[1285,12],"end":[1285,107],"bytes":[38018,38113]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1289:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1289:16","span":{"start":[1289,16],"end":[1289,78],"bytes":[38174,38236]},"callee":"can://litestream/litestream/@external/os/OpenFile"},"1294:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1294:11","span":{"start":[1294,11],"end":[1294,113],"bytes":[38335,38437]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1296:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1296:16","span":{"start":[1296,16],"end":[1296,69],"bytes":[38457,38510]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3"},"1297:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1297:11","span":{"start":[1297,11],"end":[1297,80],"bytes":[38535,38604]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1300:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1300:4","span":{"start":[1300,4],"end":[1300,121],"bytes":[38634,38751]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1300:4/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1300:4/2","span":{"start":[1300,4],"end":[1300,14],"bytes":[38634,38644]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"1304:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3@1304:9","span":{"start":[1304,9],"end":[1304,27],"bytes":[38768,38786]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_1","kind":"function","span":{"start":[1256,1],"end":[1260,5],"bytes":[37340,37397]},"signature":"github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_1","parameters":[],"body":{"1258:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_1@1258:8","span":{"start":[1258,8],"end":[1258,17],"bytes":[37379,37388]},"callee":"can://litestream/litestream/@external/os/File.Close"}}},"closure_2":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2","kind":"function","span":{"start":[1262,1],"end":[1274,3],"bytes":[37399,37723]},"signature":"github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2","parameters":[],"return_type":"error","error_channel":["error"],"body":{"1265:19":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2@1265:19","span":{"start":[1265,19],"end":[1265,28],"bytes":[37483,37492]},"callee":"can://litestream/litestream/@external/os/File.Close"},"1269:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2@1269:12","span":{"start":[1269,12],"end":[1269,32],"bytes":[37546,37566]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3"},"1272:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2@1272:3","span":{"start":[1272,3],"end":[1272,109],"bytes":[37601,37707]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1272:3/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2@1272:3/2","span":{"start":[1272,3],"end":[1272,13],"bytes":[37601,37611]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}}}}},"github.com/benbjohnson/litestream.Replica.calcPos":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","kind":"method","span":{"start":[274,1],"end":[280,2],"bytes":[7015,7240]},"signature":"github.com/benbjohnson/litestream.Replica.calcPos","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[274,1],"end":[274,74],"bytes":[7015,7088]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"275:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos@275:15","span":{"start":[275,15],"end":[275,39],"bytes":[7103,7127]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo"},"277:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos@277:15","span":{"start":[277,15],"end":[277,50],"bytes":[7159,7194]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.Replica.downloadSnapshotV3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","kind":"method","span":{"start":[1224,1],"end":[1241,2],"bytes":[36463,36903]},"signature":"github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}},{"name":"generation","type":"string","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}},{"name":"index","type":"int","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}},{"name":"destPath","type":"string","span":{"start":[1224,1],"end":[1224,137],"bytes":[36463,36599]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1225:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3@1225:13","span":{"start":[1225,13],"end":[1225,58],"bytes":[36612,36657]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3"},"1229:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3@1229:8","span":{"start":[1229,8],"end":[1229,35],"bytes":[36698,36725]},"callee":null,"is_deferred":true},"1231:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3@1231:12","span":{"start":[1231,12],"end":[1231,31],"bytes":[36738,36757]},"callee":"can://litestream/litestream/@external/os/Create"},"1235:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3@1235:8","span":{"start":[1235,8],"end":[1235,34],"bytes":[36798,36824]},"callee":null,"is_deferred":true},"1237:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3@1237:15","span":{"start":[1237,15],"end":[1237,29],"bytes":[36840,36854]},"callee":"can://litestream/litestream/@external/io/Copy"},"1240:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3@1240:9","span":{"start":[1240,9],"end":[1240,17],"bytes":[36893,36901]},"callee":"can://litestream/litestream/@external/os/File.Sync"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_1","kind":"function","span":{"start":[1229,1],"end":[1229,35],"bytes":[36691,36725]},"signature":"github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_1","parameters":[],"body":{"1229:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_1@1229:21","span":{"start":[1229,21],"end":[1229,31],"bytes":[36711,36721]},"callee":"can://litestream/litestream/@external/io/Closer.Close"}}},"closure_2":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_2","kind":"function","span":{"start":[1235,1],"end":[1235,34],"bytes":[36791,36824]},"signature":"github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_2","parameters":[],"body":{"1235:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_2@1235:21","span":{"start":[1235,21],"end":[1235,30],"bytes":[36811,36820]},"callee":"can://litestream/litestream/@external/os/File.Close"}}}}},"github.com/benbjohnson/litestream.Replica.fillFollowGap":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","kind":"method","span":{"start":[1004,1],"end":[1064,2],"bytes":[29671,31351]},"signature":"github.com/benbjohnson/litestream.Replica.fillFollowGap","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}},{"name":"f","type":"*os.File","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}},{"name":"afterTXID","type":"invalid type","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}},{"name":"gapMinTXID","type":"invalid type","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}},{"name":"pageSize","type":"uint32","span":{"start":[1004,1],"end":[1004,143],"bytes":[29671,29813]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"1008:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1008:15","span":{"start":[1008,15],"end":[1008,54],"bytes":[29905,29944]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"1010:24":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1010:24","span":{"start":[1010,24],"end":[1010,77],"bytes":[29986,30039]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1023:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1023:7","span":{"start":[1023,7],"end":[1023,17],"bytes":[30389,30399]},"callee":null},"1024:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1024:12","span":{"start":[1024,12],"end":[1024,22],"bytes":[30413,30423]},"callee":null},"1036:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1036:14","span":{"start":[1036,14],"end":[1036,52],"bytes":[30624,30662]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile"},"1037:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1037:12","span":{"start":[1037,12],"end":[1040,7],"bytes":[30688,30830]},"callee":null},"1037:23":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1037:23","span":{"start":[1037,23],"end":[1040,6],"bytes":[30699,30829]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1046:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1046:12","span":{"start":[1046,12],"end":[1046,27],"bytes":[30963,30978]},"callee":null},"1050:17":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1050:17","span":{"start":[1050,17],"end":[1050,26],"bytes":[31005,31014]},"callee":null},"1051:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1051:11","span":{"start":[1051,11],"end":[1051,83],"bytes":[31043,31115]},"callee":null},"1051:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1051:22","span":{"start":[1051,22],"end":[1051,82],"bytes":[31054,31114]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1053:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap@1053:16","span":{"start":[1053,16],"end":[1053,31],"bytes":[31135,31150]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap/github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1","kind":"function","span":{"start":[1012,1],"end":[1021,4],"bytes":[30044,30381]},"signature":"github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1","parameters":[{"name":"retErr","type":"error","span":{"start":[1012,1],"end":[1012,55],"bytes":[30044,30098]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{"1013:19":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap/github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1@1013:19","span":{"start":[1013,19],"end":[1013,30],"bytes":[30117,30128]},"callee":null},"1014:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap/github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1@1014:16","span":{"start":[1014,16],"end":[1014,78],"bytes":[30163,30225]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1016:26":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap/github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1@1016:26","span":{"start":[1016,26],"end":[1016,55],"bytes":[30274,30303]},"callee":"can://litestream/litestream/@external/errors/Join"}}}}},"github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","kind":"method","span":{"start":[1497,1],"end":[1511,2],"bytes":[44538,45132]},"signature":"github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1497,1],"end":[1497,117],"bytes":[44538,44654]}},{"name":"timestamp","type":"time.Time","span":{"start":[1497,1],"end":[1497,117],"bytes":[44538,44654]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1499:20":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp@1499:20","span":{"start":[1499,20],"end":[1501,4],"bytes":[44746,44886]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles"},"1503:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp@1503:15","span":{"start":[1503,15],"end":[1503,56],"bytes":[44918,44959]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1505:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp@1505:5","span":{"start":[1505,5],"end":[1505,19],"bytes":[44967,44981]},"callee":null},"1510:19":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp@1510:19","span":{"start":[1510,19],"end":[1510,33],"bytes":[45108,45122]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp.closure_1","kind":"function","span":{"start":[1499,1],"end":[1501,4],"bytes":[44727,44886]},"signature":"github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp.closure_1","parameters":[{"name":"info","type":"invalid type","span":{"start":[1499,1],"end":[1499,109],"bytes":[44727,44835]}}],"return_type":"(bool, error)","error_channel":["error"],"body":{"1500:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp.closure_1@1500:10","span":{"start":[1500,10],"end":[1500,42],"bytes":[44845,44877]},"callee":null}}}}},"github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","kind":"method","span":{"start":[1370,1],"end":[1396,2],"bytes":[40618,41423]},"signature":"github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1370,1],"end":[1370,142],"bytes":[40618,40759]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1370,1],"end":[1370,142],"bytes":[40618,40759]}},{"name":"timestamp","type":"time.Time","span":{"start":[1370,1],"end":[1370,142],"bytes":[40618,40759]}}],"return_type":"(*github.com/benbjohnson/litestream.SnapshotInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1371:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1371:22","span":{"start":[1371,22],"end":[1371,47],"bytes":[40781,40806]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3"},"1373:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1373:15","span":{"start":[1373,15],"end":[1373,61],"bytes":[40838,40884]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1375:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1375:5","span":{"start":[1375,5],"end":[1375,21],"bytes":[40892,40908]},"callee":null},"1381:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1381:21","span":{"start":[1381,21],"end":[1381,49],"bytes":[41028,41056]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3"},"1383:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1383:16","span":{"start":[1383,16],"end":[1383,83],"bytes":[41090,41157]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1385:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1385:18","span":{"start":[1385,18],"end":[1385,52],"bytes":[41179,41213]},"callee":null},"1388:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1388:5","span":{"start":[1388,5],"end":[1388,22],"bytes":[41222,41239]},"callee":null},"1393:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1393:2","span":{"start":[1393,2],"end":[1393,42],"bytes":[41323,41363]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt"},"1395:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp@1395:9","span":{"start":[1395,9],"end":[1395,52],"bytes":[41373,41416]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3"}}},"github.com/benbjohnson/litestream.Replica.follow":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","kind":"method","span":{"start":[804,1],"end":[860,2],"bytes":[23868,25451]},"signature":"github.com/benbjohnson/litestream.Replica.follow","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[804,1],"end":[804,116],"bytes":[23868,23983]}},{"name":"outputPath","type":"string","span":{"start":[804,1],"end":[804,116],"bytes":[23868,23983]}},{"name":"lastTXID","type":"invalid type","span":{"start":[804,1],"end":[804,116],"bytes":[23868,23983]}},{"name":"interval","type":"time.Duration","span":{"start":[804,1],"end":[804,116],"bytes":[23868,23983]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"805:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@805:12","span":{"start":[805,12],"end":[805,49],"bytes":[23995,24032]},"callee":"can://litestream/litestream/@external/os/OpenFile"},"807:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@807:10","span":{"start":[807,10],"end":[807,57],"bytes":[24059,24106]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"809:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@809:8","span":{"start":[809,8],"end":[812,5],"bytes":[24117,24161]},"callee":null,"is_deferred":true},"816:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@816:15","span":{"start":[816,15],"end":[816,35],"bytes":[24266,24286]},"callee":"can://litestream/litestream/@external/os/File.ReadAt"},"817:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@817:10","span":{"start":[817,10],"end":[817,68],"bytes":[24310,24368]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"819:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@819:14","span":{"start":[819,14],"end":[819,28],"bytes":[24385,24399]},"callee":null},"819:34":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@819:34","span":{"start":[819,34],"end":[819,48],"bytes":[24405,24419]},"callee":null},"828:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@828:2","span":{"start":[828,2],"end":[828,103],"bytes":[24523,24624]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"828:2/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@828:2/2","span":{"start":[828,2],"end":[828,12],"bytes":[24523,24533]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"830:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@830:12","span":{"start":[830,12],"end":[830,36],"bytes":[24637,24661]},"callee":"can://litestream/litestream/@external/time/NewTicker"},"831:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@831:8","span":{"start":[831,8],"end":[831,21],"bytes":[24669,24682]},"callee":"can://litestream/litestream/@external/time/Ticker.Stop","is_deferred":true},"836:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@836:10","span":{"start":[836,10],"end":[836,20],"bytes":[24738,24748]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"837:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@837:4","span":{"start":[837,4],"end":[837,42],"bytes":[24753,24791]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"837:4/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@837:4/2","span":{"start":[837,4],"end":[837,14],"bytes":[24753,24763]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"840:20":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@840:20","span":{"start":[840,20],"end":[840,66],"bytes":[24844,24890]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles"},"842:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@842:8","span":{"start":[842,8],"end":[842,17],"bytes":[24917,24926]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"843:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@843:6","span":{"start":[843,6],"end":[843,44],"bytes":[24941,24979]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"843:6/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@843:6/2","span":{"start":[843,6],"end":[843,16],"bytes":[24941,24951]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"847:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@847:5","span":{"start":[847,5],"end":[847,108],"bytes":[25030,25133]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"847:5/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@847:5/2","span":{"start":[847,5],"end":[847,15],"bytes":[25030,25040]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"851:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@851:15","span":{"start":[851,15],"end":[851,49],"bytes":[25193,25227]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile"},"852:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@852:13","span":{"start":[852,13],"end":[852,51],"bytes":[25254,25292]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"854:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@854:5","span":{"start":[854,5],"end":[854,90],"bytes":[25303,25388]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"854:5/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow@854:5/2","span":{"start":[854,5],"end":[854,15],"bytes":[25303,25313]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow/github.com/benbjohnson/litestream.Replica.follow.closure_1","kind":"function","span":{"start":[809,1],"end":[812,5],"bytes":[24110,24161]},"signature":"github.com/benbjohnson/litestream.Replica.follow.closure_1","parameters":[],"body":{"810:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow/github.com/benbjohnson/litestream.Replica.follow.closure_1@810:7","span":{"start":[810,7],"end":[810,15],"bytes":[24132,24140]},"callee":"can://litestream/litestream/@external/os/File.Sync"},"811:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow/github.com/benbjohnson/litestream.Replica.follow.closure_1@811:7","span":{"start":[811,7],"end":[811,16],"bytes":[24147,24156]},"callee":"can://litestream/litestream/@external/os/File.Close"}}}}},"github.com/benbjohnson/litestream.Replica.lockSync":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync","kind":"method","span":{"start":[236,1],"end":[246,2],"bytes":[5819,6108]},"signature":"github.com/benbjohnson/litestream.Replica.lockSync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[236,1],"end":[236,56],"bytes":[5819,5874]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"237:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync@237:5","span":{"start":[237,5],"end":[237,28],"bytes":[5879,5902]},"callee":null},"240:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync@240:2","span":{"start":[240,2],"end":[240,22],"bytes":[5922,5942]},"callee":"can://litestream/litestream/@external/sync/atomic/Int64.Add"},"241:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync@241:8","span":{"start":[241,8],"end":[241,29],"bytes":[5950,5971]},"callee":"can://litestream/litestream/@external/sync/atomic/Int64.Add","is_deferred":true},"242:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync@242:12","span":{"start":[242,12],"end":[242,37],"bytes":[5983,6008]},"callee":null},"243:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync@243:10","span":{"start":[243,10],"end":[243,69],"bytes":[6032,6091]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"243:50":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync@243:50","span":{"start":[243,50],"end":[243,68],"bytes":[6072,6090]},"callee":"can://litestream/litestream/@external/context/Cause"}}},"github.com/benbjohnson/litestream.Replica.monitor":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","kind":"method","span":{"start":[392,1],"end":[516,2],"bytes":[10236,13800]},"signature":"github.com/benbjohnson/litestream.Replica.monitor","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[392,1],"end":[392,49],"bytes":[10236,10284]}}],"metrics":{"cyclomatic":28},"body":{"393:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@393:12","span":{"start":[393,12],"end":[393,42],"bytes":[10296,10326]},"callee":"can://litestream/litestream/@external/time/NewTicker"},"394:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@394:8","span":{"start":[394,8],"end":[394,21],"bytes":[10334,10347]},"callee":"can://litestream/litestream/@external/time/Ticker.Stop","is_deferred":true},"396:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@396:12","span":{"start":[396,12],"end":[396,25],"bytes":[10360,10373]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify"},"406:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@406:11","span":{"start":[406,11],"end":[406,21],"bytes":[10588,10598]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"415:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@415:11","span":{"start":[415,11],"end":[415,21],"bytes":[10745,10755]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"417:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@417:11","span":{"start":[417,11],"end":[417,30],"bytes":[10778,10797]},"callee":"can://litestream/litestream/@external/time/After"},"423:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@423:18","span":{"start":[423,18],"end":[423,28],"bytes":[10958,10968]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"423:56":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@423:56","span":{"start":[423,56],"end":[423,63],"bytes":[10996,11003]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"427:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@427:11","span":{"start":[427,11],"end":[427,21],"bytes":[11159,11169]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"432:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@432:13","span":{"start":[432,13],"end":[432,22],"bytes":[11237,11246]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"437:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@437:12","span":{"start":[437,12],"end":[437,25],"bytes":[11337,11350]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify"},"440:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@440:13","span":{"start":[440,13],"end":[440,43],"bytes":[11428,11458]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync"},"441:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@441:7","span":{"start":[441,7],"end":[441,44],"bytes":[11479,11516]},"callee":"can://litestream/litestream/@external/errors/Is"},"446:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@446:8","span":{"start":[446,8],"end":[446,33],"bytes":[11605,11630]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"461:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@461:8","span":{"start":[461,8],"end":[461,31],"bytes":[11987,12010]},"callee":"can://litestream/litestream/@external/errors/As"},"463:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@463:9","span":{"start":[463,9],"end":[463,32],"bytes":[12096,12119]},"callee":"can://litestream/litestream/@external/time/Since"},"465:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@465:8","span":{"start":[465,8],"end":[470,28],"bytes":[12182,12370]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"465:8/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@465:8/2","span":{"start":[465,8],"end":[465,18],"bytes":[12182,12192]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"472:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@472:8","span":{"start":[472,8],"end":[476,28],"bytes":[12393,12552]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"472:8/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@472:8/2","span":{"start":[472,8],"end":[472,18],"bytes":[12393,12403]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"478:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@478:21","span":{"start":[478,21],"end":[478,31],"bytes":[12581,12591]},"callee":"can://litestream/litestream/@external/time/Now"},"484:33":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@484:33","span":{"start":[484,33],"end":[484,59],"bytes":[12825,12851]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable"},"485:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@485:7","span":{"start":[485,7],"end":[485,70],"bytes":[12860,12923]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"485:7/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@485:7/2","span":{"start":[485,7],"end":[485,17],"bytes":[12860,12870]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"486:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@486:22","span":{"start":[486,22],"end":[486,47],"bytes":[12945,12970]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState"},"487:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@487:8","span":{"start":[487,8],"end":[487,67],"bytes":[12997,13056]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"487:8/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@487:8/2","span":{"start":[487,8],"end":[487,18],"bytes":[12997,13007]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"489:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@489:8","span":{"start":[489,8],"end":[489,71],"bytes":[13079,13142]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"489:8/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@489:8/2","span":{"start":[489,8],"end":[489,18],"bytes":[13079,13089]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"497:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@497:9","span":{"start":[497,9],"end":[497,32],"bytes":[13350,13373]},"callee":"can://litestream/litestream/@external/time/Since"},"498:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@498:7","span":{"start":[498,7],"end":[501,27],"bytes":[13406,13533]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"498:7/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@498:7/2","span":{"start":[498,7],"end":[498,17],"bytes":[13406,13416]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"502:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@502:21","span":{"start":[502,21],"end":[502,31],"bytes":[13554,13564]},"callee":"can://litestream/litestream/@external/time/Now"},"511:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@511:4","span":{"start":[511,4],"end":[511,81],"bytes":[13678,13755]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"511:4/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor@511:4/2","span":{"start":[511,4],"end":[511,14],"bytes":[13678,13688]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}}},"github.com/benbjohnson/litestream.Replica.shouldUseV3Restore":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","kind":"method","span":{"start":[1400,1],"end":[1454,2],"bytes":[41573,43295]},"signature":"github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1400,1],"end":[1400,119],"bytes":[41573,41691]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClientV3","span":{"start":[1400,1],"end":[1400,119],"bytes":[41573,41691]}},{"name":"timestamp","type":"time.Time","span":{"start":[1400,1],"end":[1400,119],"bytes":[41573,41691]}}],"return_type":"(bool, error)","error_channel":["error"],"metrics":{"cyclomatic":10},"body":{"1402:25":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1402:25","span":{"start":[1402,25],"end":[1402,52],"bytes":[41744,41771]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3"},"1404:17":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1404:17","span":{"start":[1404,17],"end":[1404,62],"bytes":[41805,41850]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1408:26":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1408:26","span":{"start":[1408,26],"end":[1408,43],"bytes":[41905,41922]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds"},"1410:17":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1410:17","span":{"start":[1410,17],"end":[1410,59],"bytes":[41956,41998]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1414:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1414:5","span":{"start":[1414,5],"end":[1414,25],"bytes":[42048,42068]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1419:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1419:5","span":{"start":[1419,5],"end":[1419,26],"bytes":[42140,42161]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1420:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1420:3","span":{"start":[1420,3],"end":[1420,60],"bytes":[42166,42223]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1420:3/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1420:3/2","span":{"start":[1420,3],"end":[1420,13],"bytes":[42166,42176]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"1425:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1425:6","span":{"start":[1425,6],"end":[1425,24],"bytes":[42322,42340]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1427:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1427:22","span":{"start":[1427,22],"end":[1427,78],"bytes":[42433,42489]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp"},"1429:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1429:18","span":{"start":[1429,18],"end":[1429,61],"bytes":[42525,42568]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1432:23":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1432:23","span":{"start":[1432,23],"end":[1432,72],"bytes":[42596,42645]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp"},"1434:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1434:18","span":{"start":[1434,18],"end":[1434,58],"bytes":[42681,42721]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1437:50":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1437:50","span":{"start":[1437,50],"end":[1437,99],"bytes":[42776,42825]},"callee":"can://litestream/litestream/@external/time/Time.After"},"1438:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1438:4","span":{"start":[1438,4],"end":[1440,33],"bytes":[42832,42978]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1438:4/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1438:4/2","span":{"start":[1438,4],"end":[1438,14],"bytes":[42832,42842]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"1445:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1445:6","span":{"start":[1445,6],"end":[1445,37],"bytes":[43078,43109]},"callee":"can://litestream/litestream/@external/time/Time.After"},"1446:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1446:4","span":{"start":[1446,4],"end":[1448,36],"bytes":[43115,43246]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1446:4/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore@1446:4/2","span":{"start":[1446,4],"end":[1446,14],"bytes":[43115,43125]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}}},"github.com/benbjohnson/litestream.Replica.sync":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync","kind":"method","span":{"start":[148,1],"end":[157,2],"bytes":[3616,3830]},"signature":"github.com/benbjohnson/litestream.Replica.sync","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[148,1],"end":[148,73],"bytes":[3616,3688]}},{"name":"maxSyncLTXFiles","type":"int","span":{"start":[148,1],"end":[148,73],"bytes":[3616,3688]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"150:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync@150:18","span":{"start":[150,18],"end":[150,50],"bytes":[3713,3745]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce"}}},"github.com/benbjohnson/litestream.Replica.syncOnce":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","kind":"method","span":{"start":[164,1],"end":[234,2],"bytes":[3895,5817]},"signature":"github.com/benbjohnson/litestream.Replica.syncOnce","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[164,1],"end":[164,109],"bytes":[3895,4003]}},{"name":"maxSyncLTXFiles","type":"int","span":{"start":[164,1],"end":[164,109],"bytes":[3895,4003]}}],"return_type":"(github.com/benbjohnson/litestream.replicaSyncResult, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"165:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@165:12","span":{"start":[165,12],"end":[165,27],"bytes":[4015,4030]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync"},"168:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@168:8","span":{"start":[168,8],"end":[168,28],"bytes":[4076,4096]},"callee":null,"is_deferred":true},"171:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@171:8","span":{"start":[171,8],"end":[177,5],"bytes":[4164,4252]},"callee":null,"is_deferred":true},"179:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@179:12","span":{"start":[179,12],"end":[179,21],"bytes":[4265,4274]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"180:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@180:18","span":{"start":[180,18],"end":[180,36],"bytes":[4306,4324]},"callee":"can://litestream/litestream/@external/context/Cause"},"184:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@184:5","span":{"start":[184,5],"end":[184,21],"bytes":[4385,4401]},"callee":null},"184:5/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@184:5/2","span":{"start":[184,5],"end":[184,12],"bytes":[4385,4392]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"185:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@185:15","span":{"start":[185,15],"end":[185,29],"bytes":[4418,4432]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos"},"187:19":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@187:19","span":{"start":[187,19],"end":[187,50],"bytes":[4469,4500]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"189:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@189:3","span":{"start":[189,3],"end":[189,16],"bytes":[4507,4520]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos"},"193:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@193:15","span":{"start":[193,15],"end":[193,25],"bytes":[4578,4588]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"195:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@195:18","span":{"start":[195,18],"end":[195,74],"bytes":[4623,4679]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"196:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@196:12","span":{"start":[196,12],"end":[196,25],"bytes":[4691,4704]},"callee":null},"200:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@200:2","span":{"start":[200,2],"end":[204,5],"bytes":[4751,4901]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"200:2/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@200:2/2","span":{"start":[200,2],"end":[200,12],"bytes":[4751,4761]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"201:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@201:3","span":{"start":[201,3],"end":[204,4],"bytes":[4786,4900]},"callee":"can://litestream/litestream/@external/log/slog/Group"},"202:27":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@202:27","span":{"start":[202,27],"end":[202,48],"bytes":[4831,4852]},"callee":null},"202:27/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@202:27/2","span":{"start":[202,27],"end":[202,34],"bytes":[4831,4838]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"202:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@202:4","span":{"start":[202,4],"end":[202,49],"bytes":[4808,4853]},"callee":"can://litestream/litestream/@external/log/slog/String"},"203:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@203:22","span":{"start":[203,22],"end":[203,40],"bytes":[4876,4894]},"callee":null},"203:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@203:4","span":{"start":[203,4],"end":[203,41],"bytes":[4858,4895]},"callee":"can://litestream/litestream/@external/log/slog/String"},"207:27":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@207:27","span":{"start":[207,27],"end":[207,34],"bytes":[4989,4996]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"207:72":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@207:72","span":{"start":[207,72],"end":[207,79],"bytes":[5034,5041]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"212:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@212:4","span":{"start":[212,4],"end":[212,31],"bytes":[5264,5291]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync"},"213:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@213:4","span":{"start":[213,4],"end":[216,43],"bytes":[5295,5446]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"213:4/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@213:4/2","span":{"start":[213,4],"end":[213,14],"bytes":[5295,5305]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"},"215:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@215:16","span":{"start":[215,16],"end":[215,34],"bytes":[5384,5402]},"callee":null},"216:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@216:21","span":{"start":[216,21],"end":[216,42],"bytes":[5424,5445]},"callee":null},"216:21/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@216:21/2","span":{"start":[216,21],"end":[216,28],"bytes":[5424,5431]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"219:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@219:13","span":{"start":[219,13],"end":[219,22],"bytes":[5485,5494]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"220:19":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@220:19","span":{"start":[220,19],"end":[220,37],"bytes":[5527,5545]},"callee":"can://litestream/litestream/@external/context/Cause"},"222:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@222:13","span":{"start":[222,13],"end":[222,48],"bytes":[5562,5597]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile"},"225:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@225:3","span":{"start":[225,3],"end":[225,32],"bytes":[5640,5669]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos"},"231:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce@231:2","span":{"start":[231,2],"end":[231,29],"bytes":[5767,5794]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce/github.com/benbjohnson/litestream.Replica.syncOnce.closure_1","kind":"function","span":{"start":[171,1],"end":[177,5],"bytes":[4157,4252]},"signature":"github.com/benbjohnson/litestream.Replica.syncOnce.closure_1","parameters":[],"body":{"173:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce/github.com/benbjohnson/litestream.Replica.syncOnce.closure_1@173:4","span":{"start":[173,4],"end":[173,15],"bytes":[4194,4205]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"175:4":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce/github.com/benbjohnson/litestream.Replica.syncOnce.closure_1@175:4","span":{"start":[175,4],"end":[175,17],"bytes":[4230,4243]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock"}}}}},"github.com/benbjohnson/litestream.Replica.uploadLTXFile":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","kind":"method","span":{"start":[248,1],"end":[271,2],"bytes":[6110,6942]},"signature":"github.com/benbjohnson/litestream.Replica.uploadLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[248,1],"end":[248,105],"bytes":[6110,6214]}},{"name":"level","type":"int","span":{"start":[248,1],"end":[248,105],"bytes":[6110,6214]}},{"name":"minTXID","type":"invalid type","span":{"start":[248,1],"end":[248,105],"bytes":[6110,6214]}},{"name":"maxTXID","type":"invalid type","span":{"start":[248,1],"end":[248,105],"bytes":[6110,6214]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"249:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@249:14","span":{"start":[249,14],"end":[249,51],"bytes":[6228,6265]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath"},"250:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@250:12","span":{"start":[250,12],"end":[250,29],"bytes":[6277,6294]},"callee":"can://litestream/litestream/@external/os/Open"},"252:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@252:10","span":{"start":[252,10],"end":[252,85],"bytes":[6321,6396]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError"},"252:47":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@252:47","span":{"start":[252,47],"end":[252,62],"bytes":[6358,6373]},"callee":null},"252:64":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@252:64","span":{"start":[252,64],"end":[252,79],"bytes":[6375,6390]},"callee":null},"254:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@254:8","span":{"start":[254,8],"end":[254,34],"bytes":[6407,6433]},"callee":null,"is_deferred":true},"256:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@256:15","span":{"start":[256,15],"end":[256,69],"bytes":[6449,6503]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile"},"258:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@258:10","span":{"start":[258,10],"end":[258,47],"bytes":[6530,6567]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"260:2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@260:2","span":{"start":[260,2],"end":[264,21],"bytes":[6572,6707]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"260:2/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile@260:2/2","span":{"start":[260,2],"end":[260,12],"bytes":[6572,6582]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile/github.com/benbjohnson/litestream.Replica.uploadLTXFile.closure_1","kind":"function","span":{"start":[254,1],"end":[254,34],"bytes":[6400,6433]},"signature":"github.com/benbjohnson/litestream.Replica.uploadLTXFile.closure_1","parameters":[],"body":{"254:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile/github.com/benbjohnson/litestream.Replica.uploadLTXFile.closure_1@254:21","span":{"start":[254,21],"end":[254,30],"bytes":[6420,6429]},"callee":"can://litestream/litestream/@external/os/File.Close"}}}}}},"fields":{"AutoRecoverEnabled":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/AutoRecoverEnabled","kind":"field","type":"bool","span":{"start":[68,1],"end":[68,25],"bytes":[1728,1752]}},"Client":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/Client","kind":"field","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[51,1],"end":[51,22],"bytes":[1038,1059]}},"MaxSyncLTXFiles":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/MaxSyncLTXFiles","kind":"field","type":"int","span":{"start":[58,1],"end":[58,21],"bytes":[1259,1279]}},"MonitorEnabled":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/MonitorEnabled","kind":"field","type":"bool","span":{"start":[62,1],"end":[62,21],"bytes":[1423,1443]}},"SyncInterval":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/SyncInterval","kind":"field","type":"time.Duration","span":{"start":[54,1],"end":[54,28],"bytes":[1105,1132]}},"cancel":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/cancel","kind":"field","type":"func()","span":{"start":[48,1],"end":[48,15],"bytes":[972,986]}},"db":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/db","kind":"field","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[36,1],"end":[36,8],"bytes":[665,672]}},"f":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/f","kind":"field","type":"*os.File","span":{"start":[45,1],"end":[45,75],"bytes":[873,947]}},"mu":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/mu","kind":"field","type":"sync.RWMutex","span":{"start":[38,1],"end":[38,18],"bytes":[674,691]}},"muf":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/muf","kind":"field","type":"sync.Mutex","span":{"start":[44,1],"end":[44,16],"bytes":[857,872]}},"pos":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/pos","kind":"field","type":"invalid type","span":{"start":[39,1],"end":[39,44],"bytes":[692,735]}},"syncSem":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/syncSem","kind":"field","type":"invalid type","span":{"start":[41,1],"end":[41,33],"bytes":[737,769]}},"syncWaiters":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/syncWaiters","kind":"field","type":"sync/atomic.Int64","span":{"start":[42,1],"end":[42,86],"bytes":[770,855]}},"wg":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[47,1],"end":[47,23],"bytes":[949,971]}}}},"ValidationError":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ValidationError","kind":"struct","span":{"start":[1774,1],"end":[1780,2],"bytes":[52102,52389]},"callables":{},"fields":{"CurrFile":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ValidationError/CurrFile","kind":"field","type":"invalid type","span":{"start":[1779,1],"end":[1779,58],"bytes":[52330,52387]}},"Level":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ValidationError/Level","kind":"field","type":"int","span":{"start":[1775,1],"end":[1775,44],"bytes":[52132,52175]}},"Message":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ValidationError/Message","kind":"field","type":"string","span":{"start":[1777,1],"end":[1777,54],"bytes":[52235,52288]}},"PrevFile":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ValidationError/PrevFile","kind":"field","type":"invalid type","span":{"start":[1778,1],"end":[1778,41],"bytes":[52289,52329]}},"Type":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ValidationError/Type","kind":"field","type":"string","span":{"start":[1776,1],"end":[1776,59],"bytes":[52176,52234]}}}},"replicaSyncResult":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.replicaSyncResult","kind":"struct","span":{"start":[159,1],"end":[162,2],"bytes":[3832,3893]},"callables":{},"fields":{"limited":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.replicaSyncResult/limited","kind":"field","type":"bool","span":{"start":[161,1],"end":[161,14],"bytes":[3878,3891]}},"synced":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.replicaSyncResult/synced","kind":"field","type":"bool","span":{"start":[160,1],"end":[160,14],"bytes":[3864,3877]}}}},"restoreLevelCursor":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor","kind":"struct","span":{"start":[1632,1],"end":[1641,2],"bytes":[48474,48864]},"callables":{"github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent","kind":"method","span":{"start":[1683,1],"end":[1697,2],"bytes":[49695,50019]},"signature":"github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1688:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent@1688:6","span":{"start":[1688,6],"end":[1688,18],"bytes":[49877,49889]},"callee":null},"1689:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent@1689:13","span":{"start":[1689,13],"end":[1689,24],"bytes":[49904,49915]},"callee":null},"1695:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent@1695:14","span":{"start":[1695,14],"end":[1695,26],"bytes":[49993,50005]},"callee":null}}},"github.com/benbjohnson/litestream.restoreLevelCursor.refresh":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","kind":"method","span":{"start":[1643,1],"end":[1681,2],"bytes":[48866,49693]},"signature":"github.com/benbjohnson/litestream.restoreLevelCursor.refresh","parameters":[{"name":"currentMax","type":"invalid type","span":{"start":[1643,1],"end":[1643,93],"bytes":[48866,48958]}},{"name":"txID","type":"invalid type","span":{"start":[1643,1],"end":[1643,93],"bytes":[48866,48958]}},{"name":"timestamp","type":"time.Time","span":{"start":[1643,1],"end":[1643,93],"bytes":[48866,48958]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"1654:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh@1654:13","span":{"start":[1654,13],"end":[1654,30],"bytes":[49230,49247]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent"},"1673:30":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh@1673:30","span":{"start":[1673,30],"end":[1673,62],"bytes":[49540,49572]},"callee":null},"1673:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh@1673:7","span":{"start":[1673,7],"end":[1673,25],"bytes":[49517,49535]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1677:28":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh@1677:28","span":{"start":[1677,28],"end":[1677,69],"bytes":[49619,49660]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter"}}}},"fields":{"candidate":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/candidate","kind":"field","type":"invalid type","span":{"start":[1638,1],"end":[1638,25],"bytes":[48764,48788]}},"current":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/current","kind":"field","type":"invalid type","span":{"start":[1636,1],"end":[1636,23],"bytes":[48667,48689]}},"done":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/done","kind":"field","type":"bool","span":{"start":[1640,1],"end":[1640,11],"bytes":[48852,48862]}},"itr":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/itr","kind":"field","type":"invalid type","span":{"start":[1634,1],"end":[1634,22],"bytes":[48576,48597]}}}}},"functions":{"github.com/benbjohnson/litestream.CalcRestorePlan":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","kind":"function","span":{"start":[1514,1],"end":[1630,2],"bytes":[45226,48472]},"signature":"github.com/benbjohnson/litestream.CalcRestorePlan","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}},{"name":"txID","type":"invalid type","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}},{"name":"timestamp","type":"time.Time","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[1514,1],"end":[1514,148],"bytes":[45226,45373]}}],"return_type":"([]invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":27},"body":{"1515:19":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1515:19","span":{"start":[1515,19],"end":[1515,37],"bytes":[45392,45410]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1516:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1516:15","span":{"start":[1516,15],"end":[1516,76],"bytes":[45427,45488]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1520:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1520:11","span":{"start":[1520,11],"end":[1520,38],"bytes":[45532,45559]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"1525:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1525:22","span":{"start":[1525,22],"end":[1525,81],"bytes":[45767,45826]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"1525:62":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1525:62","span":{"start":[1525,62],"end":[1525,80],"bytes":[45807,45825]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1529:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1529:6","span":{"start":[1529,6],"end":[1529,24],"bytes":[45870,45888]},"callee":null},"1530:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1530:11","span":{"start":[1530,11],"end":[1530,29],"bytes":[45901,45919]},"callee":null},"1531:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1531:3","span":{"start":[1531,3],"end":[1531,93],"bytes":[45922,46012]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1535:30":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1535:30","span":{"start":[1535,30],"end":[1535,62],"bytes":[46098,46130]},"callee":null},"1535:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1535:7","span":{"start":[1535,7],"end":[1535,25],"bytes":[46075,46093]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1540:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1540:12","span":{"start":[1540,12],"end":[1540,31],"bytes":[46181,46200]},"callee":null},"1544:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1544:3","span":{"start":[1544,3],"end":[1544,95],"bytes":[46260,46352]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1545:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1545:11","span":{"start":[1545,11],"end":[1545,34],"bytes":[46363,46386]},"callee":null},"1551:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1551:15","span":{"start":[1551,15],"end":[1551,30],"bytes":[46583,46598]},"callee":null},"1557:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1557:13","span":{"start":[1557,13],"end":[1557,55],"bytes":[46698,46740]},"callee":null},"1559:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1559:3","span":{"start":[1559,3],"end":[1559,62],"bytes":[46789,46848]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1560:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1560:15","span":{"start":[1560,15],"end":[1560,66],"bytes":[46863,46914]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"1560:47":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1560:47","span":{"start":[1560,47],"end":[1560,65],"bytes":[46895,46913]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1564:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1564:13","span":{"start":[1564,13],"end":[1566,5],"bytes":[46968,47022]},"callee":null},"1568:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1568:8","span":{"start":[1568,8],"end":[1574,5],"bytes":[47033,47139]},"callee":null,"is_deferred":true},"1579:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1579:14","span":{"start":[1579,14],"end":[1579,57],"bytes":[47227,47270]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh"},"1585:22":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1585:22","span":{"start":[1585,22],"end":[1585,78],"bytes":[47381,47437]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter"},"1599:3":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1599:3","span":{"start":[1599,3],"end":[1601,34],"bytes":[47613,47775]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1600:16":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1600:16","span":{"start":[1600,16],"end":[1600,82],"bytes":[47674,47740]},"callee":null},"1602:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1602:11","span":{"start":[1602,11],"end":[1602,40],"bytes":[47786,47815]},"callee":null},"1611:36":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1611:36","span":{"start":[1611,36],"end":[1611,54],"bytes":[47969,47987]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1611:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1611:5","span":{"start":[1611,5],"end":[1611,15],"bytes":[47938,47948]},"callee":null},"1613:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1613:14","span":{"start":[1613,14],"end":[1613,36],"bytes":[48038,48060]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent"},"1617:17":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1617:17","span":{"start":[1617,17],"end":[1617,133],"bytes":[48187,48303]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1622:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1622:5","span":{"start":[1622,5],"end":[1622,15],"bytes":[48321,48331]},"callee":null},"1625:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan@1625:18","span":{"start":[1625,18],"end":[1625,33],"bytes":[48391,48406]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan/github.com/benbjohnson/litestream.CalcRestorePlan.closure_1","kind":"function","span":{"start":[1568,1],"end":[1574,5],"bytes":[47026,47139]},"signature":"github.com/benbjohnson/litestream.CalcRestorePlan.closure_1","parameters":[],"body":{"1571:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan/github.com/benbjohnson/litestream.CalcRestorePlan.closure_1@1571:9","span":{"start":[1571,9],"end":[1571,27],"bytes":[47107,47125]},"callee":null}}}}},"github.com/benbjohnson/litestream.NewReplica":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica","kind":"function","span":{"start":[71,1],"end":[83,2],"bytes":[1756,2005]},"signature":"github.com/benbjohnson/litestream.NewReplica","parameters":[{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[71,1],"end":[71,35],"bytes":[1756,1790]}}],"return_type":"*github.com/benbjohnson/litestream.Replica","metrics":{"cyclomatic":1},"body":{"74:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica@74:12","span":{"start":[74,12],"end":[74,36],"bytes":[1833,1857]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica/github.com/benbjohnson/litestream.NewReplica.closure_1","kind":"function","span":{"start":[75,1],"end":[75,22],"bytes":[1859,1880]},"signature":"github.com/benbjohnson/litestream.NewReplica.closure_1","parameters":[],"body":{}}}},"github.com/benbjohnson/litestream.NewReplicaWithClient":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplicaWithClient","kind":"function","span":{"start":[85,1],"end":[89,2],"bytes":[2007,2125]},"signature":"github.com/benbjohnson/litestream.NewReplicaWithClient","parameters":[{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[85,1],"end":[85,67],"bytes":[2007,2073]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[85,1],"end":[85,67],"bytes":[2007,2073]}}],"return_type":"*github.com/benbjohnson/litestream.Replica","metrics":{"cyclomatic":1},"body":{"86:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplicaWithClient@86:7","span":{"start":[86,7],"end":[86,21],"bytes":[2080,2094]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica"}}},"github.com/benbjohnson/litestream.ReadTXIDFile":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","kind":"function","span":{"start":[1755,1],"end":[1771,2],"bytes":[51644,52043]},"signature":"github.com/benbjohnson/litestream.ReadTXIDFile","parameters":[{"name":"outputPath","type":"string","span":{"start":[1755,1],"end":[1755,57],"bytes":[51644,51700]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1756:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile@1756:14","span":{"start":[1756,14],"end":[1756,34],"bytes":[51714,51734]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.TXIDPath"},"1758:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile@1758:15","span":{"start":[1758,15],"end":[1758,36],"bytes":[51750,51771]},"callee":"can://litestream/litestream/@external/os/ReadFile"},"1759:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile@1759:5","span":{"start":[1759,5],"end":[1759,23],"bytes":[51776,51794]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"1762:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile@1762:13","span":{"start":[1762,13],"end":[1762,50],"bytes":[51849,51886]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1765:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile@1765:15","span":{"start":[1765,15],"end":[1765,61],"bytes":[51905,51951]},"callee":null},"1765:29":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile@1765:29","span":{"start":[1765,29],"end":[1765,60],"bytes":[51919,51950]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"1765:47":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile@1765:47","span":{"start":[1765,47],"end":[1765,59],"bytes":[51937,51949]},"callee":null},"1767:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile@1767:13","span":{"start":[1767,13],"end":[1767,51],"bytes":[51981,52019]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.TXIDPath":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.TXIDPath","kind":"function","span":{"start":[1714,1],"end":[1716,2],"bytes":[50523,50595]},"signature":"github.com/benbjohnson/litestream.TXIDPath","parameters":[{"name":"outputPath","type":"string","span":{"start":[1714,1],"end":[1714,42],"bytes":[50523,50564]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.WriteTXIDFile":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","kind":"function","span":{"start":[1720,1],"end":[1751,2],"bytes":[50732,51511]},"signature":"github.com/benbjohnson/litestream.WriteTXIDFile","parameters":[{"name":"outputPath","type":"string","span":{"start":[1720,1],"end":[1720,61],"bytes":[50732,50792]}},{"name":"txid","type":"invalid type","span":{"start":[1720,1],"end":[1720,61],"bytes":[50732,50792]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"1721:14":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1721:14","span":{"start":[1721,14],"end":[1721,34],"bytes":[50806,50826]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.TXIDPath"},"1724:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1724:12","span":{"start":[1724,12],"end":[1724,30],"bytes":[50869,50887]},"callee":"can://litestream/litestream/@external/os/Create"},"1726:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1726:10","span":{"start":[1726,10],"end":[1726,54],"bytes":[50914,50958]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1728:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1728:8","span":{"start":[1728,8],"end":[1728,17],"bytes":[50969,50978]},"callee":"can://litestream/litestream/@external/os/File.Close","is_deferred":true},"1729:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1729:8","span":{"start":[1729,8],"end":[1729,26],"bytes":[50986,51004]},"callee":"can://litestream/litestream/@external/os/Remove","is_deferred":true},"1731:15":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1731:15","span":{"start":[1731,15],"end":[1731,36],"bytes":[51020,51041]},"callee":"can://litestream/litestream/@external/fmt/Fprintln"},"1732:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1732:10","span":{"start":[1732,10],"end":[1732,43],"bytes":[51065,51098]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1735:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1735:12","span":{"start":[1735,12],"end":[1735,20],"bytes":[51114,51122]},"callee":"can://litestream/litestream/@external/os/File.Sync"},"1736:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1736:10","span":{"start":[1736,10],"end":[1736,47],"bytes":[51146,51183]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1739:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1739:12","span":{"start":[1739,12],"end":[1739,21],"bytes":[51199,51208]},"callee":"can://litestream/litestream/@external/os/File.Close"},"1740:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1740:10","span":{"start":[1740,10],"end":[1740,48],"bytes":[51232,51270]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1743:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1743:12","span":{"start":[1743,12],"end":[1743,40],"bytes":[51286,51314]},"callee":"can://litestream/litestream/@external/os/Rename"},"1744:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1744:10","span":{"start":[1744,10],"end":[1744,49],"bytes":[51338,51377]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1747:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1747:12","span":{"start":[1747,12],"end":[1747,53],"bytes":[51393,51434]},"callee":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir"},"1747:30":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1747:30","span":{"start":[1747,30],"end":[1747,52],"bytes":[51411,51433]},"callee":"can://litestream/litestream/@external/path/filepath/Dir"},"1748:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile@1748:10","span":{"start":[1748,10],"end":[1748,46],"bytes":[51458,51494]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.checkIntegrity":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity","kind":"function","span":{"start":[1332,1],"end":[1366,2],"bytes":[39569,40477]},"signature":"github.com/benbjohnson/litestream.checkIntegrity","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1332,1],"end":[1332,89],"bytes":[39569,39657]}},{"name":"dbPath","type":"string","span":{"start":[1332,1],"end":[1332,89],"bytes":[39569,39657]}},{"name":"mode","type":"github.com/benbjohnson/litestream.IntegrityCheckMode","span":{"start":[1332,1],"end":[1332,89],"bytes":[39569,39657]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"1337:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1337:13","span":{"start":[1337,13],"end":[1337,39],"bytes":[39720,39746]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"1339:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1339:10","span":{"start":[1339,10],"end":[1339,66],"bytes":[39773,39829]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1341:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1341:8","span":{"start":[1341,8],"end":[1341,35],"bytes":[39840,39867]},"callee":null,"is_deferred":true},"1350:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1350:10","span":{"start":[1350,10],"end":[1350,66],"bytes":[40029,40085]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1354:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1354:12","span":{"start":[1354,12],"end":[1354,67],"bytes":[40120,40175]},"callee":"can://litestream/litestream/@external/database/sql/Row.Scan"},"1354:12/2":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1354:12/2","span":{"start":[1354,12],"end":[1354,53],"bytes":[40120,40161]},"callee":"can://litestream/litestream/@external/database/sql/DB.QueryRowContext"},"1355:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1355:10","span":{"start":[1355,10],"end":[1355,48],"bytes":[40199,40237]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1358:10":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1358:10","span":{"start":[1358,10],"end":[1358,58],"bytes":[40271,40319]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1362:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1362:6","span":{"start":[1362,6],"end":[1362,32],"bytes":[40404,40430]},"callee":"can://litestream/litestream/@external/os/Remove"},"1363:6":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity@1363:6","span":{"start":[1363,6],"end":[1363,32],"bytes":[40436,40462]},"callee":"can://litestream/litestream/@external/os/Remove"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity/github.com/benbjohnson/litestream.checkIntegrity.closure_1","kind":"function","span":{"start":[1341,1],"end":[1341,35],"bytes":[39833,39867]},"signature":"github.com/benbjohnson/litestream.checkIntegrity.closure_1","parameters":[],"body":{"1341:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity/github.com/benbjohnson/litestream.checkIntegrity.closure_1@1341:21","span":{"start":[1341,21],"end":[1341,31],"bytes":[39853,39863]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close"}}}}},"github.com/benbjohnson/litestream.checkpointV3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3","kind":"function","span":{"start":[1320,1],"end":[1329,2],"bytes":[39277,39492]},"signature":"github.com/benbjohnson/litestream.checkpointV3","parameters":[{"name":"dbPath","type":"string","span":{"start":[1320,1],"end":[1320,41],"bytes":[39277,39317]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"1321:13":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3@1321:13","span":{"start":[1321,13],"end":[1321,39],"bytes":[39330,39356]},"callee":"can://litestream/litestream/@external/database/sql/Open"},"1325:8":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3@1325:8","span":{"start":[1325,8],"end":[1325,35],"bytes":[39397,39424]},"callee":null,"is_deferred":true},"1327:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3@1327:11","span":{"start":[1327,11],"end":[1327,53],"bytes":[39436,39478]},"callee":"can://litestream/litestream/@external/database/sql/DB.Exec"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3/github.com/benbjohnson/litestream.checkpointV3.closure_1","kind":"function","span":{"start":[1325,1],"end":[1325,35],"bytes":[39390,39424]},"signature":"github.com/benbjohnson/litestream.checkpointV3.closure_1","parameters":[],"body":{"1325:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3/github.com/benbjohnson/litestream.checkpointV3.closure_1@1325:21","span":{"start":[1325,21],"end":[1325,31],"bytes":[39410,39420]},"callee":"can://litestream/litestream/@external/database/sql/DB.Close"}}}}},"github.com/benbjohnson/litestream.filterWALSegmentsV3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3","kind":"function","span":{"start":[1209,1],"end":[1221,2],"bytes":[36015,36369]},"signature":"github.com/benbjohnson/litestream.filterWALSegmentsV3","parameters":[{"name":"segments","type":"[]github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1209,1],"end":[1209,115],"bytes":[36015,36129]}},{"name":"snapshotIndex","type":"int","span":{"start":[1209,1],"end":[1209,115],"bytes":[36015,36129]}},{"name":"timestamp","type":"time.Time","span":{"start":[1209,1],"end":[1209,115],"bytes":[36015,36129]}}],"return_type":"[]github.com/benbjohnson/litestream.WALSegmentInfoV3","metrics":{"cyclomatic":4},"body":{"1215:29":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3@1215:29","span":{"start":[1215,29],"end":[1215,59],"bytes":[36270,36300]},"callee":"can://litestream/litestream/@external/time/Time.After"},"1215:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3@1215:7","span":{"start":[1215,7],"end":[1215,25],"bytes":[36248,36266]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1218:12":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3@1218:12","span":{"start":[1218,12],"end":[1218,31],"bytes":[36330,36349]},"callee":null}}},"github.com/benbjohnson/litestream.findBestSnapshotV3":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3","kind":"function","span":{"start":[1192,1],"end":[1205,2],"bytes":[35554,35889]},"signature":"github.com/benbjohnson/litestream.findBestSnapshotV3","parameters":[{"name":"snapshots","type":"[]github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[1192,1],"end":[1192,91],"bytes":[35554,35644]}},{"name":"timestamp","type":"time.Time","span":{"start":[1192,1],"end":[1192,91],"bytes":[35554,35644]}}],"return_type":"*github.com/benbjohnson/litestream.SnapshotInfoV3","metrics":{"cyclomatic":5},"body":{"1193:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3@1193:5","span":{"start":[1193,5],"end":[1193,19],"bytes":[35649,35663]},"callee":null},"1196:5":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3@1196:5","span":{"start":[1196,5],"end":[1196,23],"bytes":[35691,35709]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"1197:21":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3@1197:21","span":{"start":[1197,21],"end":[1197,35],"bytes":[35732,35746]},"callee":null},"1199:11":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3@1199:11","span":{"start":[1199,11],"end":[1199,25],"bytes":[35763,35777]},"callee":null},"1200:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3@1200:7","span":{"start":[1200,7],"end":[1200,46],"bytes":[35803,35842]},"callee":"can://litestream/litestream/@external/time/Time.After"}}},"github.com/benbjohnson/litestream.restoreCandidateBetter":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter","kind":"function","span":{"start":[1699,1],"end":[1710,2],"bytes":[50021,50346]},"signature":"github.com/benbjohnson/litestream.restoreCandidateBetter","parameters":[{"name":"curr","type":"invalid type","span":{"start":[1699,1],"end":[1699,61],"bytes":[50021,50081]}},{"name":"next","type":"invalid type","span":{"start":[1699,1],"end":[1699,61],"bytes":[50021,50081]}}],"return_type":"bool","metrics":{"cyclomatic":4},"body":{"1709:9":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter@1709:9","span":{"start":[1709,9],"end":[1709,46],"bytes":[50307,50344]},"callee":null}}},"github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt":{"id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","kind":"function","span":{"start":[1179,1],"end":[1187,2],"bytes":[35080,35361]},"signature":"github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","parameters":[{"name":"snapshots","type":"[]github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[1179,1],"end":[1179,62],"bytes":[35080,35141]}}],"metrics":{"cyclomatic":4},"body":{"1180:18":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt@1180:18","span":{"start":[1180,18],"end":[1180,32],"bytes":[35159,35173]},"callee":null},"1181:23":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt@1181:23","span":{"start":[1181,23],"end":[1181,37],"bytes":[35205,35219]},"callee":null},"1182:7":{"kind":"call","id":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt@1182:7","span":{"start":[1182,7],"end":[1182,59],"bytes":[35233,35285]},"callee":"can://litestream/litestream/@external/time/Time.After"}}}},"content_hash":"5dfbbc9a3eb6bbfb1922a8a17a47af6481e11432b2aeb8915dc60beec8f394db"},"replica_client.go":{"id":"can://litestream/litestream/go/replica_client.go","kind":"module","span":{"start":[1,1],"end":[168,1],"bytes":[0,6022]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\n\t\"github.com/superfly/ltx\"\n)\n\nvar ErrStopIter = errors.New(\"stop iterator\")\n\n// ReplicaClient represents client to connect to a Replica.\ntype ReplicaClient interface {\n\t// Type returns the type of client.\n\tType() string\n\n\t// Init initializes the replica client connection.\n\t// This may establish connections, validate configuration, etc.\n\t// Implementations should be idempotent (no-op if already initialized).\n\tInit(ctx context.Context) error\n\n\t// LTXFiles returns an iterator of all LTX files on the replica for a given level.\n\t// If seek is specified, the iterator start from the given TXID or the next available if not found.\n\t// If useMetadata is true, the iterator fetches accurate timestamps from metadata for timestamp-based restore.\n\t// When false, the iterator uses fast timestamps (LastModified/Created/ModTime) for normal operations.\n\tLTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error)\n\n\t// OpenLTXFile returns a reader that contains an LTX file at a given TXID.\n\t// If seek is specified, the reader will start at the given offset.\n\t// Returns an os.ErrNotFound error if the LTX file does not exist.\n\tOpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error)\n\n\t// WriteLTXFile writes an LTX file to the replica.\n\t// Returns metadata for the written file.\n\tWriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error)\n\n\t// DeleteLTXFiles deletes one or more LTX files.\n\tDeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error\n\n\t// DeleteAll deletes all files.\n\tDeleteAll(ctx context.Context) error\n\n\t// SetLogger sets the logger for the client.\n\tSetLogger(logger *slog.Logger)\n}\n\n// FindLTXFiles returns a list of files that match filter.\n// The useMetadata parameter is passed through to LTXFiles to control whether accurate timestamps\n// are fetched from metadata. When true (timestamp-based restore), accurate timestamps are required.\n// When false (normal operations), fast timestamps are sufficient.\nfunc FindLTXFiles(ctx context.Context, client ReplicaClient, level int, useMetadata bool, filter func(*ltx.FileInfo) (bool, error)) ([]*ltx.FileInfo, error) {\n\titr, err := client.LTXFiles(ctx, level, 0, useMetadata)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer func() { _ = itr.Close() }()\n\n\tvar a []*ltx.FileInfo\n\tfor itr.Next() {\n\t\titem := itr.Item()\n\n\t\tmatch, err := filter(item)\n\t\tif match {\n\t\t\ta = append(a, item)\n\t\t}\n\n\t\tif errors.Is(err, ErrStopIter) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn a, err\n\t\t}\n\t}\n\n\tif err := itr.Close(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn a, nil\n}\n\n// DefaultEstimatedPageIndexSize is size that is first fetched when fetching the page index.\n// If the fetch was smaller than the actual page index, another call is made to fetch the rest.\nconst DefaultEstimatedPageIndexSize = 32 * 1024 // 32KB\n\nfunc FetchPageIndex(ctx context.Context, client ReplicaClient, info *ltx.FileInfo) (map[uint32]ltx.PageIndexElem, error) {\n\trc, err := fetchPageIndexData(ctx, client, info)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rc.Close()\n\n\treturn ltx.DecodePageIndex(bufio.NewReader(rc), info.Level, info.MinTXID, info.MaxTXID)\n}\n\n// FetchLTXHeader reads \u0026 returns the LTX header for the given file info.\nfunc FetchLTXHeader(ctx context.Context, client ReplicaClient, info *ltx.FileInfo) (ltx.Header, error) {\n\trc, err := client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, 0, ltx.HeaderSize)\n\tif err != nil {\n\t\treturn ltx.Header{}, fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\tdefer rc.Close()\n\thdr, _, err := ltx.PeekHeader(rc)\n\tif err != nil {\n\t\treturn ltx.Header{}, fmt.Errorf(\"peek header: %w\", err)\n\t}\n\treturn hdr, nil\n}\n\n// fetchPageIndexData fetches a chunk of the end of the file to get the page index.\n// If the fetch was smaller than the actual page index, another call is made to fetch the rest.\nfunc fetchPageIndexData(ctx context.Context, client ReplicaClient, info *ltx.FileInfo) (io.ReadCloser, error) {\n\t// Fetch the end of the file to get the page index.\n\toffset := info.Size - DefaultEstimatedPageIndexSize\n\tif offset \u003c 0 {\n\t\toffset = 0\n\t}\n\n\tf, err := client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, offset, 0)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\tdefer f.Close()\n\n\t// If we have read the full size of the page index, return the page index block as a reader.\n\tb, err := io.ReadAll(f)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"read ltx page index: %w\", err)\n\t}\n\t// The replica may return fewer bytes than a page index footer occupies, for\n\t// example if the file is truncated or otherwise corrupt. Slicing the footer\n\t// off the end unchecked would index past the start of the buffer and panic.\n\tif len(b) \u003c ltx.TrailerSize+8 {\n\t\treturn nil, fmt.Errorf(\"ltx file too short to contain a page index: %d bytes\", len(b))\n\t}\n\n\tsize := binary.BigEndian.Uint64(b[len(b)-ltx.TrailerSize-8:])\n\tif off := len(b) - int(size) - ltx.TrailerSize - 8; off \u003e 0 {\n\t\treturn io.NopCloser(bytes.NewReader(b[off:])), nil\n\t}\n\n\t// Otherwise read the file from the start of the page index.\n\tf, err = client.OpenLTXFile(ctx, info.Level, info.MinTXID, info.MaxTXID, info.Size-ltx.TrailerSize-8-int64(size), 0)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\treturn f, nil\n}\n\n// FetchPage fetches and decodes a single page frame from an LTX file.\nfunc FetchPage(ctx context.Context, client ReplicaClient, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (ltx.PageHeader, []byte, error) {\n\tf, err := client.OpenLTXFile(ctx, level, minTXID, maxTXID, offset, size)\n\tif err != nil {\n\t\treturn ltx.PageHeader{}, nil, fmt.Errorf(\"open ltx file: %w\", err)\n\t}\n\tdefer f.Close()\n\n\tb, err := io.ReadAll(f)\n\tif err != nil {\n\t\treturn ltx.PageHeader{}, nil, fmt.Errorf(\"read ltx page frame: %w\", err)\n\t}\n\treturn ltx.DecodePageData(b)\n}\n","imports":[{"name":"bufio","path":"bufio","span":{"start":[4,1],"end":[4,9],"bytes":[29,37]}},{"name":"bytes","path":"bytes","span":{"start":[5,1],"end":[5,9],"bytes":[38,46]}},{"name":"context","path":"context","span":{"start":[6,1],"end":[6,11],"bytes":[47,57]}},{"name":"binary","path":"encoding/binary","span":{"start":[7,1],"end":[7,19],"bytes":[58,76]}},{"name":"errors","path":"errors","span":{"start":[8,1],"end":[8,10],"bytes":[77,86]}},{"name":"fmt","path":"fmt","span":{"start":[9,1],"end":[9,7],"bytes":[87,93]}},{"name":"io","path":"io","span":{"start":[10,1],"end":[10,6],"bytes":[94,99]}},{"name":"slog","path":"log/slog","span":{"start":[11,1],"end":[11,12],"bytes":[100,111]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[13,1],"end":[13,27],"bytes":[113,139]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient","kind":"interface","span":{"start":[19,1],"end":[51,2],"bytes":[250,1859]},"callables":{"github.com/benbjohnson/litestream.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteAll","kind":"method","span":{"start":[47,1],"end":[47,38],"bytes":[1741,1778]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[47,1],"end":[47,38],"bytes":[1741,1778]}}],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[44,1],"end":[44,62],"bytes":[1645,1706]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[44,1],"end":[44,62],"bytes":[1645,1706]}},{"name":"a","type":"[]invalid type","span":{"start":[44,1],"end":[44,62],"bytes":[1645,1706]}}],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.Init":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Init","kind":"method","span":{"start":[26,1],"end":[26,33],"bytes":[524,556]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[26,1],"end":[26,33],"bytes":[524,556]}}],"return_type":"error","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","kind":"method","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]}},{"name":"level","type":"int","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]}},{"name":"seek","type":"invalid type","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]}},{"name":"useMetadata","type":"bool","span":{"start":[32,1],"end":[32,101],"bytes":[959,1059]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"level","type":"int","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"minTXID","type":"invalid type","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"maxTXID","type":"invalid type","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"offset","type":"int64","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}},{"name":"size","type":"int64","span":{"start":[37,1],"end":[37,115],"bytes":[1274,1388]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger","kind":"method","span":{"start":[50,1],"end":[50,32],"bytes":[1826,1857]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[50,1],"end":[50,32],"bytes":[1826,1857]}}],"body":{}},"github.com/benbjohnson/litestream.ReplicaClient.Type":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","kind":"method","span":{"start":[21,1],"end":[21,15],"bytes":[318,332]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.Type","parameters":[],"return_type":"string","body":{}},"github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]},"signature":"github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}},{"name":"level","type":"int","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}},{"name":"minTXID","type":"invalid type","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}},{"name":"maxTXID","type":"invalid type","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}},{"name":"r","type":"io.Reader","span":{"start":[41,1],"end":[41,109],"bytes":[1485,1593]}}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{}}}}},"functions":{"github.com/benbjohnson/litestream.FetchLTXHeader":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader","kind":"function","span":{"start":[101,1],"end":[112,2],"bytes":[3422,3851]},"signature":"github.com/benbjohnson/litestream.FetchLTXHeader","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[101,1],"end":[101,105],"bytes":[3422,3526]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[101,1],"end":[101,105],"bytes":[3422,3526]}},{"name":"info","type":"invalid type","span":{"start":[101,1],"end":[101,105],"bytes":[3422,3526]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"102:13":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader@102:13","span":{"start":[102,13],"end":[102,95],"bytes":[3539,3621]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"104:24":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader@104:24","span":{"start":[104,24],"end":[104,60],"bytes":[3662,3698]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"106:8":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader@106:8","span":{"start":[106,8],"end":[106,18],"bytes":[3709,3719]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"107:17":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader@107:17","span":{"start":[107,17],"end":[107,35],"bytes":[3736,3754]},"callee":null},"109:24":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader@109:24","span":{"start":[109,24],"end":[109,58],"bytes":[3795,3829]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.FetchPage":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage","kind":"function","span":{"start":[155,1],"end":[167,2],"bytes":[5539,6021]},"signature":"github.com/benbjohnson/litestream.FetchPage","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"level","type":"int","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"minTXID","type":"invalid type","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"maxTXID","type":"invalid type","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"offset","type":"int64","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}},{"name":"size","type":"int64","span":{"start":[155,1],"end":[155,150],"bytes":[5539,5688]}}],"return_type":"(invalid type, []byte, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"156:12":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage@156:12","span":{"start":[156,12],"end":[156,74],"bytes":[5700,5762]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"158:33":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage@158:33","span":{"start":[158,33],"end":[158,69],"bytes":[5812,5848]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"160:8":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage@160:8","span":{"start":[160,8],"end":[160,17],"bytes":[5859,5868]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"162:12":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage@162:12","span":{"start":[162,12],"end":[162,25],"bytes":[5881,5894]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"164:33":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage@164:33","span":{"start":[164,33],"end":[164,75],"bytes":[5944,5986]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"166:9":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage@166:9","span":{"start":[166,9],"end":[166,30],"bytes":[5998,6019]},"callee":null}}},"github.com/benbjohnson/litestream.FetchPageIndex":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex","kind":"function","span":{"start":[90,1],"end":[98,2],"bytes":[3026,3346]},"signature":"github.com/benbjohnson/litestream.FetchPageIndex","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[90,1],"end":[90,123],"bytes":[3026,3148]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[90,1],"end":[90,123],"bytes":[3026,3148]}},{"name":"info","type":"invalid type","span":{"start":[90,1],"end":[90,123],"bytes":[3026,3148]}}],"return_type":"(map[uint32]invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"91:13":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex@91:13","span":{"start":[91,13],"end":[91,50],"bytes":[3161,3198]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData"},"95:8":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex@95:8","span":{"start":[95,8],"end":[95,18],"bytes":[3244,3254]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"97:29":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex@97:29","span":{"start":[97,29],"end":[97,48],"bytes":[3284,3303]},"callee":"can://litestream/litestream/@external/bufio/NewReader"},"97:9":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex@97:9","span":{"start":[97,9],"end":[97,89],"bytes":[3264,3344]},"callee":null}}},"github.com/benbjohnson/litestream.FindLTXFiles":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles","kind":"function","span":{"start":[57,1],"end":[84,2],"bytes":[2186,2778]},"signature":"github.com/benbjohnson/litestream.FindLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}},{"name":"level","type":"int","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}},{"name":"useMetadata","type":"bool","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}},{"name":"filter","type":"func(invalid type) (bool, error)","span":{"start":[57,1],"end":[57,159],"bytes":[2186,2344]}}],"return_type":"([]invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"58:14":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles@58:14","span":{"start":[58,14],"end":[58,57],"bytes":[2358,2401]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles"},"62:8":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles@62:8","span":{"start":[62,8],"end":[62,36],"bytes":[2447,2475]},"callee":null,"is_deferred":true},"65:6":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles@65:6","span":{"start":[65,6],"end":[65,16],"bytes":[2505,2515]},"callee":null},"66:11":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles@66:11","span":{"start":[66,11],"end":[66,21],"bytes":[2528,2538]},"callee":null},"68:17":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles@68:17","span":{"start":[68,17],"end":[68,29],"bytes":[2556,2568]},"callee":null},"70:8":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles@70:8","span":{"start":[70,8],"end":[70,23],"bytes":[2589,2604]},"callee":null},"73:6":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles@73:6","span":{"start":[73,6],"end":[73,33],"bytes":[2615,2642]},"callee":"can://litestream/litestream/@external/errors/Is"},"80:12":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles@80:12","span":{"start":[80,12],"end":[80,23],"bytes":[2715,2726]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles/github.com/benbjohnson/litestream.FindLTXFiles.closure_1","kind":"function","span":{"start":[62,1],"end":[62,36],"bytes":[2440,2475]},"signature":"github.com/benbjohnson/litestream.FindLTXFiles.closure_1","parameters":[],"body":{"62:21":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles/github.com/benbjohnson/litestream.FindLTXFiles.closure_1@62:21","span":{"start":[62,21],"end":[62,32],"bytes":[2460,2471]},"callee":null}}}}},"github.com/benbjohnson/litestream.fetchPageIndexData":{"id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","kind":"function","span":{"start":[116,1],"end":[152,2],"bytes":[4033,5466]},"signature":"github.com/benbjohnson/litestream.fetchPageIndexData","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[116,1],"end":[116,112],"bytes":[4033,4144]}},{"name":"client","type":"github.com/benbjohnson/litestream.ReplicaClient","span":{"start":[116,1],"end":[116,112],"bytes":[4033,4144]}},{"name":"info","type":"invalid type","span":{"start":[116,1],"end":[116,112],"bytes":[4033,4144]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"123:12":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@123:12","span":{"start":[123,12],"end":[123,86],"bytes":[4296,4370]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"125:15":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@125:15","span":{"start":[125,15],"end":[125,51],"bytes":[4402,4438]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"127:8":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@127:8","span":{"start":[127,8],"end":[127,17],"bytes":[4449,4458]},"callee":"can://litestream/litestream/@external/io/Closer.Close","is_deferred":true},"130:12":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@130:12","span":{"start":[130,12],"end":[130,25],"bytes":[4565,4578]},"callee":"can://litestream/litestream/@external/io/ReadAll"},"132:15":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@132:15","span":{"start":[132,15],"end":[132,57],"bytes":[4610,4652]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"137:5":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@137:5","span":{"start":[137,5],"end":[137,11],"bytes":[4894,4900]},"callee":null},"138:15":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@138:15","span":{"start":[138,15],"end":[138,89],"bytes":[4937,5011]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"138:82":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@138:82","span":{"start":[138,82],"end":[138,88],"bytes":[5004,5010]},"callee":null},"141:10":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@141:10","span":{"start":[141,10],"end":[141,63],"bytes":[5025,5078]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint64"},"141:36":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@141:36","span":{"start":[141,36],"end":[141,42],"bytes":[5051,5057]},"callee":null},"142:12":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@142:12","span":{"start":[142,12],"end":[142,18],"bytes":[5090,5096]},"callee":null},"142:21":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@142:21","span":{"start":[142,21],"end":[142,30],"bytes":[5099,5108]},"callee":null},"143:10":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@143:10","span":{"start":[143,10],"end":[143,48],"bytes":[5151,5189]},"callee":"can://litestream/litestream/@external/io/NopCloser"},"143:23":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@143:23","span":{"start":[143,23],"end":[143,47],"bytes":[5164,5188]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"147:103":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@147:103","span":{"start":[147,103],"end":[147,114],"bytes":[5363,5374]},"callee":null},"147:11":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@147:11","span":{"start":[147,11],"end":[147,118],"bytes":[5271,5378]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile"},"149:15":{"kind":"call","id":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData@149:15","span":{"start":[149,15],"end":[149,51],"bytes":[5410,5446]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}}},"content_hash":"c57b00cfbdeb7e706a61acbdf3ca4d50075167c197082d38eea328b42a7388cb"},"replica_url.go":{"id":"can://litestream/litestream/go/replica_url.go","kind":"module","span":{"start":[1,1],"end":[441,1],"bytes":[0,12872]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"path\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n)\n\n// ReplicaClientFactory is a function that creates a ReplicaClient from URL components.\n// The userinfo parameter contains credentials from the URL (e.g., user:pass@host).\ntype ReplicaClientFactory func(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (ReplicaClient, error)\n\nvar (\n\treplicaClientFactories = make(map[string]ReplicaClientFactory)\n\treplicaClientFactoriesMu sync.RWMutex\n)\n\n// RegisterReplicaClientFactory registers a factory function for creating replica clients\n// for a given URL scheme. This is typically called from init() functions in backend packages.\nfunc RegisterReplicaClientFactory(scheme string, factory ReplicaClientFactory) {\n\treplicaClientFactoriesMu.Lock()\n\tdefer replicaClientFactoriesMu.Unlock()\n\treplicaClientFactories[scheme] = factory\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from a URL string.\n// The URL scheme determines which backend is used (s3, gs, abs, file, etc.).\nfunc NewReplicaClientFromURL(rawURL string) (ReplicaClient, error) {\n\tscheme, host, urlPath, query, userinfo, err := ParseReplicaURLWithQuery(rawURL)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Normalize webdavs to webdav\n\tfactoryScheme := scheme\n\tif factoryScheme == \"webdavs\" {\n\t\tfactoryScheme = \"webdav\"\n\t}\n\n\treplicaClientFactoriesMu.RLock()\n\tfactory, ok := replicaClientFactories[factoryScheme]\n\treplicaClientFactoriesMu.RUnlock()\n\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unsupported replica URL scheme: %q\", scheme)\n\t}\n\n\treturn factory(scheme, host, urlPath, query, userinfo)\n}\n\n// ReplicaTypeFromURL returns the replica type from a URL string.\n// Returns empty string if the URL is invalid or has no scheme.\nfunc ReplicaTypeFromURL(rawURL string) string {\n\tif !IsURL(rawURL) {\n\t\treturn \"\"\n\t}\n\tscheme, _, _, _ := ParseReplicaURL(rawURL)\n\tif scheme == \"\" {\n\t\treturn \"\"\n\t}\n\tif scheme == \"webdavs\" {\n\t\treturn \"webdav\"\n\t}\n\treturn scheme\n}\n\n// ParseReplicaURL parses a replica URL and returns the scheme, host, and path.\nfunc ParseReplicaURL(s string) (scheme, host, urlPath string, err error) {\n\tif strings.HasPrefix(strings.ToLower(s), \"s3://arn:\") {\n\t\tscheme, host, urlPath, _, err = parseS3AccessPointURL(s)\n\t\treturn scheme, host, urlPath, err\n\t}\n\n\tscheme, host, urlPath, _, _, err = ParseReplicaURLWithQuery(s)\n\treturn scheme, host, urlPath, err\n}\n\n// ParseReplicaURLWithQuery parses a replica URL and returns query parameters and userinfo.\nfunc ParseReplicaURLWithQuery(s string) (scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo, err error) {\n\t// Handle S3 Access Point ARNs which can't be parsed by standard url.Parse\n\tif strings.HasPrefix(strings.ToLower(s), \"s3://arn:\") {\n\t\tscheme, host, urlPath, query, err := parseS3AccessPointURL(s)\n\t\treturn scheme, host, urlPath, query, nil, err\n\t}\n\n\tu, err := url.Parse(s)\n\tif err != nil {\n\t\treturn \"\", \"\", \"\", nil, nil, err\n\t}\n\n\tswitch u.Scheme {\n\tcase \"file\":\n\t\tscheme, u.Scheme = u.Scheme, \"\"\n\t\t// Remove query params from path for file URLs\n\t\tu.RawQuery = \"\"\n\t\treturn scheme, \"\", path.Clean(u.String()), nil, nil, nil\n\n\tcase \"\":\n\t\treturn u.Scheme, u.Host, u.Path, nil, nil, fmt.Errorf(\"replica url scheme required: %s\", s)\n\n\tdefault:\n\t\treturn u.Scheme, u.Host, strings.TrimPrefix(path.Clean(u.Path), \"/\"), u.Query(), u.User, nil\n\t}\n}\n\n// parseS3AccessPointURL parses an S3 Access Point URL (s3://arn:...).\nfunc parseS3AccessPointURL(s string) (scheme, host, urlPath string, query url.Values, err error) {\n\tconst prefix = \"s3://\"\n\tif !strings.HasPrefix(strings.ToLower(s), prefix) {\n\t\treturn \"\", \"\", \"\", nil, fmt.Errorf(\"invalid s3 access point url: %s\", s)\n\t}\n\n\tarnWithPath := s[len(prefix):]\n\n\t// Split off query string if present\n\tvar queryStr string\n\tif idx := strings.IndexByte(arnWithPath, '?'); idx != -1 {\n\t\tqueryStr = arnWithPath[idx+1:]\n\t\tarnWithPath = arnWithPath[:idx]\n\t}\n\n\tbucket, key, err := splitS3AccessPointARN(arnWithPath)\n\tif err != nil {\n\t\treturn \"\", \"\", \"\", nil, err\n\t}\n\n\t// Parse query string if present\n\tif queryStr != \"\" {\n\t\tquery, err = url.ParseQuery(queryStr)\n\t\tif err != nil {\n\t\t\treturn \"\", \"\", \"\", nil, fmt.Errorf(\"parse query string: %w\", err)\n\t\t}\n\t}\n\n\treturn \"s3\", bucket, CleanReplicaURLPath(key), query, nil\n}\n\n// splitS3AccessPointARN splits an S3 Access Point ARN into bucket and key components.\nfunc splitS3AccessPointARN(s string) (bucket, key string, err error) {\n\tlower := strings.ToLower(s)\n\tconst marker = \":accesspoint/\"\n\tidx := strings.Index(lower, marker)\n\tif idx == -1 {\n\t\treturn \"\", \"\", fmt.Errorf(\"invalid s3 access point arn: %s\", s)\n\t}\n\n\tnameStart := idx + len(marker)\n\tif nameStart \u003e= len(s) {\n\t\treturn \"\", \"\", fmt.Errorf(\"invalid s3 access point arn: %s\", s)\n\t}\n\n\tremainder := s[nameStart:]\n\tslashIdx := strings.IndexByte(remainder, '/')\n\tif slashIdx == -1 {\n\t\treturn s, \"\", nil\n\t}\n\n\tbucketEnd := nameStart + slashIdx\n\tbucket = s[:bucketEnd]\n\tkey = remainder[slashIdx+1:]\n\treturn bucket, key, nil\n}\n\n// CleanReplicaURLPath cleans a URL path for use in replica storage.\nfunc CleanReplicaURLPath(p string) string {\n\tif p == \"\" {\n\t\treturn \"\"\n\t}\n\tcleaned := path.Clean(\"/\" + p)\n\tcleaned = strings.TrimPrefix(cleaned, \"/\")\n\tif cleaned == \".\" {\n\t\treturn \"\"\n\t}\n\treturn cleaned\n}\n\n// RegionFromS3ARN extracts the region from an S3 ARN.\nfunc RegionFromS3ARN(arn string) string {\n\tparts := strings.SplitN(arn, \":\", 6)\n\tif len(parts) \u003e= 4 {\n\t\treturn parts[3]\n\t}\n\treturn \"\"\n}\n\n// BoolQueryValue returns a boolean value from URL query parameters.\n// It checks multiple keys in order and returns the value and whether it was set.\nfunc BoolQueryValue(query url.Values, keys ...string) (value bool, ok bool) {\n\tif query == nil {\n\t\treturn false, false\n\t}\n\tfor _, key := range keys {\n\t\tif raw := query.Get(key); raw != \"\" {\n\t\t\tswitch strings.ToLower(raw) {\n\t\t\tcase \"true\", \"1\", \"t\", \"yes\":\n\t\t\t\treturn true, true\n\t\t\tcase \"false\", \"0\", \"f\", \"no\":\n\t\t\t\treturn false, true\n\t\t\tdefault:\n\t\t\t\treturn false, true\n\t\t\t}\n\t\t}\n\t}\n\treturn false, false\n}\n\n// IntQueryValue returns a positive integer value from URL query parameters.\n// It checks keys in order and returns the value and whether it was set.\n// Returns an error if a present value is not a positive integer.\nfunc IntQueryValue(query url.Values, keys ...string) (value int64, ok bool, err error) {\n\tif query == nil {\n\t\treturn 0, false, nil\n\t}\n\tfor _, key := range keys {\n\t\tif raw := query.Get(key); raw != \"\" {\n\t\t\tn, err := strconv.ParseInt(raw, 10, 64)\n\t\t\tif err != nil || n \u003c= 0 {\n\t\t\t\treturn 0, false, fmt.Errorf(\"invalid value for query parameter %q: %q (must be a positive integer)\", key, raw)\n\t\t\t}\n\t\t\treturn n, true, nil\n\t\t}\n\t}\n\treturn 0, false, nil\n}\n\n// IsHetznerEndpoint returns true if the endpoint is Hetzner object storage service.\nfunc IsHetznerEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".your-objectstorage.com\")\n}\n\n// IsTigrisEndpoint returns true if the endpoint is the Tigris object storage service.\nfunc IsTigrisEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn host == \"fly.storage.tigris.dev\" || host == \"t3.storage.dev\"\n}\n\n// IsGoogleCloudStorageEndpoint returns true if the endpoint is Google Cloud Storage.\nfunc IsGoogleCloudStorageEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\thost = strings.TrimSuffix(host, \".\")\n\n\tlabels := strings.Split(host, \".\")\n\tif len(labels) \u003c 3 ||\n\t\tlabels[len(labels)-2] != \"googleapis\" ||\n\t\tlabels[len(labels)-1] != \"com\" {\n\t\treturn false\n\t}\n\tfor _, label := range labels {\n\t\tif label == \"\" {\n\t\t\treturn false\n\t\t}\n\t}\n\tif len(labels) \u003e 3 {\n\t\tfor _, segment := range strings.Split(labels[1], \"-\") {\n\t\t\tif segment == \"storage\" {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\tfor _, segment := range strings.Split(labels[0], \"-\") {\n\t\tif segment == \"storage\" {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// IsDigitalOceanEndpoint returns true if the endpoint is Digital Ocean Spaces.\nfunc IsDigitalOceanEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".digitaloceanspaces.com\")\n}\n\n// IsBackblazeEndpoint returns true if the endpoint is Backblaze B2.\nfunc IsBackblazeEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".backblazeb2.com\")\n}\n\n// IsFilebaseEndpoint returns true if the endpoint is Filebase.\nfunc IsFilebaseEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn host == \"s3.filebase.com\"\n}\n\n// IsScalewayEndpoint returns true if the endpoint is Scaleway Object Storage.\nfunc IsScalewayEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".scw.cloud\")\n}\n\n// IsCloudflareR2Endpoint returns true if the endpoint is Cloudflare R2.\nfunc IsCloudflareR2Endpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".r2.cloudflarestorage.com\")\n}\n\n// IsSupabaseEndpoint returns true if the endpoint is Supabase Storage S3.\nfunc IsSupabaseEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\treturn strings.HasSuffix(host, \".supabase.co\")\n}\n\n// IsMinIOEndpoint returns true if the endpoint appears to be MinIO or similar\n// (a custom endpoint with a port number that is not a known cloud provider).\nfunc IsMinIOEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\tif u.Port() == \"\" {\n\t\treturn false\n\t}\n\t// Exclude known cloud providers\n\tif strings.Contains(host, \".amazonaws.com\") ||\n\t\tstrings.Contains(host, \".digitaloceanspaces.com\") ||\n\t\tstrings.Contains(host, \".backblazeb2.com\") ||\n\t\tstrings.Contains(host, \".filebase.com\") ||\n\t\tstrings.Contains(host, \".scw.cloud\") ||\n\t\tstrings.Contains(host, \".r2.cloudflarestorage.com\") ||\n\t\tstrings.Contains(host, \"tigris.dev\") ||\n\t\tstrings.Contains(host, \"t3.storage.dev\") ||\n\t\tstrings.Contains(host, \".supabase.co\") ||\n\t\tstrings.HasSuffix(host, \".your-objectstorage.com\") ||\n\t\tstrings.HasSuffix(host, \".googleapis.com\") {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// IsLocalEndpoint returns true if the endpoint appears to be a local development\n// endpoint (localhost, 127.0.0.1, or private network addresses).\n// These endpoints typically use HTTP instead of HTTPS.\nfunc IsLocalEndpoint(endpoint string) bool {\n\tu, err := parseEndpoint(endpoint)\n\tif err != nil {\n\t\treturn false\n\t}\n\thost := u.Hostname()\n\t// Check for common local/development hostnames\n\treturn host == \"localhost\" ||\n\t\thost == \"127.0.0.1\" ||\n\t\tstrings.HasPrefix(host, \"192.168.\") ||\n\t\tstrings.HasPrefix(host, \"10.\") ||\n\t\tstrings.HasPrefix(host, \"172.16.\") ||\n\t\tstrings.HasPrefix(host, \"172.17.\") ||\n\t\tstrings.HasPrefix(host, \"172.18.\") ||\n\t\tstrings.HasPrefix(host, \"172.19.\") ||\n\t\tstrings.HasPrefix(host, \"172.2\") || // 172.20-172.29\n\t\tstrings.HasPrefix(host, \"172.30.\") ||\n\t\tstrings.HasPrefix(host, \"172.31.\") ||\n\t\tstrings.HasSuffix(host, \".local\") ||\n\t\tstrings.HasSuffix(host, \".localhost\")\n}\n\n// EnsureEndpointScheme ensures an endpoint has an HTTP(S) scheme.\n// For local endpoints (localhost, private IPs), it defaults to http://.\n// For all other endpoints (cloud providers), it defaults to https://.\n// Returns the endpoint with scheme and a boolean indicating if a scheme was added.\nfunc EnsureEndpointScheme(endpoint string) (string, bool) {\n\tif endpoint == \"\" {\n\t\treturn \"\", false\n\t}\n\tif strings.HasPrefix(endpoint, \"http://\") || strings.HasPrefix(endpoint, \"https://\") {\n\t\treturn endpoint, false\n\t}\n\t// Default to HTTP for local development endpoints, HTTPS for everything else\n\tif IsLocalEndpoint(endpoint) {\n\t\treturn \"http://\" + endpoint, true\n\t}\n\treturn \"https://\" + endpoint, true\n}\n\nfunc parseEndpoint(endpoint string) (*url.URL, error) {\n\tendpoint = strings.TrimSpace(endpoint)\n\tif !strings.HasPrefix(strings.ToLower(endpoint), \"http://\") \u0026\u0026 !strings.HasPrefix(strings.ToLower(endpoint), \"https://\") {\n\t\tendpoint = \"//\" + endpoint\n\t}\n\tu, err := url.Parse(endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif u.User != nil {\n\t\treturn nil, fmt.Errorf(\"endpoint must not contain user information\")\n\t}\n\tif u.Hostname() == \"\" {\n\t\treturn nil, fmt.Errorf(\"endpoint hostname required\")\n\t}\n\tu.Host = strings.ToLower(u.Host)\n\treturn u, nil\n}\n\n// IsURL returns true if s appears to be a URL (has a scheme).\nvar isURLRegex = regexp.MustCompile(`^\\w+:\\/\\/`)\n\nfunc IsURL(s string) bool {\n\treturn isURLRegex.MatchString(s)\n}\n","imports":[{"name":"fmt","path":"fmt","span":{"start":[4,1],"end":[4,7],"bytes":[29,35]}},{"name":"url","path":"net/url","span":{"start":[5,1],"end":[5,11],"bytes":[36,46]}},{"name":"path","path":"path","span":{"start":[6,1],"end":[6,8],"bytes":[47,54]}},{"name":"regexp","path":"regexp","span":{"start":[7,1],"end":[7,10],"bytes":[55,64]}},{"name":"strconv","path":"strconv","span":{"start":[8,1],"end":[8,11],"bytes":[65,75]}},{"name":"strings","path":"strings","span":{"start":[9,1],"end":[9,11],"bytes":[76,86]}},{"name":"sync","path":"sync","span":{"start":[10,1],"end":[10,8],"bytes":[87,94]}}],"types":{"ReplicaClientFactory":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ReplicaClientFactory","kind":"defined","span":{"start":[15,1],"end":[15,126],"bytes":[270,395]},"callables":{}}},"functions":{"github.com/benbjohnson/litestream.BoolQueryValue":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue","kind":"function","span":{"start":[192,1],"end":[209,2],"bytes":[5585,5988]},"signature":"github.com/benbjohnson/litestream.BoolQueryValue","parameters":[{"name":"query","type":"net/url.Values","span":{"start":[192,1],"end":[192,78],"bytes":[5585,5662]}},{"name":"keys","type":"[]string","span":{"start":[192,1],"end":[192,78],"bytes":[5585,5662]},"is_variadic":true}],"return_type":"(bool, bool)","metrics":{"cyclomatic":8},"body":{"197:13":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue@197:13","span":{"start":[197,13],"end":[197,27],"bytes":[5747,5761]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"198:11":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue@198:11","span":{"start":[198,11],"end":[198,31],"bytes":[5785,5805]},"callee":"can://litestream/litestream/@external/strings/ToLower"}}},"github.com/benbjohnson/litestream.CleanReplicaURLPath":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath","kind":"function","span":{"start":[169,1],"end":[179,2],"bytes":[5038,5240]},"signature":"github.com/benbjohnson/litestream.CleanReplicaURLPath","parameters":[{"name":"p","type":"string","span":{"start":[169,1],"end":[169,44],"bytes":[5038,5081]}}],"return_type":"string","metrics":{"cyclomatic":3},"body":{"173:13":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath@173:13","span":{"start":[173,13],"end":[173,32],"bytes":[5123,5142]},"callee":"can://litestream/litestream/@external/path/Clean"},"174:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath@174:12","span":{"start":[174,12],"end":[174,44],"bytes":[5154,5186]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"}}},"github.com/benbjohnson/litestream.EnsureEndpointScheme":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","kind":"function","span":{"start":[402,1],"end":[414,2],"bytes":[11737,12143]},"signature":"github.com/benbjohnson/litestream.EnsureEndpointScheme","parameters":[{"name":"endpoint","type":"string","span":{"start":[402,1],"end":[402,60],"bytes":[11737,11796]}}],"return_type":"(string, bool)","metrics":{"cyclomatic":4},"body":{"406:47":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme@406:47","span":{"start":[406,47],"end":[406,86],"bytes":[11886,11925]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"406:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme@406:5","span":{"start":[406,5],"end":[406,43],"bytes":[11844,11882]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"410:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme@410:5","span":{"start":[410,5],"end":[410,30],"bytes":[12039,12064]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint"}}},"github.com/benbjohnson/litestream.IntQueryValue":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","kind":"function","span":{"start":[214,1],"end":[228,2],"bytes":[6206,6653]},"signature":"github.com/benbjohnson/litestream.IntQueryValue","parameters":[{"name":"query","type":"net/url.Values","span":{"start":[214,1],"end":[214,89],"bytes":[6206,6294]}},{"name":"keys","type":"[]string","span":{"start":[214,1],"end":[214,89],"bytes":[6206,6294]},"is_variadic":true}],"return_type":"(int64, bool, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"219:13":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue@219:13","span":{"start":[219,13],"end":[219,27],"bytes":[6380,6394]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"220:14":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue@220:14","span":{"start":[220,14],"end":[220,43],"bytes":[6421,6450]},"callee":"can://litestream/litestream/@external/strconv/ParseInt"},"222:22":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue@222:22","span":{"start":[222,22],"end":[222,115],"bytes":[6501,6594]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.IsBackblazeEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","kind":"function","span":{"start":[296,1],"end":[303,2],"bytes":[8359,8553]},"signature":"github.com/benbjohnson/litestream.IsBackblazeEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[296,1],"end":[296,49],"bytes":[8359,8407]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"297:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint@297:12","span":{"start":[297,12],"end":[297,35],"bytes":[8419,8442]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"301:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint@301:10","span":{"start":[301,10],"end":[301,22],"bytes":[8487,8499]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"302:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint@302:9","span":{"start":[302,9],"end":[302,52],"bytes":[8508,8551]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}},"github.com/benbjohnson/litestream.IsCloudflareR2Endpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","kind":"function","span":{"start":[326,1],"end":[333,2],"bytes":[9137,9343]},"signature":"github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[326,1],"end":[326,52],"bytes":[9137,9188]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"327:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint@327:12","span":{"start":[327,12],"end":[327,35],"bytes":[9200,9223]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"331:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint@331:10","span":{"start":[331,10],"end":[331,22],"bytes":[9268,9280]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"332:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint@332:9","span":{"start":[332,9],"end":[332,61],"bytes":[9289,9341]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}},"github.com/benbjohnson/litestream.IsDigitalOceanEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","kind":"function","span":{"start":[286,1],"end":[293,2],"bytes":[8084,8288]},"signature":"github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[286,1],"end":[286,52],"bytes":[8084,8135]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"287:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint@287:12","span":{"start":[287,12],"end":[287,35],"bytes":[8147,8170]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"291:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint@291:10","span":{"start":[291,10],"end":[291,22],"bytes":[8215,8227]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"292:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint@292:9","span":{"start":[292,9],"end":[292,59],"bytes":[8236,8286]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}},"github.com/benbjohnson/litestream.IsFilebaseEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","kind":"function","span":{"start":[306,1],"end":[313,2],"bytes":[8619,8794]},"signature":"github.com/benbjohnson/litestream.IsFilebaseEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[306,1],"end":[306,48],"bytes":[8619,8666]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"307:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint@307:12","span":{"start":[307,12],"end":[307,35],"bytes":[8678,8701]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"311:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint@311:10","span":{"start":[311,10],"end":[311,22],"bytes":[8746,8758]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"}}},"github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","kind":"function","span":{"start":[251,1],"end":[283,2],"bytes":[7324,8002]},"signature":"github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[251,1],"end":[251,58],"bytes":[7324,7381]}}],"return_type":"bool","metrics":{"cyclomatic":10},"body":{"252:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@252:12","span":{"start":[252,12],"end":[252,35],"bytes":[7393,7416]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"256:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@256:10","span":{"start":[256,10],"end":[256,22],"bytes":[7461,7473]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"257:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@257:9","span":{"start":[257,9],"end":[257,38],"bytes":[7482,7511]},"callee":"can://litestream/litestream/@external/strings/TrimSuffix"},"259:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@259:12","span":{"start":[259,12],"end":[259,36],"bytes":[7524,7548]},"callee":"can://litestream/litestream/@external/strings/Split"},"260:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@260:5","span":{"start":[260,5],"end":[260,16],"bytes":[7553,7564]},"callee":null},"261:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@261:10","span":{"start":[261,10],"end":[261,21],"bytes":[7581,7592]},"callee":null},"262:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@262:10","span":{"start":[262,10],"end":[262,21],"bytes":[7624,7635]},"callee":null},"270:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@270:5","span":{"start":[270,5],"end":[270,16],"bytes":[7746,7757]},"callee":null},"271:27":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@271:27","span":{"start":[271,27],"end":[271,56],"bytes":[7790,7819]},"callee":"can://litestream/litestream/@external/strings/Split"},"277:26":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint@277:26","span":{"start":[277,26],"end":[277,55],"bytes":[7905,7934]},"callee":"can://litestream/litestream/@external/strings/Split"}}},"github.com/benbjohnson/litestream.IsHetznerEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","kind":"function","span":{"start":[231,1],"end":[238,2],"bytes":[6740,6939]},"signature":"github.com/benbjohnson/litestream.IsHetznerEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[231,1],"end":[231,47],"bytes":[6740,6786]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"232:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint@232:12","span":{"start":[232,12],"end":[232,35],"bytes":[6798,6821]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"236:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint@236:10","span":{"start":[236,10],"end":[236,22],"bytes":[6866,6878]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"237:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint@237:9","span":{"start":[237,9],"end":[237,59],"bytes":[6887,6937]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}},"github.com/benbjohnson/litestream.IsLocalEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","kind":"function","span":{"start":[376,1],"end":[396,2],"bytes":[10746,11440]},"signature":"github.com/benbjohnson/litestream.IsLocalEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[376,1],"end":[376,45],"bytes":[10746,10790]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"377:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@377:12","span":{"start":[377,12],"end":[377,35],"bytes":[10802,10825]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"381:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@381:10","span":{"start":[381,10],"end":[381,22],"bytes":[10870,10882]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"385:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@385:3","span":{"start":[385,3],"end":[385,38],"bytes":[10990,11025]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"386:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@386:3","span":{"start":[386,3],"end":[386,33],"bytes":[11031,11061]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"387:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@387:3","span":{"start":[387,3],"end":[387,37],"bytes":[11067,11101]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"388:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@388:3","span":{"start":[388,3],"end":[388,37],"bytes":[11107,11141]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"389:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@389:3","span":{"start":[389,3],"end":[389,37],"bytes":[11147,11181]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"390:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@390:3","span":{"start":[390,3],"end":[390,37],"bytes":[11187,11221]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"391:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@391:3","span":{"start":[391,3],"end":[391,35],"bytes":[11227,11259]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"392:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@392:3","span":{"start":[392,3],"end":[392,37],"bytes":[11282,11316]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"393:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@393:3","span":{"start":[393,3],"end":[393,37],"bytes":[11322,11356]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"394:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@394:3","span":{"start":[394,3],"end":[394,36],"bytes":[11362,11395]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"},"395:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint@395:3","span":{"start":[395,3],"end":[395,40],"bytes":[11401,11438]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}},"github.com/benbjohnson/litestream.IsMinIOEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","kind":"function","span":{"start":[347,1],"end":[371,2],"bytes":[9768,10540]},"signature":"github.com/benbjohnson/litestream.IsMinIOEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[347,1],"end":[347,45],"bytes":[9768,9812]}}],"return_type":"bool","metrics":{"cyclomatic":4},"body":{"348:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@348:12","span":{"start":[348,12],"end":[348,35],"bytes":[9824,9847]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"352:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@352:10","span":{"start":[352,10],"end":[352,22],"bytes":[9892,9904]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"353:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@353:5","span":{"start":[353,5],"end":[353,13],"bytes":[9909,9917]},"callee":"can://litestream/litestream/@external/net/url/URL.Port"},"357:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@357:5","span":{"start":[357,5],"end":[357,45],"bytes":[9982,10022]},"callee":"can://litestream/litestream/@external/strings/Contains"},"358:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@358:3","span":{"start":[358,3],"end":[358,52],"bytes":[10028,10077]},"callee":"can://litestream/litestream/@external/strings/Contains"},"359:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@359:3","span":{"start":[359,3],"end":[359,45],"bytes":[10083,10125]},"callee":"can://litestream/litestream/@external/strings/Contains"},"360:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@360:3","span":{"start":[360,3],"end":[360,42],"bytes":[10131,10170]},"callee":"can://litestream/litestream/@external/strings/Contains"},"361:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@361:3","span":{"start":[361,3],"end":[361,39],"bytes":[10176,10212]},"callee":"can://litestream/litestream/@external/strings/Contains"},"362:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@362:3","span":{"start":[362,3],"end":[362,54],"bytes":[10218,10269]},"callee":"can://litestream/litestream/@external/strings/Contains"},"363:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@363:3","span":{"start":[363,3],"end":[363,39],"bytes":[10275,10311]},"callee":"can://litestream/litestream/@external/strings/Contains"},"364:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@364:3","span":{"start":[364,3],"end":[364,43],"bytes":[10317,10357]},"callee":"can://litestream/litestream/@external/strings/Contains"},"365:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@365:3","span":{"start":[365,3],"end":[365,41],"bytes":[10363,10401]},"callee":"can://litestream/litestream/@external/strings/Contains"},"366:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@366:3","span":{"start":[366,3],"end":[366,53],"bytes":[10407,10457]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"},"367:3":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint@367:3","span":{"start":[367,3],"end":[367,45],"bytes":[10463,10505]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}},"github.com/benbjohnson/litestream.IsScalewayEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","kind":"function","span":{"start":[316,1],"end":[323,2],"bytes":[8875,9062]},"signature":"github.com/benbjohnson/litestream.IsScalewayEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[316,1],"end":[316,48],"bytes":[8875,8922]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"317:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint@317:12","span":{"start":[317,12],"end":[317,35],"bytes":[8934,8957]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"321:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint@321:10","span":{"start":[321,10],"end":[321,22],"bytes":[9002,9014]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"322:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint@322:9","span":{"start":[322,9],"end":[322,46],"bytes":[9023,9060]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}},"github.com/benbjohnson/litestream.IsSupabaseEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","kind":"function","span":{"start":[336,1],"end":[343,2],"bytes":[9420,9609]},"signature":"github.com/benbjohnson/litestream.IsSupabaseEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[336,1],"end":[336,48],"bytes":[9420,9467]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"337:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint@337:12","span":{"start":[337,12],"end":[337,35],"bytes":[9479,9502]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"341:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint@341:10","span":{"start":[341,10],"end":[341,22],"bytes":[9547,9559]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"342:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint@342:9","span":{"start":[342,9],"end":[342,48],"bytes":[9568,9607]},"callee":"can://litestream/litestream/@external/strings/HasSuffix"}}},"github.com/benbjohnson/litestream.IsTigrisEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","kind":"function","span":{"start":[241,1],"end":[248,2],"bytes":[7028,7236]},"signature":"github.com/benbjohnson/litestream.IsTigrisEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[241,1],"end":[241,46],"bytes":[7028,7073]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"242:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint@242:12","span":{"start":[242,12],"end":[242,35],"bytes":[7085,7108]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint"},"246:10":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint@246:10","span":{"start":[246,10],"end":[246,22],"bytes":[7153,7165]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"}}},"github.com/benbjohnson/litestream.IsURL":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL","kind":"function","span":{"start":[438,1],"end":[440,2],"bytes":[12808,12871]},"signature":"github.com/benbjohnson/litestream.IsURL","parameters":[{"name":"s","type":"string","span":{"start":[438,1],"end":[438,28],"bytes":[12808,12835]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"439:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL@439:9","span":{"start":[439,9],"end":[439,34],"bytes":[12844,12869]},"callee":"can://litestream/litestream/@external/regexp/Regexp.MatchString"}}},"github.com/benbjohnson/litestream.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","kind":"function","span":{"start":[32,1],"end":[53,2],"bytes":[1048,1625]},"signature":"github.com/benbjohnson/litestream.NewReplicaClientFromURL","parameters":[{"name":"rawURL","type":"string","span":{"start":[32,1],"end":[32,69],"bytes":[1048,1116]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"33:49":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL@33:49","span":{"start":[33,49],"end":[33,81],"bytes":[1165,1197]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery"},"44:2":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL@44:2","span":{"start":[44,2],"end":[44,34],"bytes":[1359,1391]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RLock"},"46:2":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL@46:2","span":{"start":[46,2],"end":[46,36],"bytes":[1447,1481]},"callee":"can://litestream/litestream/@external/sync/RWMutex.RUnlock"},"49:15":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL@49:15","span":{"start":[49,15],"end":[49,71],"bytes":[1507,1563]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"52:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL@52:9","span":{"start":[52,9],"end":[52,56],"bytes":[1576,1623]},"callee":null}}},"github.com/benbjohnson/litestream.ParseReplicaURL":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","kind":"function","span":{"start":[72,1],"end":[80,2],"bytes":[2064,2395]},"signature":"github.com/benbjohnson/litestream.ParseReplicaURL","parameters":[{"name":"s","type":"string","span":{"start":[72,1],"end":[72,75],"bytes":[2064,2138]}}],"return_type":"(string, string, string, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"73:23":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL@73:23","span":{"start":[73,23],"end":[73,41],"bytes":[2161,2179]},"callee":"can://litestream/litestream/@external/strings/ToLower"},"73:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL@73:5","span":{"start":[73,5],"end":[73,55],"bytes":[2143,2193]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"74:35":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL@74:35","span":{"start":[74,35],"end":[74,59],"bytes":[2230,2254]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL"},"78:37":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL@78:37","span":{"start":[78,37],"end":[78,64],"bytes":[2331,2358]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery"}}},"github.com/benbjohnson/litestream.ParseReplicaURLWithQuery":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","kind":"function","span":{"start":[83,1],"end":[108,2],"bytes":[2489,3352]},"signature":"github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","parameters":[{"name":"s","type":"string","span":{"start":[83,1],"end":[83,126],"bytes":[2489,2614]}}],"return_type":"(string, string, string, net/url.Values, *net/url.Userinfo, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"100:22":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@100:22","span":{"start":[100,22],"end":[100,44],"bytes":[3099,3121]},"callee":"can://litestream/litestream/@external/path/Clean"},"100:33":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@100:33","span":{"start":[100,33],"end":[100,43],"bytes":[3110,3120]},"callee":"can://litestream/litestream/@external/net/url/URL.String"},"103:46":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@103:46","span":{"start":[103,46],"end":[103,94],"bytes":[3193,3241]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"106:28":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@106:28","span":{"start":[106,28],"end":[106,71],"bytes":[3280,3323]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"106:47":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@106:47","span":{"start":[106,47],"end":[106,65],"bytes":[3299,3317]},"callee":"can://litestream/litestream/@external/path/Clean"},"106:73":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@106:73","span":{"start":[106,73],"end":[106,82],"bytes":[3325,3334]},"callee":"can://litestream/litestream/@external/net/url/URL.Query"},"85:23":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@85:23","span":{"start":[85,23],"end":[85,41],"bytes":[2713,2731]},"callee":"can://litestream/litestream/@external/strings/ToLower"},"85:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@85:5","span":{"start":[85,5],"end":[85,55],"bytes":[2695,2745]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"86:40":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@86:40","span":{"start":[86,40],"end":[86,64],"bytes":[2787,2811]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL"},"90:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery@90:12","span":{"start":[90,12],"end":[90,24],"bytes":[2875,2887]},"callee":"can://litestream/litestream/@external/net/url/Parse"}}},"github.com/benbjohnson/litestream.RegionFromS3ARN":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN","kind":"function","span":{"start":[182,1],"end":[188,2],"bytes":[5297,5432]},"signature":"github.com/benbjohnson/litestream.RegionFromS3ARN","parameters":[{"name":"arn","type":"string","span":{"start":[182,1],"end":[182,42],"bytes":[5297,5338]}}],"return_type":"string","metrics":{"cyclomatic":2},"body":{"183:11":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN@183:11","span":{"start":[183,11],"end":[183,38],"bytes":[5349,5376]},"callee":"can://litestream/litestream/@external/strings/SplitN"},"184:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN@184:5","span":{"start":[184,5],"end":[184,15],"bytes":[5381,5391]},"callee":null}}},"github.com/benbjohnson/litestream.RegisterReplicaClientFactory":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","kind":"function","span":{"start":[24,1],"end":[28,2],"bytes":[696,894]},"signature":"github.com/benbjohnson/litestream.RegisterReplicaClientFactory","parameters":[{"name":"scheme","type":"string","span":{"start":[24,1],"end":[24,81],"bytes":[696,776]}},{"name":"factory","type":"github.com/benbjohnson/litestream.ReplicaClientFactory","span":{"start":[24,1],"end":[24,81],"bytes":[696,776]}}],"metrics":{"cyclomatic":1},"body":{"25:2":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory@25:2","span":{"start":[25,2],"end":[25,33],"bytes":[778,809]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Lock"},"26:8":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory@26:8","span":{"start":[26,8],"end":[26,41],"bytes":[817,850]},"callee":"can://litestream/litestream/@external/sync/RWMutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.ReplicaTypeFromURL":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL","kind":"function","span":{"start":[57,1],"end":[69,2],"bytes":[1757,1982]},"signature":"github.com/benbjohnson/litestream.ReplicaTypeFromURL","parameters":[{"name":"rawURL","type":"string","span":{"start":[57,1],"end":[57,48],"bytes":[1757,1804]}}],"return_type":"string","metrics":{"cyclomatic":4},"body":{"58:6":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL@58:6","span":{"start":[58,6],"end":[58,19],"bytes":[1810,1823]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL"},"61:21":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL@61:21","span":{"start":[61,21],"end":[61,44],"bytes":[1861,1884]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL"}}},"github.com/benbjohnson/litestream.parseEndpoint":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","kind":"function","span":{"start":[416,1],"end":[433,2],"bytes":[12145,12693]},"signature":"github.com/benbjohnson/litestream.parseEndpoint","parameters":[{"name":"endpoint","type":"string","span":{"start":[416,1],"end":[416,56],"bytes":[12145,12200]}}],"return_type":"(*net/url.URL, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"417:13":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@417:13","span":{"start":[417,13],"end":[417,40],"bytes":[12213,12240]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"418:24":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@418:24","span":{"start":[418,24],"end":[418,49],"bytes":[12264,12289]},"callee":"can://litestream/litestream/@external/strings/ToLower"},"418:6":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@418:6","span":{"start":[418,6],"end":[418,61],"bytes":[12246,12301]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"418:66":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@418:66","span":{"start":[418,66],"end":[418,122],"bytes":[12306,12362]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"418:84":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@418:84","span":{"start":[418,84],"end":[418,109],"bytes":[12324,12349]},"callee":"can://litestream/litestream/@external/strings/ToLower"},"421:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@421:12","span":{"start":[421,12],"end":[421,31],"bytes":[12408,12427]},"callee":"can://litestream/litestream/@external/net/url/Parse"},"426:15":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@426:15","span":{"start":[426,15],"end":[426,71],"bytes":[12500,12556]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"428:5":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@428:5","span":{"start":[428,5],"end":[428,17],"bytes":[12564,12576]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"429:15":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@429:15","span":{"start":[429,15],"end":[429,55],"bytes":[12599,12639]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"431:11":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint@431:11","span":{"start":[431,11],"end":[431,34],"bytes":[12653,12676]},"callee":"can://litestream/litestream/@external/strings/ToLower"}}},"github.com/benbjohnson/litestream.parseS3AccessPointURL":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","kind":"function","span":{"start":[111,1],"end":[140,2],"bytes":[3425,4260]},"signature":"github.com/benbjohnson/litestream.parseS3AccessPointURL","parameters":[{"name":"s","type":"string","span":{"start":[111,1],"end":[111,99],"bytes":[3425,3523]}}],"return_type":"(string, string, string, net/url.Values, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"113:24":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@113:24","span":{"start":[113,24],"end":[113,42],"bytes":[3571,3589]},"callee":"can://litestream/litestream/@external/strings/ToLower"},"113:6":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@113:6","span":{"start":[113,6],"end":[113,51],"bytes":[3553,3598]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"114:27":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@114:27","span":{"start":[114,27],"end":[114,75],"bytes":[3627,3675]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"117:19":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@117:19","span":{"start":[117,19],"end":[117,30],"bytes":[3698,3709]},"callee":null},"121:12":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@121:12","span":{"start":[121,12],"end":[121,47],"bytes":[3783,3818]},"callee":"can://litestream/litestream/@external/strings/IndexByte"},"126:22":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@126:22","span":{"start":[126,22],"end":[126,56],"bytes":[3924,3958]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN"},"133:16":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@133:16","span":{"start":[133,16],"end":[133,40],"bytes":[4080,4104]},"callee":"can://litestream/litestream/@external/net/url/ParseQuery"},"135:28":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@135:28","span":{"start":[135,28],"end":[135,69],"bytes":[4150,4191]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"139:23":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL@139:23","span":{"start":[139,23],"end":[139,47],"bytes":[4222,4246]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath"}}},"github.com/benbjohnson/litestream.splitS3AccessPointARN":{"id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN","kind":"function","span":{"start":[143,1],"end":[166,2],"bytes":[4349,4967]},"signature":"github.com/benbjohnson/litestream.splitS3AccessPointARN","parameters":[{"name":"s","type":"string","span":{"start":[143,1],"end":[143,71],"bytes":[4349,4419]}}],"return_type":"(string, string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"144:11":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN@144:11","span":{"start":[144,11],"end":[144,29],"bytes":[4430,4448]},"callee":"can://litestream/litestream/@external/strings/ToLower"},"146:9":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN@146:9","span":{"start":[146,9],"end":[146,37],"bytes":[4489,4517]},"callee":"can://litestream/litestream/@external/strings/Index"},"148:18":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN@148:18","span":{"start":[148,18],"end":[148,66],"bytes":[4551,4599]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"151:21":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN@151:21","span":{"start":[151,21],"end":[151,32],"bytes":[4624,4635]},"callee":null},"152:18":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN@152:18","span":{"start":[152,18],"end":[152,24],"bytes":[4653,4659]},"callee":null},"153:18":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN@153:18","span":{"start":[153,18],"end":[153,66],"bytes":[4679,4727]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"157:14":{"kind":"call","id":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN@157:14","span":{"start":[157,14],"end":[157,47],"bytes":[4773,4806]},"callee":"can://litestream/litestream/@external/strings/IndexByte"}}}},"content_hash":"3318488c0af38c6a7bbfc5a90fdc41b5a46c6c930a36298f5a909e5a1976d854"},"s3/leaser.go":{"id":"can://litestream/litestream/go/s3/leaser.go","kind":"module","span":{"start":[1,1],"end":[306,1],"bytes":[0,6926]},"package":"s3","source":"package s3\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go\"\n\n\t\"github.com/benbjohnson/litestream\"\n)\n\nconst (\n\tDefaultLeaseTTL = 30 * time.Second\n\tDefaultLeasePath = \"lock.json\"\n\tLeaserType = \"s3\"\n)\n\nvar (\n\t_ litestream.Leaser = (*Leaser)(nil)\n\n\tErrLeaseRequired = errors.New(\"lease required\")\n\tErrLeaseETagRequired = errors.New(\"lease etag required\")\n\tErrLeaseAlreadyReleased = errors.New(\"lease already released\")\n)\n\n// S3API is the interface for S3 operations needed by Leaser.\ntype S3API interface {\n\tGetObject(ctx context.Context, params *s3.GetObjectInput, optFns ...func(*s3.Options)) (*s3.GetObjectOutput, error)\n\tPutObject(ctx context.Context, params *s3.PutObjectInput, optFns ...func(*s3.Options)) (*s3.PutObjectOutput, error)\n\tDeleteObject(ctx context.Context, params *s3.DeleteObjectInput, optFns ...func(*s3.Options)) (*s3.DeleteObjectOutput, error)\n}\n\ntype Leaser struct {\n\ts3 S3API\n\tlogger *slog.Logger\n\n\tBucket string\n\tPath string\n\tTTL time.Duration\n\tOwner string\n}\n\nfunc NewLeaser() *Leaser {\n\towner, _ := os.Hostname()\n\tif owner == \"\" {\n\t\towner = fmt.Sprintf(\"pid-%d\", os.Getpid())\n\t} else {\n\t\towner = fmt.Sprintf(\"%s:%d\", owner, os.Getpid())\n\t}\n\n\treturn \u0026Leaser{\n\t\tlogger: slog.Default().WithGroup(\"s3-leaser\"),\n\t\tTTL: DefaultLeaseTTL,\n\t\tOwner: owner,\n\t}\n}\n\nfunc (l *Leaser) SetLogger(logger *slog.Logger) {\n\tl.logger = logger.WithGroup(\"s3-leaser\")\n}\n\nfunc (l *Leaser) Client() S3API {\n\treturn l.s3\n}\n\nfunc (l *Leaser) SetClient(client S3API) {\n\tl.s3 = client\n}\n\nfunc (l *Leaser) Type() string {\n\treturn LeaserType\n}\n\nfunc (l *Leaser) lockKey() string {\n\tif l.Path == \"\" {\n\t\treturn DefaultLeasePath\n\t}\n\treturn l.Path + \"/\" + DefaultLeasePath\n}\n\nfunc (l *Leaser) AcquireLease(ctx context.Context) (*litestream.Lease, error) {\n\texisting, etag, err := l.readLease(ctx)\n\tif err != nil \u0026\u0026 !errors.Is(err, os.ErrNotExist) {\n\t\treturn nil, fmt.Errorf(\"read existing lease: %w\", err)\n\t}\n\n\tif existing != nil \u0026\u0026 !existing.IsExpired() {\n\t\treturn nil, \u0026litestream.LeaseExistsError{\n\t\t\tOwner: existing.Owner,\n\t\t\tExpiresAt: existing.ExpiresAt,\n\t\t}\n\t}\n\n\tvar generation int64 = 1\n\tif existing != nil {\n\t\tgeneration = existing.Generation + 1\n\t}\n\n\tnewLease := \u0026litestream.Lease{\n\t\tGeneration: generation,\n\t\tExpiresAt: time.Now().Add(l.TTL),\n\t\tOwner: l.Owner,\n\t}\n\n\tnewETag, err := l.writeLease(ctx, newLease, etag)\n\tif err != nil {\n\t\tvar leaseErr *litestream.LeaseExistsError\n\t\tif errors.As(err, \u0026leaseErr) {\n\t\t\tif current, _, readErr := l.readLease(ctx); readErr == nil \u0026\u0026 current != nil {\n\t\t\t\treturn nil, \u0026litestream.LeaseExistsError{\n\t\t\t\t\tOwner: current.Owner,\n\t\t\t\t\tExpiresAt: current.ExpiresAt,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil, err\n\t}\n\n\tnewLease.ETag = newETag\n\tl.logger.Debug(\"lease acquired\",\n\t\t\"generation\", newLease.Generation,\n\t\t\"owner\", newLease.Owner,\n\t\t\"expires_at\", newLease.ExpiresAt,\n\t\t\"etag\", newLease.ETag)\n\n\treturn newLease, nil\n}\n\nfunc (l *Leaser) RenewLease(ctx context.Context, lease *litestream.Lease) (*litestream.Lease, error) {\n\tif lease == nil {\n\t\treturn nil, ErrLeaseRequired\n\t}\n\tif lease.ETag == \"\" {\n\t\treturn nil, ErrLeaseETagRequired\n\t}\n\n\tnewLease := \u0026litestream.Lease{\n\t\tGeneration: lease.Generation,\n\t\tExpiresAt: time.Now().Add(l.TTL),\n\t\tOwner: l.Owner,\n\t}\n\n\tnewETag, err := l.writeLease(ctx, newLease, lease.ETag)\n\tif err != nil {\n\t\tvar leaseErr *litestream.LeaseExistsError\n\t\tif errors.As(err, \u0026leaseErr) {\n\t\t\treturn nil, litestream.ErrLeaseNotHeld\n\t\t}\n\t\treturn nil, err\n\t}\n\n\tnewLease.ETag = newETag\n\tl.logger.Debug(\"lease renewed\",\n\t\t\"generation\", newLease.Generation,\n\t\t\"owner\", newLease.Owner,\n\t\t\"expires_at\", newLease.ExpiresAt,\n\t\t\"etag\", newLease.ETag)\n\n\treturn newLease, nil\n}\n\nfunc (l *Leaser) ReleaseLease(ctx context.Context, lease *litestream.Lease) error {\n\tif lease == nil {\n\t\treturn ErrLeaseRequired\n\t}\n\tif lease.ETag == \"\" {\n\t\treturn ErrLeaseETagRequired\n\t}\n\n\tkey := l.lockKey()\n\t_, err := l.s3.DeleteObject(ctx, \u0026s3.DeleteObjectInput{\n\t\tBucket: aws.String(l.Bucket),\n\t\tKey: aws.String(key),\n\t\tIfMatch: aws.String(lease.ETag),\n\t})\n\tif err != nil {\n\t\tif isNotExists(err) || isNotFoundError(err) {\n\t\t\treturn ErrLeaseAlreadyReleased\n\t\t}\n\t\tif isPreconditionFailed(err) {\n\t\t\treturn litestream.ErrLeaseNotHeld\n\t\t}\n\t\treturn fmt.Errorf(\"delete lease: %w\", err)\n\t}\n\n\tl.logger.Debug(\"lease released\",\n\t\t\"generation\", lease.Generation,\n\t\t\"owner\", lease.Owner)\n\n\treturn nil\n}\n\nfunc (l *Leaser) readLease(ctx context.Context) (*litestream.Lease, string, error) {\n\tkey := l.lockKey()\n\n\tout, err := l.s3.GetObject(ctx, \u0026s3.GetObjectInput{\n\t\tBucket: aws.String(l.Bucket),\n\t\tKey: aws.String(key),\n\t})\n\tif err != nil {\n\t\tif isNotExists(err) || isNotFoundError(err) {\n\t\t\treturn nil, \"\", os.ErrNotExist\n\t\t}\n\t\treturn nil, \"\", fmt.Errorf(\"get lock file: %w\", err)\n\t}\n\tdefer out.Body.Close()\n\n\tvar lease litestream.Lease\n\tif err := json.NewDecoder(out.Body).Decode(\u0026lease); err != nil {\n\t\treturn nil, \"\", fmt.Errorf(\"decode lock file: %w\", err)\n\t}\n\n\tetag := \"\"\n\tif out.ETag != nil {\n\t\tetag = *out.ETag\n\t}\n\tlease.ETag = etag\n\n\treturn \u0026lease, etag, nil\n}\n\nfunc (l *Leaser) writeLease(ctx context.Context, lease *litestream.Lease, etag string) (string, error) {\n\tkey := l.lockKey()\n\n\tdata, err := json.Marshal(lease)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"marshal lock file: %w\", err)\n\t}\n\n\tinput := \u0026s3.PutObjectInput{\n\t\tBucket: aws.String(l.Bucket),\n\t\tKey: aws.String(key),\n\t\tBody: bytes.NewReader(data),\n\t\tContentType: aws.String(\"application/json\"),\n\t}\n\n\tif etag == \"\" {\n\t\tinput.IfNoneMatch = aws.String(\"*\")\n\t} else {\n\t\tinput.IfMatch = aws.String(etag)\n\t}\n\n\tout, err := l.s3.PutObject(ctx, input)\n\tif err != nil {\n\t\tif isPreconditionFailed(err) {\n\t\t\treturn \"\", \u0026litestream.LeaseExistsError{}\n\t\t}\n\t\treturn \"\", fmt.Errorf(\"put lock file: %w\", err)\n\t}\n\n\tnewETag := \"\"\n\tif out.ETag != nil {\n\t\tnewETag = *out.ETag\n\t}\n\n\treturn newETag, nil\n}\n\nfunc isPreconditionFailed(err error) bool {\n\tvar apiErr smithy.APIError\n\tif errors.As(err, \u0026apiErr) {\n\t\tcode := apiErr.ErrorCode()\n\t\treturn code == \"PreconditionFailed\" || code == \"412\"\n\t}\n\n\tvar respErr *smithy.OperationError\n\tif errors.As(err, \u0026respErr) {\n\t\tif httpErr, ok := respErr.Err.(interface{ HTTPStatusCode() int }); ok {\n\t\t\treturn httpErr.HTTPStatusCode() == 412\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc isNotFoundError(err error) bool {\n\tvar apiErr smithy.APIError\n\tif errors.As(err, \u0026apiErr) {\n\t\tcode := apiErr.ErrorCode()\n\t\treturn code == \"NoSuchKey\" || code == \"NotFound\" || code == \"404\"\n\t}\n\n\tvar noSuchKey *types.NoSuchKey\n\tif errors.As(err, \u0026noSuchKey) {\n\t\treturn true\n\t}\n\n\tvar respErr *smithy.OperationError\n\tif errors.As(err, \u0026respErr) {\n\t\tif httpErr, ok := respErr.Err.(interface{ HTTPStatusCode() int }); ok {\n\t\t\treturn httpErr.HTTPStatusCode() == 404\n\t\t}\n\t}\n\n\treturn false\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[21,29]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[30,40]}},{"name":"json","path":"encoding/json","span":{"start":[6,1],"end":[6,17],"bytes":[41,57]}},{"name":"errors","path":"errors","span":{"start":[7,1],"end":[7,10],"bytes":[58,67]}},{"name":"fmt","path":"fmt","span":{"start":[8,1],"end":[8,7],"bytes":[68,74]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[75,86]}},{"name":"os","path":"os","span":{"start":[10,1],"end":[10,6],"bytes":[87,92]}},{"name":"time","path":"time","span":{"start":[11,1],"end":[11,8],"bytes":[93,100]}},{"name":"aws","path":"github.com/aws/aws-sdk-go-v2/aws","span":{"start":[13,1],"end":[13,36],"bytes":[102,137]}},{"name":"s3","path":"github.com/aws/aws-sdk-go-v2/service/s3","span":{"start":[14,1],"end":[14,43],"bytes":[138,180]}},{"name":"types","path":"github.com/aws/aws-sdk-go-v2/service/s3/types","span":{"start":[15,1],"end":[15,49],"bytes":[181,229]}},{"name":"smithy-go","path":"github.com/aws/smithy-go","span":{"start":[16,1],"end":[16,28],"bytes":[230,257]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[18,1],"end":[18,37],"bytes":[259,295]}}],"types":{"Leaser":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser","kind":"struct","span":{"start":[42,1],"end":[50,2],"bytes":[1081,1206]},"callables":{"github.com/benbjohnson/litestream/s3.Leaser.AcquireLease":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","kind":"method","span":{"start":[90,1],"end":[136,2],"bytes":[1894,3088]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[90,1],"end":[90,80],"bytes":[1894,1973]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"110:15":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@110:15","span":{"start":[110,15],"end":[110,36],"bytes":[2454,2475]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"110:15/2":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@110:15/2","span":{"start":[110,15],"end":[110,25],"bytes":[2454,2464]},"callee":"can://litestream/litestream/@external/time/Now"},"114:18":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@114:18","span":{"start":[114,18],"end":[114,51],"bytes":[2521,2554]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease"},"117:6":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@117:6","span":{"start":[117,6],"end":[117,31],"bytes":[2621,2646]},"callee":"can://litestream/litestream/@external/errors/As"},"118:30":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@118:30","span":{"start":[118,30],"end":[118,46],"bytes":[2678,2694]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease"},"129:2":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@129:2","span":{"start":[129,2],"end":[133,25],"bytes":[2906,3063]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"91:25":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@91:25","span":{"start":[91,25],"end":[91,41],"bytes":[1998,2014]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease"},"92:20":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@92:20","span":{"start":[92,20],"end":[92,50],"bytes":[2034,2064]},"callee":"can://litestream/litestream/@external/errors/Is"},"93:15":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@93:15","span":{"start":[93,15],"end":[93,57],"bytes":[2081,2123]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"96:25":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease@96:25","span":{"start":[96,25],"end":[96,45],"bytes":[2152,2172]},"callee":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired"}}},"github.com/benbjohnson/litestream/s3.Leaser.Client":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.Client","kind":"method","span":{"start":[71,1],"end":[73,2],"bytes":[1601,1649]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.Client","parameters":[],"return_type":"github.com/benbjohnson/litestream/s3.S3API","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","kind":"method","span":{"start":[171,1],"end":[200,2],"bytes":[3864,4562]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[171,1],"end":[171,84],"bytes":[3864,3947]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[171,1],"end":[171,84],"bytes":[3864,3947]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"179:9":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@179:9","span":{"start":[179,9],"end":[179,20],"bytes":[4061,4072]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey"},"180:12":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@180:12","span":{"start":[180,12],"end":[184,4],"bytes":[4084,4229]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.DeleteObject"},"181:12":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@181:12","span":{"start":[181,12],"end":[181,32],"bytes":[4141,4161]},"callee":null},"182:12":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@182:12","span":{"start":[182,12],"end":[182,27],"bytes":[4174,4189]},"callee":null},"183:12":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@183:12","span":{"start":[183,12],"end":[183,34],"bytes":[4202,4224]},"callee":null},"186:26":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@186:26","span":{"start":[186,26],"end":[186,46],"bytes":[4272,4292]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError"},"186:6":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@186:6","span":{"start":[186,6],"end":[186,22],"bytes":[4252,4268]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"189:6":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@189:6","span":{"start":[189,6],"end":[189,31],"bytes":[4338,4363]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed"},"192:10":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@192:10","span":{"start":[192,10],"end":[192,45],"bytes":[4416,4451]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"195:2":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease@195:2","span":{"start":[195,2],"end":[197,24],"bytes":[4457,4547]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"}}},"github.com/benbjohnson/litestream/s3.Leaser.RenewLease":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease","kind":"method","span":{"start":[138,1],"end":[169,2],"bytes":[3090,3862]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.RenewLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[138,1],"end":[138,103],"bytes":[3090,3192]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[138,1],"end":[138,103],"bytes":[3090,3192]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"148:15":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease@148:15","span":{"start":[148,15],"end":[148,36],"bytes":[3386,3407]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"148:15/2":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease@148:15/2","span":{"start":[148,15],"end":[148,25],"bytes":[3386,3396]},"callee":"can://litestream/litestream/@external/time/Now"},"152:18":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease@152:18","span":{"start":[152,18],"end":[152,57],"bytes":[3453,3492]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease"},"155:6":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease@155:6","span":{"start":[155,6],"end":[155,31],"bytes":[3559,3584]},"callee":"can://litestream/litestream/@external/errors/As"},"162:2":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease@162:2","span":{"start":[162,2],"end":[166,25],"bytes":[3681,3837]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"}}},"github.com/benbjohnson/litestream/s3.Leaser.SetClient":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.SetClient","kind":"method","span":{"start":[75,1],"end":[77,2],"bytes":[1651,1710]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.SetClient","parameters":[{"name":"client","type":"github.com/benbjohnson/litestream/s3.S3API","span":{"start":[75,1],"end":[75,43],"bytes":[1651,1693]}}],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.Leaser.SetLogger":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.SetLogger","kind":"method","span":{"start":[67,1],"end":[69,2],"bytes":[1506,1599]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[67,1],"end":[67,50],"bytes":[1506,1555]}}],"metrics":{"cyclomatic":1},"body":{"68:13":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.SetLogger@68:13","span":{"start":[68,13],"end":[68,42],"bytes":[1568,1597]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/s3.Leaser.Type":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.Type","kind":"method","span":{"start":[79,1],"end":[81,2],"bytes":[1712,1765]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.Leaser.lockKey":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey","kind":"method","span":{"start":[83,1],"end":[88,2],"bytes":[1767,1892]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.lockKey","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{}},"github.com/benbjohnson/litestream/s3.Leaser.readLease":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","kind":"method","span":{"start":[202,1],"end":[229,2],"bytes":[4564,5231]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.readLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[202,1],"end":[202,85],"bytes":[4564,4648]}}],"return_type":"(*github.com/benbjohnson/litestream.Lease, string, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"203:9":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@203:9","span":{"start":[203,9],"end":[203,20],"bytes":[4657,4668]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey"},"205:14":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@205:14","span":{"start":[205,14],"end":[208,4],"bytes":[4683,4785]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.GetObject"},"206:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@206:11","span":{"start":[206,11],"end":[206,31],"bytes":[4733,4753]},"callee":null},"207:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@207:11","span":{"start":[207,11],"end":[207,26],"bytes":[4765,4780]},"callee":null},"210:26":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@210:26","span":{"start":[210,26],"end":[210,46],"bytes":[4828,4848]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError"},"210:6":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@210:6","span":{"start":[210,6],"end":[210,22],"bytes":[4808,4824]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"213:19":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@213:19","span":{"start":[213,19],"end":[213,55],"bytes":[4907,4943]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"215:8":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@215:8","span":{"start":[215,8],"end":[215,24],"bytes":[4954,4970]},"callee":null,"is_deferred":true},"218:12":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@218:12","span":{"start":[218,12],"end":[218,52],"bytes":[5011,5051]},"callee":"can://litestream/litestream/@external/encoding/json/Decoder.Decode"},"218:12/2":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@218:12/2","span":{"start":[218,12],"end":[218,37],"bytes":[5011,5036]},"callee":"can://litestream/litestream/@external/encoding/json/NewDecoder"},"219:19":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease@219:19","span":{"start":[219,19],"end":[219,58],"bytes":[5084,5123]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/s3.Leaser.writeLease":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","kind":"method","span":{"start":[231,1],"end":[266,2],"bytes":[5233,6038]},"signature":"github.com/benbjohnson/litestream/s3.Leaser.writeLease","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[231,1],"end":[231,105],"bytes":[5233,5337]}},{"name":"lease","type":"*github.com/benbjohnson/litestream.Lease","span":{"start":[231,1],"end":[231,105],"bytes":[5233,5337]}},{"name":"etag","type":"string","span":{"start":[231,1],"end":[231,105],"bytes":[5233,5337]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"232:9":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@232:9","span":{"start":[232,9],"end":[232,20],"bytes":[5346,5357]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey"},"234:15":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@234:15","span":{"start":[234,15],"end":[234,34],"bytes":[5373,5392]},"callee":"can://litestream/litestream/@external/encoding/json/Marshal"},"236:14":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@236:14","span":{"start":[236,14],"end":[236,54],"bytes":[5423,5463]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"240:16":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@240:16","span":{"start":[240,16],"end":[240,36],"bytes":[5513,5533]},"callee":null},"241:16":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@241:16","span":{"start":[241,16],"end":[241,31],"bytes":[5550,5565]},"callee":null},"242:16":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@242:16","span":{"start":[242,16],"end":[242,37],"bytes":[5582,5603]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"243:16":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@243:16","span":{"start":[243,16],"end":[243,46],"bytes":[5620,5650]},"callee":null},"247:23":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@247:23","span":{"start":[247,23],"end":[247,38],"bytes":[5695,5710]},"callee":null},"249:19":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@249:19","span":{"start":[249,19],"end":[249,35],"bytes":[5739,5755]},"callee":null},"252:14":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@252:14","span":{"start":[252,14],"end":[252,40],"bytes":[5773,5799]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.PutObject"},"254:6":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@254:6","span":{"start":[254,6],"end":[254,31],"bytes":[5822,5847]},"callee":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed"},"257:14":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease@257:14","span":{"start":[257,14],"end":[257,50],"bytes":[5912,5948]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}}},"fields":{"Bucket":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/Bucket","kind":"field","type":"string","span":{"start":[46,1],"end":[46,15],"bytes":[1138,1152]}},"Owner":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/Owner","kind":"field","type":"string","span":{"start":[49,1],"end":[49,15],"bytes":[1190,1204]}},"Path":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/Path","kind":"field","type":"string","span":{"start":[47,1],"end":[47,15],"bytes":[1153,1167]}},"TTL":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/TTL","kind":"field","type":"time.Duration","span":{"start":[48,1],"end":[48,22],"bytes":[1168,1189]}},"logger":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[44,1],"end":[44,21],"bytes":[1116,1136]}},"s3":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/s3","kind":"field","type":"github.com/benbjohnson/litestream/s3.S3API","span":{"start":[43,1],"end":[43,14],"bytes":[1102,1115]}}}},"S3API":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API","kind":"interface","span":{"start":[36,1],"end":[40,2],"bytes":[695,1079]},"callables":{"github.com/benbjohnson/litestream/s3.S3API.DeleteObject":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.DeleteObject","kind":"method","span":{"start":[39,1],"end":[39,126],"bytes":[952,1077]},"signature":"github.com/benbjohnson/litestream/s3.S3API.DeleteObject","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[39,1],"end":[39,126],"bytes":[952,1077]}},{"name":"params","type":"invalid type","span":{"start":[39,1],"end":[39,126],"bytes":[952,1077]}},{"name":"optFns","type":"[]func(invalid type)","span":{"start":[39,1],"end":[39,126],"bytes":[952,1077]},"is_variadic":true}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream/s3.S3API.GetObject":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.GetObject","kind":"method","span":{"start":[37,1],"end":[37,117],"bytes":[718,834]},"signature":"github.com/benbjohnson/litestream/s3.S3API.GetObject","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[37,1],"end":[37,117],"bytes":[718,834]}},{"name":"params","type":"invalid type","span":{"start":[37,1],"end":[37,117],"bytes":[718,834]}},{"name":"optFns","type":"[]func(invalid type)","span":{"start":[37,1],"end":[37,117],"bytes":[718,834]},"is_variadic":true}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream/s3.S3API.PutObject":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.PutObject","kind":"method","span":{"start":[38,1],"end":[38,117],"bytes":[835,951]},"signature":"github.com/benbjohnson/litestream/s3.S3API.PutObject","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[38,1],"end":[38,117],"bytes":[835,951]}},{"name":"params","type":"invalid type","span":{"start":[38,1],"end":[38,117],"bytes":[835,951]}},{"name":"optFns","type":"[]func(invalid type)","span":{"start":[38,1],"end":[38,117],"bytes":[835,951]},"is_variadic":true}],"return_type":"(invalid type, error)","error_channel":["error"],"body":{}}}}},"functions":{"github.com/benbjohnson/litestream/s3.NewLeaser":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser","kind":"function","span":{"start":[52,1],"end":[65,2],"bytes":[1208,1504]},"signature":"github.com/benbjohnson/litestream/s3.NewLeaser","parameters":[],"return_type":"*github.com/benbjohnson/litestream/s3.Leaser","metrics":{"cyclomatic":2},"body":{"53:14":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser@53:14","span":{"start":[53,14],"end":[53,27],"bytes":[1248,1261]},"callee":"can://litestream/litestream/@external/os/Hostname"},"55:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser@55:11","span":{"start":[55,11],"end":[55,45],"bytes":[1290,1324]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"55:33":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser@55:33","span":{"start":[55,33],"end":[55,44],"bytes":[1312,1323]},"callee":"can://litestream/litestream/@external/os/Getpid"},"57:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser@57:11","span":{"start":[57,11],"end":[57,51],"bytes":[1345,1385]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"57:39":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser@57:39","span":{"start":[57,39],"end":[57,50],"bytes":[1373,1384]},"callee":"can://litestream/litestream/@external/os/Getpid"},"61:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser@61:11","span":{"start":[61,11],"end":[61,48],"bytes":[1417,1454]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"61:11/2":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser@61:11/2","span":{"start":[61,11],"end":[61,25],"bytes":[1417,1431]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/s3.isNotFoundError":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError","kind":"function","span":{"start":[285,1],"end":[305,2],"bytes":[6438,6925]},"signature":"github.com/benbjohnson/litestream/s3.isNotFoundError","parameters":[{"name":"err","type":"error","span":{"start":[285,1],"end":[285,39],"bytes":[6438,6476]}}],"return_type":"bool","metrics":{"cyclomatic":5},"body":{"287:5":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError@287:5","span":{"start":[287,5],"end":[287,28],"bytes":[6509,6532]},"callee":"can://litestream/litestream/@external/errors/As"},"288:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError@288:11","span":{"start":[288,11],"end":[288,29],"bytes":[6545,6563]},"callee":null},"293:5":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError@293:5","span":{"start":[293,5],"end":[293,31],"bytes":[6672,6698]},"callee":"can://litestream/litestream/@external/errors/As"},"298:5":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError@298:5","span":{"start":[298,5],"end":[298,29],"bytes":[6759,6783]},"callee":"can://litestream/litestream/@external/errors/As"},"300:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError@300:11","span":{"start":[300,11],"end":[300,35],"bytes":[6870,6894]},"callee":null}}},"github.com/benbjohnson/litestream/s3.isPreconditionFailed":{"id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed","kind":"function","span":{"start":[268,1],"end":[283,2],"bytes":[6040,6436]},"signature":"github.com/benbjohnson/litestream/s3.isPreconditionFailed","parameters":[{"name":"err","type":"error","span":{"start":[268,1],"end":[268,44],"bytes":[6040,6083]}}],"return_type":"bool","metrics":{"cyclomatic":4},"body":{"270:5":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed@270:5","span":{"start":[270,5],"end":[270,28],"bytes":[6116,6139]},"callee":"can://litestream/litestream/@external/errors/As"},"271:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed@271:11","span":{"start":[271,11],"end":[271,29],"bytes":[6152,6170]},"callee":null},"276:5":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed@276:5","span":{"start":[276,5],"end":[276,29],"bytes":[6270,6294]},"callee":"can://litestream/litestream/@external/errors/As"},"278:11":{"kind":"call","id":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed@278:11","span":{"start":[278,11],"end":[278,35],"bytes":[6381,6405]},"callee":null}}}},"content_hash":"3afed52bb5e6a612b0bbc2455ed5859e2b178afbd4759edb491a0e127012b345"},"s3/replica_client.go":{"id":"can://litestream/litestream/go/s3/replica_client.go","kind":"module","span":{"start":[1,1],"end":[1894,1],"bytes":[0,58711]},"package":"s3","source":"package s3\n\nimport (\n\t\"bytes\"\n\t\"cmp\"\n\t\"context\"\n\t\"crypto/md5\"\n\t\"crypto/tls\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/aws/aws-sdk-go-v2/aws\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/ratelimit\"\n\t\"github.com/aws/aws-sdk-go-v2/aws/retry\"\n\tv4 \"github.com/aws/aws-sdk-go-v2/aws/signer/v4\"\n\t\"github.com/aws/aws-sdk-go-v2/config\"\n\t\"github.com/aws/aws-sdk-go-v2/credentials\"\n\t\"github.com/aws/aws-sdk-go-v2/feature/s3/manager\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3\"\n\t\"github.com/aws/aws-sdk-go-v2/service/s3/types\"\n\t\"github.com/aws/smithy-go\"\n\tsmithyxml \"github.com/aws/smithy-go/encoding/xml\"\n\t\"github.com/aws/smithy-go/middleware\"\n\tsmithytime \"github.com/aws/smithy-go/time\"\n\tsmithyhttp \"github.com/aws/smithy-go/transport/http\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/errgroup\"\n\t\"golang.org/x/sync/semaphore\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"s3\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"s3\"\n\n// MetadataKeyTimestamp is the metadata key for storing LTX file timestamps in S3.\nconst MetadataKeyTimestamp = \"litestream-timestamp\"\n\n// MaxKeys is the number of keys S3 can operate on per batch.\nconst MaxKeys = 1000\n\n// DefaultRegion is the region used if one is not specified.\nconst DefaultRegion = \"us-east-1\"\n\n// DefaultMetadataConcurrency is the default number of concurrent HeadObject calls\n// for fetching accurate timestamps during timestamp-based restore.\n// S3 can handle 5,500+ HEAD requests per second per prefix.\nconst DefaultMetadataConcurrency = 50\n\n// DefaultR2Concurrency is the default number of concurrent multipart upload\n// parts for Cloudflare R2, which has strict concurrent upload limits.\nconst DefaultR2Concurrency = 2\n\n// DefaultTigrisConcurrency is the default number of concurrent multipart\n// upload parts for Tigris, which has strict concurrent upload limits.\nconst DefaultTigrisConcurrency = 2\n\n// DefaultTigrisPartSize is the default multipart upload part size for Tigris.\nconst DefaultTigrisPartSize = 16 * 1024 * 1024\n\n// contentMD5StackKey is used to pass the precomputed Content-MD5 checksum\n// through the middleware stack from Serialize to Finalize phase.\ntype contentMD5StackKey struct{}\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\nvar _ litestream.ReplicaClientV3 = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files to S3.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\ts3 *s3.Client // s3 service\n\tuploader *manager.Uploader\n\tlogger *slog.Logger\n\n\t// AWS authentication keys.\n\tAccessKeyID string\n\tSecretAccessKey string\n\n\t// S3 bucket information\n\tRegion string\n\tBucket string\n\tPath string\n\tEndpoint string\n\tForcePathStyle bool\n\tSkipVerify bool\n\tSignPayload bool\n\tSignAcceptEncoding bool\n\tRequireContentMD5 bool\n\tStorageClass string\n\n\t// Upload configuration\n\tPartSize int64 // Part size for multipart uploads (default: 5MB)\n\tConcurrency int // Number of concurrent parts to upload (default: 5)\n\n\t// MetadataConcurrency controls parallel HeadObject calls for timestamp-based restore.\n\t// Higher values improve restore speed for large backup histories.\n\t// Default: 50 (S3 can handle 5,500+ HEAD/s per prefix)\n\tMetadataConcurrency int\n\n\t// Server-Side Encryption - Customer Provided Keys (SSE-C)\n\t// Works with all S3-compatible providers (AWS, MinIO, Exoscale, etc.)\n\tSSECustomerAlgorithm string // Must be \"AES256\" if set\n\tSSECustomerKey string // Base64-encoded 256-bit (32 byte) encryption key\n\tSSECustomerKeyMD5 string // Base64-encoded MD5 of key (auto-computed if not set)\n\n\t// Server-Side Encryption - AWS KMS (SSE-KMS)\n\t// Only works with AWS S3 (not S3-compatible providers)\n\tSSEKMSKeyID string // KMS key ID, ARN, or alias\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tRequireContentMD5: true,\n\t\tSignPayload: true,\n\t\tSignAcceptEncoding: true,\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\tvar (\n\t\tbucket string\n\t\tregion string\n\t\tendpoint string\n\t\tforcePathStyle bool\n\t\tskipVerify bool\n\t\tsignPayload bool\n\t\tsignPayloadSet bool\n\t\tsignAcceptEncoding bool\n\t\tsignAcceptEncodingSet bool\n\t\trequireMD5 bool\n\t\trequireMD5Set bool\n\t\tconcurrency int\n\t\tconcurrencySet bool\n\t\tpartSize int64\n\t\tstorageClass string\n\t)\n\n\t// Parse host for bucket and region\n\tif strings.HasPrefix(host, \"arn:\") {\n\t\tbucket = host\n\t\tregion = litestream.RegionFromS3ARN(host)\n\t} else {\n\t\tbucket, region, endpoint, forcePathStyle = ParseHost(host)\n\t}\n\n\t// Override with query parameters if provided\n\tif qEndpoint := query.Get(\"endpoint\"); qEndpoint != \"\" {\n\t\t// Ensure endpoint has a scheme (defaults to https:// for cloud, http:// for local)\n\t\tqEndpoint, _ = litestream.EnsureEndpointScheme(qEndpoint)\n\t\tendpoint = qEndpoint\n\t\t// Default to path style for custom endpoints unless explicitly set to false\n\t\tif v, ok := litestream.BoolQueryValue(query, \"forcePathStyle\", \"force-path-style\"); !ok || v {\n\t\t\tforcePathStyle = true\n\t\t}\n\t}\n\tif qRegion := query.Get(\"region\"); qRegion != \"\" {\n\t\tregion = qRegion\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"forcePathStyle\", \"force-path-style\"); ok {\n\t\tforcePathStyle = v\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"skipVerify\", \"skip-verify\"); ok {\n\t\tskipVerify = v\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"signPayload\", \"sign-payload\"); ok {\n\t\tsignPayload = v\n\t\tsignPayloadSet = true\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"signAcceptEncoding\", \"sign-accept-encoding\"); ok {\n\t\tsignAcceptEncoding = v\n\t\tsignAcceptEncodingSet = true\n\t}\n\tif v, ok := litestream.BoolQueryValue(query, \"requireContentMD5\", \"require-content-md5\"); ok {\n\t\trequireMD5 = v\n\t\trequireMD5Set = true\n\t}\n\tif v, ok, err := litestream.IntQueryValue(query, \"concurrency\"); err != nil {\n\t\treturn nil, err\n\t} else if ok {\n\t\tconcurrency = int(v)\n\t\tconcurrencySet = true\n\t}\n\tif v, ok, err := litestream.IntQueryValue(query, \"partSize\", \"part-size\"); err != nil {\n\t\treturn nil, err\n\t} else if ok {\n\t\tpartSize = v\n\t}\n\tif v := query.Get(\"storageClass\"); v != \"\" {\n\t\tstorageClass = v\n\t} else if v := query.Get(\"storage-class\"); v != \"\" {\n\t\tstorageClass = v\n\t}\n\n\t// Ensure bucket is set\n\tif bucket == \"\" {\n\t\treturn nil, fmt.Errorf(\"bucket required for s3 replica URL\")\n\t}\n\n\t// Track if forcePathStyle was explicitly set via query parameter.\n\tforcePathStyleSet := query.Get(\"forcePathStyle\") != \"\" || query.Get(\"force-path-style\") != \"\"\n\n\t// Read authentication from environment variables\n\tif v := os.Getenv(\"AWS_ACCESS_KEY_ID\"); v != \"\" {\n\t\tclient.AccessKeyID = v\n\t} else if v := os.Getenv(\"LITESTREAM_ACCESS_KEY_ID\"); v != \"\" {\n\t\tclient.AccessKeyID = v\n\t}\n\tif v := os.Getenv(\"AWS_SECRET_ACCESS_KEY\"); v != \"\" {\n\t\tclient.SecretAccessKey = v\n\t} else if v := os.Getenv(\"LITESTREAM_SECRET_ACCESS_KEY\"); v != \"\" {\n\t\tclient.SecretAccessKey = v\n\t}\n\n\tif endpoint == \"\" {\n\t\tif v := os.Getenv(\"LITESTREAM_S3_ENDPOINT\"); v != \"\" {\n\t\t\tendpoint, _ = litestream.EnsureEndpointScheme(v)\n\t\t\tif !forcePathStyleSet {\n\t\t\t\tforcePathStyle = true\n\t\t\t}\n\t\t}\n\t}\n\n\t// Detect S3-compatible provider endpoints for applying appropriate defaults.\n\tisHetzner := litestream.IsHetznerEndpoint(endpoint)\n\tisTigris := litestream.IsTigrisEndpoint(endpoint)\n\tisDigitalOcean := litestream.IsDigitalOceanEndpoint(endpoint)\n\tisBackblaze := litestream.IsBackblazeEndpoint(endpoint)\n\tisFilebase := litestream.IsFilebaseEndpoint(endpoint)\n\tisScaleway := litestream.IsScalewayEndpoint(endpoint)\n\tisCloudflareR2 := litestream.IsCloudflareR2Endpoint(endpoint)\n\tisMinIO := litestream.IsMinIOEndpoint(endpoint)\n\tisSupabase := litestream.IsSupabaseEndpoint(endpoint)\n\n\t// Apply provider-specific defaults for S3-compatible providers.\n\tif isTigris {\n\t\t// Tigris: requires signed payloads, no MD5\n\t\tif !signPayloadSet {\n\t\t\tsignPayload, signPayloadSet = true, true\n\t\t}\n\t\tif !requireMD5Set {\n\t\t\trequireMD5, requireMD5Set = false, true\n\t\t}\n\t\tif !concurrencySet {\n\t\t\tclient.Concurrency = DefaultTigrisConcurrency\n\t\t}\n\t\tif partSize == 0 {\n\t\t\tclient.PartSize = DefaultTigrisPartSize\n\t\t}\n\t}\n\tif isHetzner || isDigitalOcean || isBackblaze || isFilebase || isScaleway || isCloudflareR2 || isMinIO || isSupabase {\n\t\t// All these providers require signed payloads (don't support UNSIGNED-PAYLOAD)\n\t\tif !signPayloadSet {\n\t\t\tsignPayload, signPayloadSet = true, true\n\t\t}\n\t}\n\tif !forcePathStyleSet {\n\t\t// Filebase, Backblaze B2, MinIO, and Supabase require path-style URLs\n\t\tif isFilebase || isBackblaze || isMinIO || isSupabase {\n\t\t\tforcePathStyle = true\n\t\t}\n\t}\n\tif isCloudflareR2 {\n\t\tclient.Concurrency = DefaultR2Concurrency\n\t}\n\n\t// Configure client\n\tclient.Bucket = bucket\n\tclient.Path = urlPath\n\tclient.Region = region\n\tclient.Endpoint = endpoint\n\tclient.ForcePathStyle = forcePathStyle\n\tclient.SkipVerify = skipVerify\n\n\tif signPayloadSet {\n\t\tclient.SignPayload = signPayload\n\t}\n\tif signAcceptEncodingSet {\n\t\tclient.SignAcceptEncoding = signAcceptEncoding\n\t}\n\tif requireMD5Set {\n\t\tclient.RequireContentMD5 = requireMD5\n\t}\n\tif concurrencySet {\n\t\tclient.Concurrency = concurrency\n\t}\n\tif partSize \u003e 0 {\n\t\tclient.PartSize = partSize\n\t}\n\tclient.StorageClass = storageClass\n\n\t// Parse SSE-C parameters from query string\n\tif v := query.Get(\"sseCustomerAlgorithm\"); v != \"\" {\n\t\tclient.SSECustomerAlgorithm = v\n\t} else if v := query.Get(\"sse-customer-algorithm\"); v != \"\" {\n\t\tclient.SSECustomerAlgorithm = v\n\t}\n\tif v := query.Get(\"sseCustomerKey\"); v != \"\" {\n\t\tclient.SSECustomerKey = v\n\t} else if v := query.Get(\"sse-customer-key\"); v != \"\" {\n\t\tclient.SSECustomerKey = v\n\t}\n\tif v := query.Get(\"sseCustomerKeyMD5\"); v != \"\" {\n\t\tclient.SSECustomerKeyMD5 = v\n\t} else if v := query.Get(\"sse-customer-key-md5\"); v != \"\" {\n\t\tclient.SSECustomerKeyMD5 = v\n\t}\n\n\t// Parse SSE-KMS parameters from query string\n\tif v := query.Get(\"sseKmsKeyId\"); v != \"\" {\n\t\tclient.SSEKMSKeyID = v\n\t} else if v := query.Get(\"sse-kms-key-id\"); v != \"\" {\n\t\tclient.SSEKMSKeyID = v\n\t}\n\n\treturn client, nil\n}\n\n// Type returns \"s3\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to S3. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) (err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.s3 != nil {\n\t\treturn nil\n\t}\n\n\t// Validate required configuration\n\tif c.Bucket == \"\" {\n\t\treturn fmt.Errorf(\"s3: bucket name is required\")\n\t}\n\n\t// Validate SSE configuration\n\tif err := c.validateSSEConfig(); err != nil {\n\t\treturn err\n\t}\n\n\t// Look up region if not specified and no endpoint is used.\n\t// Endpoints are typically used for non-S3 object stores and do not\n\t// necessarily require a region.\n\tregion := c.Region\n\tif region == \"\" {\n\t\tif c.Endpoint == \"\" {\n\t\t\tif region, err = c.findBucketRegion(ctx, c.Bucket); err != nil {\n\t\t\t\treturn fmt.Errorf(\"s3: cannot lookup bucket region: %w\", err)\n\t\t\t}\n\t\t} else {\n\t\t\tregion = DefaultRegion // default for non-S3 object stores\n\t\t}\n\t}\n\n\t// Create HTTP client with 24 hour timeout for long-running operations\n\thttpClient := \u0026http.Client{\n\t\tTimeout: 24 * time.Hour,\n\t}\n\n\t// Always configure custom HTTP Transport with controlled keepalive settings\n\t// to reduce idle CPU usage from default transport's aggressive keepalives.\n\t// See: https://github.com/benbjohnson/litestream/issues/992\n\thttpClient.Transport = \u0026http.Transport{\n\t\tProxy: http.ProxyFromEnvironment,\n\t\tDialContext: (\u0026net.Dialer{\n\t\t\tTimeout: 30 * time.Second,\n\t\t\tKeepAlive: 30 * time.Second,\n\t\t}).DialContext,\n\t\tForceAttemptHTTP2: true,\n\t\tMaxIdleConns: 100,\n\t\tIdleConnTimeout: 90 * time.Second,\n\t\tTLSHandshakeTimeout: 10 * time.Second,\n\t\tExpectContinueTimeout: 1 * time.Second,\n\t}\n\n\t// Configure TLS to skip verification if requested\n\tif c.SkipVerify {\n\t\thttpClient.Transport.(*http.Transport).TLSClientConfig = \u0026tls.Config{\n\t\t\tInsecureSkipVerify: true,\n\t\t}\n\t}\n\n\t// Build configuration options\n\tconfigOpts := []func(*config.LoadOptions) error{\n\t\tconfig.WithRegion(region),\n\t\tconfig.WithRetryer(newTransportRetryer),\n\t}\n\n\t// Add HTTP client with proper timeout\n\tconfigOpts = append(configOpts, config.WithHTTPClient(httpClient))\n\n\t// Add static credentials if provided, otherwise use default credential chain\n\t// Default credential chain includes:\n\t// - Environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)\n\t// - Shared credentials file (~/.aws/credentials)\n\t// - EC2 Instance Profile credentials\n\t// - ECS Task Role credentials\n\t// - Web Identity Token credentials (for EKS)\n\tif c.AccessKeyID != \"\" \u0026\u0026 c.SecretAccessKey != \"\" {\n\t\tconfigOpts = append(configOpts, config.WithCredentialsProvider(\n\t\t\tcredentials.NewStaticCredentialsProvider(c.AccessKeyID, c.SecretAccessKey, \"\"),\n\t\t))\n\t}\n\n\t// Enable AWS SDK debug logging if LITESTREAM_S3_DEBUG is set.\n\t// Useful for debugging S3-compatible providers (signing issues, request/response bodies).\n\t// Supports comma-separated values: signing,request,retries\n\t// Values: signing, request, request-with-body, response, response-with-body, retries, all\n\tif logMode := parseS3DebugEnv(); logMode != 0 {\n\t\tconfigOpts = append(configOpts, config.WithClientLogMode(logMode))\n\t}\n\n\t// Load AWS configuration\n\tcfg, err := config.LoadDefaultConfig(ctx, configOpts...)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"s3: cannot load aws config: %w\", err)\n\t}\n\n\t// Create S3 client options\n\ts3Opts := []func(*s3.Options){\n\t\tfunc(o *s3.Options) {\n\t\t\to.UsePathStyle = c.ForcePathStyle\n\t\t\to.UseARNRegion = true\n\t\t\t// Add User-Agent and optional middleware.\n\t\t\to.APIOptions = append(o.APIOptions, c.middlewareOption())\n\t\t},\n\t}\n\n\t// S3-compatible providers (Tigris, Backblaze B2, MinIO, Filebase, etc.) don't\n\t// support aws-chunked content encoding used by default checksum calculation\n\t// in AWS SDK Go v2 v1.73.0+. Disable automatic checksum calculation and\n\t// response checksum validation for all custom endpoints.\n\t// See: https://github.com/benbjohnson/litestream/issues/918\n\t// See: https://github.com/benbjohnson/litestream/issues/947\n\tif c.Endpoint != \"\" {\n\t\ts3Opts = append(s3Opts, func(o *s3.Options) {\n\t\t\to.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired\n\t\t\to.ResponseChecksumValidation = aws.ResponseChecksumValidationWhenRequired\n\t\t})\n\t}\n\n\t// Add custom endpoint if specified\n\tc.configureEndpoint(\u0026s3Opts)\n\n\t// Create S3 client\n\tc.s3 = s3.NewFromConfig(cfg, s3Opts...)\n\n\t// Configure uploader with custom options if specified\n\tuploaderOpts := []func(*manager.Uploader){}\n\n\t// For S3-compatible providers, disable automatic checksum calculation on the Uploader.\n\t// The S3 client's RequestChecksumCalculation setting only affects single-part uploads.\n\t// Multipart uploads via the Uploader require this separate setting (added in s3/manager v1.20.0).\n\t// See: https://github.com/benbjohnson/litestream/issues/948\n\t// See: https://github.com/aws/aws-sdk-go-v2/issues/3007\n\tif c.Endpoint != \"\" {\n\t\tuploaderOpts = append(uploaderOpts, func(u *manager.Uploader) {\n\t\t\tu.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired\n\t\t})\n\t}\n\n\tif c.PartSize \u003e 0 {\n\t\tuploaderOpts = append(uploaderOpts, func(u *manager.Uploader) {\n\t\t\tu.PartSize = c.PartSize\n\t\t})\n\t}\n\tif c.Concurrency \u003e 0 {\n\t\tuploaderOpts = append(uploaderOpts, func(u *manager.Uploader) {\n\t\t\tu.Concurrency = c.Concurrency\n\t\t})\n\t}\n\tc.uploader = manager.NewUploader(c.s3, uploaderOpts...)\n\n\treturn nil\n}\n\n// configureEndpoint adds custom endpoint configuration to S3 client options if needed.\nfunc (c *ReplicaClient) configureEndpoint(opts *[]func(*s3.Options)) {\n\tif c.Endpoint != \"\" {\n\t\t*opts = append(*opts, func(o *s3.Options) {\n\t\t\to.UsePathStyle = c.ForcePathStyle\n\n\t\t\tendpoint := c.Endpoint\n\t\t\t// Add scheme if not present\n\t\t\tif !strings.HasPrefix(endpoint, \"http://\") \u0026\u0026 !strings.HasPrefix(endpoint, \"https://\") {\n\t\t\t\tendpoint = \"https://\" + endpoint\n\t\t\t}\n\n\t\t\to.BaseEndpoint = aws.String(endpoint)\n\t\t\t// For MinIO and other S3-compatible services\n\t\t\tif strings.HasPrefix(endpoint, \"http://\") {\n\t\t\t\to.EndpointOptions.DisableHTTPS = true\n\t\t\t}\n\t\t})\n\t}\n}\n\n// validateSSEConfig validates server-side encryption configuration.\nfunc (c *ReplicaClient) validateSSEConfig() error {\n\t// Check mutual exclusivity: SSE-C and SSE-KMS cannot both be set\n\tif c.SSECustomerKey != \"\" \u0026\u0026 c.SSEKMSKeyID != \"\" {\n\t\treturn fmt.Errorf(\"s3: cannot use both sse-customer-key and sse-kms-key-id; they are mutually exclusive\")\n\t}\n\n\t// Validate SSE-C configuration\n\tif c.SSECustomerKey != \"\" {\n\t\t// Algorithm must be AES256 (or default to it)\n\t\tif c.SSECustomerAlgorithm == \"\" {\n\t\t\tc.SSECustomerAlgorithm = \"AES256\"\n\t\t} else if c.SSECustomerAlgorithm != \"AES256\" {\n\t\t\treturn fmt.Errorf(\"s3: sse-customer-algorithm must be AES256, got %q\", c.SSECustomerAlgorithm)\n\t\t}\n\n\t\t// Validate key is valid base64 and correct length (256 bits = 32 bytes)\n\t\tkeyBytes, err := base64.StdEncoding.DecodeString(c.SSECustomerKey)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"s3: sse-customer-key must be valid base64: %w\", err)\n\t\t}\n\t\tif len(keyBytes) != 32 {\n\t\t\treturn fmt.Errorf(\"s3: sse-customer-key must be 256-bit (32 bytes) when decoded, got %d bytes\", len(keyBytes))\n\t\t}\n\n\t\t// Auto-compute MD5 if not provided\n\t\tif c.SSECustomerKeyMD5 == \"\" {\n\t\t\tsum := md5.Sum(keyBytes)\n\t\t\tc.SSECustomerKeyMD5 = base64.StdEncoding.EncodeToString(sum[:])\n\t\t}\n\n\t\t// SSE-C requires HTTPS (except for localhost/private networks for testing)\n\t\tif c.Endpoint != \"\" {\n\t\t\tendpoint := c.Endpoint\n\t\t\tif !strings.HasPrefix(endpoint, \"http://\") \u0026\u0026 !strings.HasPrefix(endpoint, \"https://\") {\n\t\t\t\tendpoint = \"https://\" + endpoint\n\t\t\t}\n\t\t\tif strings.HasPrefix(endpoint, \"http://\") {\n\t\t\t\tu, err := url.Parse(endpoint)\n\t\t\t\tif err == nil {\n\t\t\t\t\thost := u.Hostname()\n\t\t\t\t\t// Allow localhost by name\n\t\t\t\t\tif host == \"localhost\" {\n\t\t\t\t\t\t// OK - localhost is allowed\n\t\t\t\t\t} else if ip := net.ParseIP(host); ip != nil \u0026\u0026 (ip.IsLoopback() || ip.IsPrivate()) {\n\t\t\t\t\t\t// OK - loopback (127.x.x.x) or private RFC1918 ranges (10.x, 172.16-31.x, 192.168.x)\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn fmt.Errorf(\"s3: sse-customer-key requires HTTPS endpoint (HTTP only allowed for localhost/private networks)\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// transportRetryMaxAttempts caps total attempts per operation; exponential\n// backoff between attempts still bounds request rate during outages.\nconst transportRetryMaxAttempts = 10\n\n// newTransportRetryer returns a retryer that keeps retrying through sustained\n// object-store transport flaps. The SDK's default token bucket (and the\n// adaptive mode previously configured here) only refills retry quota on\n// successful responses, so a sustained provider flap drains it to zero and\n// every subsequent operation fails fast (\"retry quota exceeded, 0 available\")\n// precisely when retrying matters most for a replication tool.\nfunc newTransportRetryer() aws.Retryer {\n\treturn retry.NewStandard(func(o *retry.StandardOptions) {\n\t\to.MaxAttempts = transportRetryMaxAttempts\n\t\to.RateLimiter = ratelimit.None\n\t\t// S3-compatible providers (observed: Tigris) load-shed with HTTP 408\n\t\t// and api error code \"RequestCanceled\", neither of which the SDK\n\t\t// classifies as retryable by default. Genuine client-side context\n\t\t// cancellation stays non-retryable via the standard retryer's\n\t\t// canceled-context check, which runs before these.\n\t\to.Retryables = append(o.Retryables,\n\t\t\tretry.RetryableHTTPStatusCode{Codes: map[int]struct{}{\n\t\t\t\thttp.StatusRequestTimeout: {},\n\t\t\t}},\n\t\t\tretry.RetryableErrorCode{Codes: map[string]struct{}{\n\t\t\t\t\"RequestCanceled\": {},\n\t\t\t}},\n\t\t)\n\t})\n}\n\n// findBucketRegion looks up the AWS region for a bucket. Returns blank if non-S3.\nfunc (c *ReplicaClient) findBucketRegion(ctx context.Context, bucket string) (string, error) {\n\t// Build a config with credentials but no region\n\tconfigOpts := []func(*config.LoadOptions) error{\n\t\tconfig.WithRetryer(newTransportRetryer),\n\t}\n\n\t// Add static credentials if provided\n\tif c.AccessKeyID != \"\" \u0026\u0026 c.SecretAccessKey != \"\" {\n\t\tconfigOpts = append(configOpts, config.WithCredentialsProvider(\n\t\t\tcredentials.NewStaticCredentialsProvider(c.AccessKeyID, c.SecretAccessKey, \"\"),\n\t\t))\n\t}\n\n\t// Load AWS configuration\n\tcfg, err := config.LoadDefaultConfig(ctx, configOpts...)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"s3: cannot load aws config for region lookup: %w\", err)\n\t}\n\n\t// Use default region for initial region lookup\n\tcfg.Region = DefaultRegion\n\n\t// Create S3 client options\n\ts3Opts := []func(*s3.Options){}\n\n\t// Configure custom endpoint for region lookup\n\tc.configureEndpoint(\u0026s3Opts)\n\n\tclient := s3.NewFromConfig(cfg, s3Opts...)\n\n\t// Get bucket location\n\tout, err := client.GetBucketLocation(ctx, \u0026s3.GetBucketLocationInput{\n\t\tBucket: aws.String(bucket),\n\t})\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Convert location constraint to region\n\tif out.LocationConstraint == \"\" {\n\t\treturn DefaultRegion, nil\n\t}\n\treturn string(out.LocationConstraint), nil\n}\n\n// LTXFiles returns an iterator over all LTX files on the replica for the given level.\n// When useMetadata is true, fetches accurate timestamps from S3 metadata via HeadObject.\n// This uses parallel batched requests (controlled by MetadataConcurrency) to avoid hangs\n// with large backup histories (see issue #930).\n// When false, uses fast LastModified timestamps from LIST operation.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, useMetadata bool) (ltx.FileIterator, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn newFileIterator(ctx, c, level, seek, useMetadata), nil\n}\n\n// OpenLTXFile returns a reader for an LTX file\n// Returns os.ErrNotExist if no matching index/offset is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar rangeStr string\n\tif size \u003e 0 {\n\t\trangeStr = fmt.Sprintf(\"bytes=%d-%d\", offset, offset+size-1)\n\t} else {\n\t\trangeStr = fmt.Sprintf(\"bytes=%d-\", offset)\n\t}\n\n\t// Build the key from the file info\n\tfilename := ltx.FormatFilename(minTXID, maxTXID)\n\tkey := c.Path + \"/\" + fmt.Sprintf(\"%04x/%s\", level, filename)\n\n\tinput := \u0026s3.GetObjectInput{\n\t\tBucket: aws.String(c.Bucket),\n\t\tKey: aws.String(key),\n\t\tRange: aws.String(rangeStr),\n\t}\n\n\t// Add SSE-C parameters if configured (required for reading SSE-C encrypted objects)\n\t// Note: SSE-KMS does not require parameters on read - decryption is automatic\n\tif c.SSECustomerKey != \"\" {\n\t\tinput.SSECustomerAlgorithm = aws.String(c.SSECustomerAlgorithm)\n\t\tinput.SSECustomerKey = aws.String(c.SSECustomerKey)\n\t\tinput.SSECustomerKeyMD5 = aws.String(c.SSECustomerKeyMD5)\n\t}\n\n\tout, err := c.s3.GetObject(ctx, input)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"s3: get object %s: %w\", key, err)\n\t}\n\treturn out.Body, nil\n}\n\n// WriteLTXFile writes an LTX file to the replica.\n// Extracts timestamp from LTX header and stores it in S3 metadata to preserve original creation time.\n// Objects smaller than the part size are written with a single PutObject call\n// to avoid the multipart upload manager's 5 MiB part buffers (issue #1327).\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, r io.Reader) (*ltx.FileInfo, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := ltx.FormatFilename(minTXID, maxTXID)\n\tkey := c.Path + \"/\" + fmt.Sprintf(\"%04x/%s\", level, filename)\n\n\tpartSize := int64(manager.DefaultUploadPartSize)\n\tif c.PartSize \u003e 0 {\n\t\tpartSize = c.PartSize\n\t}\n\n\t// The uploader rejects part sizes below the SDK minimum on every upload.\n\t// Fail identically here so the single-put path cannot mask the\n\t// misconfiguration for small objects.\n\tif partSize \u003c manager.MinUploadPartSize {\n\t\treturn nil, fmt.Errorf(\"s3: upload to %s: part size must be at least %d bytes\", key, manager.MinUploadPartSize)\n\t}\n\n\tsize, timestamp, etag, err := c.uploadLTX(ctx, key, r, partSize)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(size))\n\n\t// ETag indicates successful upload\n\tif etag == nil {\n\t\treturn nil, fmt.Errorf(\"s3: upload failed: no ETag returned\")\n\t}\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: size,\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// uploadLTX uploads LTX data from r to key, choosing between a single\n// PutObject and the multipart uploader based on the object size.\nfunc (c *ReplicaClient) uploadLTX(ctx context.Context, key string, r io.Reader, partSize int64) (int64, time.Time, *string, error) {\n\t// The L0 replication path passes the local LTX file, so the size is\n\t// known up front and the body stays seekable for SDK retries.\n\tif rs, ok := r.(io.ReadSeeker); ok {\n\t\tif start, err := rs.Seek(0, io.SeekCurrent); err == nil {\n\t\t\treturn c.uploadSizedLTX(ctx, key, rs, start, partSize)\n\t\t}\n\t\t// Reader does not support seeking (e.g. piped file descriptor);\n\t\t// nothing has been consumed, so treat it as an unsized stream.\n\t}\n\treturn c.uploadStreamedLTX(ctx, key, r, partSize)\n}\n\n// uploadSizedLTX uploads from a seekable reader whose size is known.\nfunc (c *ReplicaClient) uploadSizedLTX(ctx context.Context, key string, rs io.ReadSeeker, start, partSize int64) (int64, time.Time, *string, error) {\n\tend, err := rs.Seek(0, io.SeekEnd)\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: size ltx file %s: %w\", key, err)\n\t}\n\tsize := end - start\n\tif _, err := rs.Seek(start, io.SeekStart); err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: rewind ltx file %s: %w\", key, err)\n\t}\n\n\t// Extract timestamp from LTX header, then rewind so the upload sees the\n\t// full file.\n\thdr, _, err := ltx.PeekHeader(rs)\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\tif _, err := rs.Seek(start, io.SeekStart); err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: rewind ltx file %s: %w\", key, err)\n\t}\n\n\tinput := c.putObjectInput(key, timestamp)\n\tinput.Body = rs\n\n\tif size \u003c partSize {\n\t\tinput.ContentLength = aws.Int64(size)\n\t\tout, err := c.s3.PutObject(ctx, input)\n\t\tif err != nil {\n\t\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: put object %s: %w\", key, err)\n\t\t}\n\t\treturn size, timestamp, out.ETag, nil\n\t}\n\n\t// At or above the part size the uploader splits the seekable body into\n\t// section readers without copying it into part buffers.\n\tout, err := c.uploader.Upload(ctx, input)\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: upload to %s: %w\", key, err)\n\t}\n\treturn size, timestamp, out.ETag, nil\n}\n\n// uploadStreamedLTX uploads from a reader of unknown size, buffering up to\n// the part size to determine whether the object fits in a single PutObject.\nfunc (c *ReplicaClient) uploadStreamedLTX(ctx context.Context, key string, r io.Reader, partSize int64) (int64, time.Time, *string, error) {\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\thdr, _, err := ltx.PeekHeader(io.TeeReader(r, \u0026buf))\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\tif _, err := io.CopyN(\u0026buf, r, partSize-int64(buf.Len())); err != nil \u0026\u0026 !errors.Is(err, io.EOF) {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: buffer ltx stream %s: %w\", key, err)\n\t}\n\n\tinput := c.putObjectInput(key, timestamp)\n\n\t// Reaching EOF before the part size means the whole object is buffered.\n\tif size := int64(buf.Len()); size \u003c partSize {\n\t\tinput.Body = bytes.NewReader(buf.Bytes())\n\t\tinput.ContentLength = aws.Int64(size)\n\t\tout, err := c.s3.PutObject(ctx, input)\n\t\tif err != nil {\n\t\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: put object %s: %w\", key, err)\n\t\t}\n\t\treturn size, timestamp, out.ETag, nil\n\t}\n\n\t// Combine buffered prefix with rest of reader so nothing is re-read.\n\trc := internal.NewReadCounter(io.MultiReader(bytes.NewReader(buf.Bytes()), r))\n\tinput.Body = rc\n\tout, err := c.uploader.Upload(ctx, input)\n\tif err != nil {\n\t\treturn 0, time.Time{}, nil, fmt.Errorf(\"s3: upload to %s: %w\", key, err)\n\t}\n\treturn rc.N(), timestamp, out.ETag, nil\n}\n\n// putObjectInput returns a PutObjectInput populated with the client's write\n// parameters so the single-put and multipart paths stay in parity.\nfunc (c *ReplicaClient) putObjectInput(key string, timestamp time.Time) *s3.PutObjectInput {\n\tinput := \u0026s3.PutObjectInput{\n\t\tBucket: aws.String(c.Bucket),\n\t\tKey: aws.String(key),\n\t\t// Store timestamp in S3 metadata for accurate timestamp retrieval\n\t\tMetadata: map[string]string{\n\t\t\tMetadataKeyTimestamp: timestamp.Format(time.RFC3339Nano),\n\t\t},\n\t}\n\tif c.StorageClass != \"\" {\n\t\tinput.StorageClass = types.StorageClass(c.StorageClass)\n\t}\n\n\t// Add SSE-C parameters if configured\n\tif c.SSECustomerKey != \"\" {\n\t\tinput.SSECustomerAlgorithm = aws.String(c.SSECustomerAlgorithm)\n\t\tinput.SSECustomerKey = aws.String(c.SSECustomerKey)\n\t\tinput.SSECustomerKeyMD5 = aws.String(c.SSECustomerKeyMD5)\n\t}\n\n\t// Add SSE-KMS parameters if configured\n\tif c.SSEKMSKeyID != \"\" {\n\t\tinput.ServerSideEncryption = types.ServerSideEncryptionAwsKms\n\t\tinput.SSEKMSKeyId = aws.String(c.SSEKMSKeyID)\n\t}\n\n\treturn input\n}\n\nfunc (c *ReplicaClient) middlewareOption() func(*middleware.Stack) error {\n\treturn func(stack *middleware.Stack) error {\n\t\tif c.RequireContentMD5 {\n\t\t\tif err := stack.Serialize.Add(\n\t\t\t\tmiddleware.SerializeMiddlewareFunc(\n\t\t\t\t\t\"LitestreamComputeDeleteContentMD5\",\n\t\t\t\t\tfunc(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (\n\t\t\t\t\t\tout middleware.SerializeOutput, metadata middleware.Metadata, err error,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif middleware.GetOperationName(ctx) != \"DeleteObjects\" {\n\t\t\t\t\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinput, ok := in.Parameters.(*s3.DeleteObjectsInput)\n\t\t\t\t\t\tif !ok || input == nil || input.Delete == nil || len(input.Delete.Objects) == 0 {\n\t\t\t\t\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchecksum, err := computeDeleteObjectsContentMD5(input.Delete)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn out, metadata, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif checksum != \"\" {\n\t\t\t\t\t\t\tctx = middleware.WithStackValue(ctx, contentMD5StackKey{}, checksum)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn next.HandleSerialize(ctx, in)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t\tmiddleware.Before,\n\t\t\t); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif err := stack.Build.Add(\n\t\t\tmiddleware.BuildMiddlewareFunc(\n\t\t\t\t\"LitestreamUserAgent\",\n\t\t\t\tfunc(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\t\t\t\t\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n\t\t\t\t) {\n\t\t\t\t\tif req, ok := in.Request.(*smithyhttp.Request); ok {\n\t\t\t\t\t\tcurrent := req.Header.Get(\"User-Agent\")\n\t\t\t\t\t\tif current == \"\" {\n\t\t\t\t\t\t\treq.Header.Set(\"User-Agent\", \"litestream\")\n\t\t\t\t\t\t} else if !strings.Contains(current, \"litestream\") {\n\t\t\t\t\t\t\treq.Header.Set(\"User-Agent\", \"litestream \"+current)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn next.HandleBuild(ctx, in)\n\t\t\t\t},\n\t\t\t),\n\t\t\tmiddleware.After,\n\t\t); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif litestream.IsTigrisEndpoint(c.Endpoint) {\n\t\t\tif err := stack.Build.Add(\n\t\t\t\tmiddleware.BuildMiddlewareFunc(\n\t\t\t\t\t\"LitestreamTigrisConsistent\",\n\t\t\t\t\tfunc(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (\n\t\t\t\t\t\tout middleware.BuildOutput, metadata middleware.Metadata, err error,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif req, ok := in.Request.(*smithyhttp.Request); ok {\n\t\t\t\t\t\t\treq.Header.Set(\"X-Tigris-Consistent\", \"true\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next.HandleBuild(ctx, in)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t\tmiddleware.After,\n\t\t\t); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif !c.SignAcceptEncoding || litestream.IsGoogleCloudStorageEndpoint(c.Endpoint) {\n\t\t\tif err := stack.Finalize.Insert(\n\t\t\t\tmiddleware.FinalizeMiddlewareFunc(\n\t\t\t\t\t\"LitestreamRemoveAcceptEncoding\",\n\t\t\t\t\tfunc(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\t\t\t\t\t\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n\t\t\t\t\t) {\n\t\t\t\t\t\tif req, ok := in.Request.(*smithyhttp.Request); ok {\n\t\t\t\t\t\t\treq.Header.Del(\"Accept-Encoding\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t\t\"Signing\",\n\t\t\t\tmiddleware.Before,\n\t\t\t); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Many S3-compatible providers (e.g. Filebase) do not support SigV4\n\t\t// payload hashing. Switching to unsigned payload matches the behavior\n\t\t// of the AWS SDK v1 client used in Litestream v0.3.x and restores\n\t\t// compatibility.\n\t\tif !c.SignPayload {\n\t\t\t_ = v4.RemoveComputePayloadSHA256Middleware(stack)\n\t\t\tif err := v4.AddUnsignedPayloadMiddleware(stack); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t_ = v4.RemoveContentSHA256HeaderMiddleware(stack)\n\t\t\tif err := v4.AddContentSHA256HeaderMiddleware(stack); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Disable AWS SDK v2's trailing checksum middleware which uses\n\t\t// aws-chunked encoding. This is required for:\n\t\t// 1. UNSIGNED-PAYLOAD requests (aws-chunked + UNSIGNED-PAYLOAD is rejected by AWS)\n\t\t// 2. S3-compatible providers (Filebase, MinIO, Backblaze B2, etc.) that don't\n\t\t// support aws-chunked encoding at all\n\t\t// See: https://github.com/aws/aws-sdk-go-v2/discussions/2960\n\t\t// See: https://github.com/benbjohnson/litestream/issues/895\n\t\tif !c.SignPayload || c.Endpoint != \"\" {\n\t\t\tstack.Finalize.Remove(\"addInputChecksumTrailer\")\n\t\t}\n\n\t\t// Add debug logging middleware at the end of Finalize phase\n\t\t// so all headers (including X-Tigris-Consistent) are set\n\t\tif err := stack.Finalize.Add(\n\t\t\tmiddleware.FinalizeMiddlewareFunc(\n\t\t\t\t\"LitestreamDebugLogging\",\n\t\t\t\tfunc(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\t\t\t\t\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n\t\t\t\t) {\n\t\t\t\t\tif req, ok := in.Request.(*smithyhttp.Request); ok {\n\t\t\t\t\t\tc.logger.Debug(\"s3 request\",\n\t\t\t\t\t\t\t\"method\", req.Method,\n\t\t\t\t\t\t\t\"url\", req.URL.String(),\n\t\t\t\t\t\t\t\"x-tigris-consistent\", req.Header.Get(\"X-Tigris-Consistent\"),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t},\n\t\t\t),\n\t\t\tmiddleware.After,\n\t\t); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif !c.RequireContentMD5 {\n\t\t\treturn nil\n\t\t}\n\n\t\tmd5Middleware := func() middleware.FinalizeMiddleware {\n\t\t\treturn middleware.FinalizeMiddlewareFunc(\n\t\t\t\t\"LitestreamDeleteContentMD5\",\n\t\t\t\tfunc(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (\n\t\t\t\t\tout middleware.FinalizeOutput, metadata middleware.Metadata, err error,\n\t\t\t\t) {\n\t\t\t\t\tif middleware.GetOperationName(ctx) != \"DeleteObjects\" {\n\t\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t\t}\n\n\t\t\t\t\tchecksum, _ := middleware.GetStackValue(ctx, contentMD5StackKey{}).(string)\n\t\t\t\t\tif checksum == \"\" {\n\t\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t\t}\n\n\t\t\t\t\treq, ok := in.Request.(*smithyhttp.Request)\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t\t}\n\t\t\t\t\tif req.Header.Get(\"Content-MD5\") == \"\" {\n\t\t\t\t\t\treq.Header.Set(\"Content-MD5\", checksum)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn next.HandleFinalize(ctx, in)\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\n\t\t// Try to insert before AWS's checksum middleware for optimal ordering.\n\t\t// If that middleware doesn't exist (e.g., different SDK version), add at the end.\n\t\t// Our middleware checks if Content-MD5 is already set, so order is not critical.\n\t\tif err := stack.Finalize.Insert(md5Middleware(), \"AWSChecksum:ComputeInputPayloadChecksum\", middleware.Before); err != nil {\n\t\t\tif err := stack.Finalize.Add(md5Middleware(), middleware.After); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t}\n}\n\nfunc computeDeleteObjectsContentMD5(deleteInput *types.Delete) (string, error) {\n\tif deleteInput == nil {\n\t\treturn \"\", nil\n\t}\n\n\tpayload, err := marshalDeleteObjects(deleteInput)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif len(payload) == 0 {\n\t\treturn \"\", nil\n\t}\n\n\tsum := md5.Sum(payload)\n\treturn base64.StdEncoding.EncodeToString(sum[:]), nil\n}\n\nfunc marshalDeleteObjects(deleteInput *types.Delete) ([]byte, error) {\n\tif deleteInput == nil {\n\t\treturn nil, nil\n\t}\n\n\tvar buf bytes.Buffer\n\tencoder := smithyxml.NewEncoder(\u0026buf)\n\troot := smithyxml.StartElement{\n\t\tName: smithyxml.Name{\n\t\t\tLocal: \"Delete\",\n\t\t},\n\t\tAttr: []smithyxml.Attr{\n\t\t\tsmithyxml.NewNamespaceAttribute(\"\", \"http://s3.amazonaws.com/doc/2006-03-01/\"),\n\t\t},\n\t}\n\n\tif err := encodeDeleteDocument(deleteInput, encoder.RootElement(root)); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn encoder.Bytes(), nil\n}\n\nfunc encodeDeleteDocument(v *types.Delete, value smithyxml.Value) error {\n\tdefer value.Close()\n\tif v.Objects != nil {\n\t\troot := smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"Object\",\n\t\t\t},\n\t\t}\n\t\tel := value.FlattenedElement(root)\n\t\tif err := encodeObjectIdentifierList(v.Objects, el); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif v.Quiet != nil {\n\t\troot := smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"Quiet\",\n\t\t\t},\n\t\t}\n\t\tel := value.MemberElement(root)\n\t\tel.Boolean(*v.Quiet)\n\t}\n\treturn nil\n}\n\nfunc encodeObjectIdentifierList(v []types.ObjectIdentifier, value smithyxml.Value) error {\n\tif !value.IsFlattened() {\n\t\tdefer value.Close()\n\t}\n\n\tarray := value.Array()\n\tfor i := range v {\n\t\tmember := array.Member()\n\t\tif err := encodeObjectIdentifier(\u0026v[i], member); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// encodeObjectIdentifier mirrors the AWS SDK's XML serializer for DeleteObjects.\n// This ensures our precomputed Content-MD5 matches the actual request body.\n// Includes all ObjectIdentifier fields as of AWS SDK v2 (2024).\nfunc encodeObjectIdentifier(v *types.ObjectIdentifier, value smithyxml.Value) error {\n\tdefer value.Close()\n\tif v.ETag != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"ETag\",\n\t\t\t},\n\t\t})\n\t\tel.String(*v.ETag)\n\t}\n\tif v.Key != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"Key\",\n\t\t\t},\n\t\t})\n\t\tel.String(*v.Key)\n\t}\n\tif v.LastModifiedTime != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"LastModifiedTime\",\n\t\t\t},\n\t\t})\n\t\tel.String(smithytime.FormatHTTPDate(*v.LastModifiedTime))\n\t}\n\tif v.Size != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"Size\",\n\t\t\t},\n\t\t})\n\t\tel.Long(*v.Size)\n\t}\n\tif v.VersionId != nil {\n\t\tel := value.MemberElement(smithyxml.StartElement{\n\t\t\tName: smithyxml.Name{\n\t\t\t\tLocal: \"VersionId\",\n\t\t\t},\n\t\t})\n\t\tel.String(*v.VersionId)\n\t}\n\treturn nil\n}\n\n// DeleteLTXFiles deletes one or more LTX files.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\n\t// Convert file infos to object identifiers\n\tobjIDs := make([]types.ObjectIdentifier, 0, len(a))\n\tfor _, info := range a {\n\t\tfilename := ltx.FormatFilename(info.MinTXID, info.MaxTXID)\n\t\tkey := c.Path + \"/\" + fmt.Sprintf(\"%04x/%s\", info.Level, filename)\n\t\tobjIDs = append(objIDs, types.ObjectIdentifier{Key: aws.String(key)})\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"key\", key)\n\t}\n\n\t// Delete in batches\n\tfor len(objIDs) \u003e 0 {\n\t\tn := min(len(objIDs), MaxKeys)\n\n\t\tc.logger.Debug(\"deleting ltx files batch\", \"count\", n)\n\n\t\tstart := time.Now()\n\t\tout, err := c.s3.DeleteObjects(ctx, \u0026s3.DeleteObjectsInput{\n\t\t\tBucket: aws.String(c.Bucket),\n\t\t\tDelete: \u0026types.Delete{Objects: objIDs[:n]},\n\t\t})\n\t\tduration := time.Since(start)\n\t\tinternal.OperationDurationHistogramVec.WithLabelValues(ReplicaClientType, \"DELETE\").Observe(duration.Seconds())\n\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"s3: delete batch of %d objects: %w\", n, err)\n\t\t}\n\n\t\tdeleted := 0\n\t\tif out != nil {\n\t\t\tdeleted = len(out.Deleted)\n\t\t}\n\t\tc.logger.Debug(\"delete batch completed\",\n\t\t\t\"requested\", n,\n\t\t\t\"deleted\", deleted,\n\t\t\t\"errors\", len(out.Errors),\n\t\t\t\"duration_ms\", duration.Milliseconds())\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Add(float64(deleted))\n\n\t\tif len(out.Errors) \u003e 0 {\n\t\t\tfor i, e := range out.Errors {\n\t\t\t\tcode := aws.ToString(e.Code)\n\t\t\t\tinternal.OperationErrorCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\", code).Inc()\n\n\t\t\t\tif i \u003c 5 {\n\t\t\t\t\tc.logger.Warn(\"delete object failed\",\n\t\t\t\t\t\t\"key\", aws.ToString(e.Key),\n\t\t\t\t\t\t\"code\", code,\n\t\t\t\t\t\t\"message\", aws.ToString(e.Message))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif len(out.Errors) \u003e 5 {\n\t\t\t\tc.logger.Warn(\"additional delete errors suppressed\", \"count\", len(out.Errors)-5)\n\t\t\t}\n\t\t}\n\n\t\tif err := deleteOutputError(out); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjIDs = objIDs[n:]\n\t}\n\n\treturn nil\n}\n\n// DeleteAll deletes all files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn err\n\t}\n\n\tvar objIDs []types.ObjectIdentifier\n\n\t// Create paginator for listing objects\n\tpaginator := s3.NewListObjectsV2Paginator(c.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(c.Bucket),\n\t\tPrefix: aws.String(c.Path + \"/\"),\n\t})\n\n\t// Iterate through all pages\n\tfor paginator.HasMorePages() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"s3: list objects page: %w\", err)\n\t\t}\n\n\t\t// Collect object identifiers\n\t\tfor _, obj := range page.Contents {\n\t\t\tobjIDs = append(objIDs, types.ObjectIdentifier{Key: obj.Key})\n\t\t}\n\t}\n\n\t// Delete all collected objects in batches\n\tfor len(objIDs) \u003e 0 {\n\t\tn := min(len(objIDs), MaxKeys)\n\n\t\tout, err := c.s3.DeleteObjects(ctx, \u0026s3.DeleteObjectsInput{\n\t\t\tBucket: aws.String(c.Bucket),\n\t\t\tDelete: \u0026types.Delete{Objects: objIDs[:n], Quiet: aws.Bool(true)},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"s3: delete all batch of %d objects: %w\", n, err)\n\t\t} else if err := deleteOutputError(out); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tobjIDs = objIDs[n:]\n\t}\n\n\treturn nil\n}\n\n// GenerationsV3 returns a list of v0.3.x generation IDs in the replica.\nfunc (c *ReplicaClient) GenerationsV3(ctx context.Context) ([]string, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tprefix := litestream.GenerationsPathV3(c.Path) + \"/\"\n\n\t// Use CommonPrefixes with delimiter to list \"directories\"\n\tpaginator := s3.NewListObjectsV2Paginator(c.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(c.Bucket),\n\t\tPrefix: aws.String(prefix),\n\t\tDelimiter: aws.String(\"/\"),\n\t})\n\n\tvar generations []string\n\tfor paginator.HasMorePages() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"s3: list generations: %w\", err)\n\t\t}\n\n\t\tfor _, cp := range page.CommonPrefixes {\n\t\t\t// Extract generation ID from prefix (e.g., \"path/generations/abc123def456/\" -\u003e \"abc123def456\")\n\t\t\tp := aws.ToString(cp.Prefix)\n\t\t\tp = strings.TrimPrefix(p, prefix)\n\t\t\tp = strings.TrimSuffix(p, \"/\")\n\t\t\tif litestream.IsGenerationIDV3(p) {\n\t\t\t\tgenerations = append(generations, p)\n\t\t\t}\n\t\t}\n\t}\n\n\tslices.Sort(generations)\n\treturn generations, nil\n}\n\n// SnapshotsV3 returns snapshots for a generation, sorted by index.\nfunc (c *ReplicaClient) SnapshotsV3(ctx context.Context, generation string) ([]litestream.SnapshotInfoV3, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tprefix := litestream.SnapshotsPathV3(c.Path, generation) + \"/\"\n\n\tpaginator := s3.NewListObjectsV2Paginator(c.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(c.Bucket),\n\t\tPrefix: aws.String(prefix),\n\t})\n\n\tvar snapshots []litestream.SnapshotInfoV3\n\tfor paginator.HasMorePages() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"s3: list snapshots: %w\", err)\n\t\t}\n\n\t\tfor _, obj := range page.Contents {\n\t\t\tkey := path.Base(aws.ToString(obj.Key))\n\t\t\tindex, err := litestream.ParseSnapshotFilenameV3(key)\n\t\t\tif err != nil {\n\t\t\t\tcontinue // skip invalid filenames\n\t\t\t}\n\n\t\t\tsnapshots = append(snapshots, litestream.SnapshotInfoV3{\n\t\t\t\tGeneration: generation,\n\t\t\t\tIndex: index,\n\t\t\t\tSize: aws.ToInt64(obj.Size),\n\t\t\t\tCreatedAt: aws.ToTime(obj.LastModified).UTC(),\n\t\t\t})\n\t\t}\n\t}\n\n\tslices.SortFunc(snapshots, func(a, b litestream.SnapshotInfoV3) int {\n\t\treturn a.Index - b.Index\n\t})\n\treturn snapshots, nil\n}\n\n// WALSegmentsV3 returns WAL segments for a generation, sorted by index then offset.\nfunc (c *ReplicaClient) WALSegmentsV3(ctx context.Context, generation string) ([]litestream.WALSegmentInfoV3, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tprefix := litestream.WALPathV3(c.Path, generation) + \"/\"\n\n\tpaginator := s3.NewListObjectsV2Paginator(c.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(c.Bucket),\n\t\tPrefix: aws.String(prefix),\n\t})\n\n\tvar segments []litestream.WALSegmentInfoV3\n\tfor paginator.HasMorePages() {\n\t\tpage, err := paginator.NextPage(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"s3: list wal segments: %w\", err)\n\t\t}\n\n\t\tfor _, obj := range page.Contents {\n\t\t\tkey := path.Base(aws.ToString(obj.Key))\n\t\t\tindex, offset, err := litestream.ParseWALSegmentFilenameV3(key)\n\t\t\tif err != nil {\n\t\t\t\tcontinue // skip invalid filenames\n\t\t\t}\n\n\t\t\tsegments = append(segments, litestream.WALSegmentInfoV3{\n\t\t\t\tGeneration: generation,\n\t\t\t\tIndex: index,\n\t\t\t\tOffset: offset,\n\t\t\t\tSize: aws.ToInt64(obj.Size),\n\t\t\t\tCreatedAt: aws.ToTime(obj.LastModified).UTC(),\n\t\t\t})\n\t\t}\n\t}\n\n\tslices.SortFunc(segments, func(a, b litestream.WALSegmentInfoV3) int {\n\t\tif a.Index != b.Index {\n\t\t\treturn a.Index - b.Index\n\t\t}\n\t\treturn cmp.Compare(a.Offset, b.Offset)\n\t})\n\treturn segments, nil\n}\n\n// OpenSnapshotV3 opens a v0.3.x snapshot file for reading.\n// The returned reader provides LZ4-decompressed data.\nfunc (c *ReplicaClient) OpenSnapshotV3(ctx context.Context, generation string, index int) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.SnapshotPathV3(c.Path, generation, index)\n\n\tinput := \u0026s3.GetObjectInput{\n\t\tBucket: aws.String(c.Bucket),\n\t\tKey: aws.String(key),\n\t}\n\n\t// Add SSE-C parameters if configured\n\tif c.SSECustomerKey != \"\" {\n\t\tinput.SSECustomerAlgorithm = aws.String(c.SSECustomerAlgorithm)\n\t\tinput.SSECustomerKey = aws.String(c.SSECustomerKey)\n\t\tinput.SSECustomerKeyMD5 = aws.String(c.SSECustomerKeyMD5)\n\t}\n\n\tout, err := c.s3.GetObject(ctx, input)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"s3: get snapshot %s: %w\", key, err)\n\t}\n\n\treturn internal.NewLZ4Reader(out.Body), nil\n}\n\n// OpenWALSegmentV3 opens a v0.3.x WAL segment file for reading.\n// The returned reader provides LZ4-decompressed data.\nfunc (c *ReplicaClient) OpenWALSegmentV3(ctx context.Context, generation string, index int, offset int64) (io.ReadCloser, error) {\n\tif err := c.Init(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey := litestream.WALSegmentPathV3(c.Path, generation, index, offset)\n\n\tinput := \u0026s3.GetObjectInput{\n\t\tBucket: aws.String(c.Bucket),\n\t\tKey: aws.String(key),\n\t}\n\n\t// Add SSE-C parameters if configured\n\tif c.SSECustomerKey != \"\" {\n\t\tinput.SSECustomerAlgorithm = aws.String(c.SSECustomerAlgorithm)\n\t\tinput.SSECustomerKey = aws.String(c.SSECustomerKey)\n\t\tinput.SSECustomerKeyMD5 = aws.String(c.SSECustomerKeyMD5)\n\t}\n\n\tout, err := c.s3.GetObject(ctx, input)\n\tif err != nil {\n\t\tif isNotExists(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"s3: get wal segment %s: %w\", key, err)\n\t}\n\n\treturn internal.NewLZ4Reader(out.Body), nil\n}\n\n// fileIterator represents an iterator over LTX files in S3.\ntype fileIterator struct {\n\tctx context.Context\n\tcancel context.CancelFunc\n\tclient *ReplicaClient\n\tlevel int\n\tseek ltx.TXID\n\tprefix string\n\n\tuseMetadata bool // When true, fetch accurate timestamps from metadata\n\tmetadataCache map[string]time.Time // key -\u003e timestamp cache for batch fetches\n\n\tpaginator *s3.ListObjectsV2Paginator\n\tpage *s3.ListObjectsV2Output\n\tpageIndex int\n\n\tclosed bool\n\terr error\n\tinfo *ltx.FileInfo\n}\n\nfunc newFileIterator(ctx context.Context, client *ReplicaClient, level int, seek ltx.TXID, useMetadata bool) *fileIterator {\n\tctx, cancel := context.WithCancel(ctx)\n\n\tprefix := client.Path + \"/\" + fmt.Sprintf(\"%04x/\", level)\n\titr := \u0026fileIterator{\n\t\tctx: ctx,\n\t\tcancel: cancel,\n\t\tclient: client,\n\t\tlevel: level,\n\t\tseek: seek,\n\t\tprefix: prefix,\n\t\tuseMetadata: useMetadata,\n\t\tmetadataCache: make(map[string]time.Time),\n\t}\n\n\t// Create paginator for listing objects with level prefix\n\titr.paginator = s3.NewListObjectsV2Paginator(client.s3, \u0026s3.ListObjectsV2Input{\n\t\tBucket: aws.String(client.Bucket),\n\t\tPrefix: aws.String(prefix),\n\t})\n\n\treturn itr\n}\n\n// fetchMetadataBatch fetches timestamps from S3 metadata for a batch of keys in parallel.\nfunc (itr *fileIterator) fetchMetadataBatch(keys []string) error {\n\tif len(keys) == 0 {\n\t\treturn nil\n\t}\n\n\t// Determine concurrency limit\n\tconcurrency := itr.client.MetadataConcurrency\n\tif concurrency \u003c= 0 {\n\t\tconcurrency = DefaultMetadataConcurrency\n\t}\n\n\t// Pre-allocate results map to avoid lock contention during writes\n\tresults := make(map[string]time.Time, len(keys))\n\tvar mu sync.Mutex\n\n\t// Use x/sync/semaphore for precise concurrency control with context support\n\tsem := semaphore.NewWeighted(int64(concurrency))\n\tg, ctx := errgroup.WithContext(itr.ctx)\n\n\tfor _, key := range keys {\n\t\tkey := key // capture for goroutine\n\n\t\tg.Go(func() error {\n\t\t\t// Acquire semaphore slot (blocking with context cancellation)\n\t\t\tif err := sem.Acquire(ctx, 1); err != nil {\n\t\t\t\treturn err // context cancelled\n\t\t\t}\n\t\t\tdefer sem.Release(1)\n\n\t\t\theadInput := \u0026s3.HeadObjectInput{\n\t\t\t\tBucket: aws.String(itr.client.Bucket),\n\t\t\t\tKey: aws.String(key),\n\t\t\t}\n\n\t\t\t// Add SSE-C parameters if configured (required for reading SSE-C encrypted objects)\n\t\t\t// Note: SSE-KMS does not require parameters on HeadObject - access is automatic\n\t\t\tif itr.client.SSECustomerKey != \"\" {\n\t\t\t\theadInput.SSECustomerAlgorithm = aws.String(itr.client.SSECustomerAlgorithm)\n\t\t\t\theadInput.SSECustomerKey = aws.String(itr.client.SSECustomerKey)\n\t\t\t\theadInput.SSECustomerKeyMD5 = aws.String(itr.client.SSECustomerKeyMD5)\n\t\t\t}\n\n\t\t\thead, err := itr.client.s3.HeadObject(ctx, headInput)\n\t\t\tif err != nil {\n\t\t\t\t// Non-fatal: file might not have metadata, use LastModified\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\tif head.Metadata != nil {\n\t\t\t\tif ts, ok := head.Metadata[MetadataKeyTimestamp]; ok {\n\t\t\t\t\tif parsed, err := time.Parse(time.RFC3339Nano, ts); err == nil {\n\t\t\t\t\t\tmu.Lock()\n\t\t\t\t\t\tresults[key] = parsed\n\t\t\t\t\t\tmu.Unlock()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t}\n\n\tif err := g.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\t// Merge results into cache\n\tfor k, v := range results {\n\t\titr.metadataCache[k] = v\n\t}\n\treturn nil\n}\n\n// Close stops iteration and returns any error that occurred during iteration.\nfunc (itr *fileIterator) Close() (err error) {\n\titr.closed = true\n\titr.cancel()\n\treturn itr.err\n}\n\n// Next returns the next file. Returns false when no more files are available.\nfunc (itr *fileIterator) Next() bool {\n\tif itr.closed || itr.err != nil {\n\t\treturn false\n\t}\n\n\t// Process objects until we find a valid LTX file\n\tfor {\n\t\t// Load next page if needed\n\t\tif itr.page == nil || itr.pageIndex \u003e= len(itr.page.Contents) {\n\t\t\tif !itr.paginator.HasMorePages() {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tvar err error\n\t\t\titr.page, err = itr.paginator.NextPage(itr.ctx)\n\t\t\tif err != nil {\n\t\t\t\titr.err = err\n\t\t\t\treturn false\n\t\t\t}\n\t\t\titr.pageIndex = 0\n\n\t\t\t// Log page contents for debugging.\n\t\t\tif len(itr.page.Contents) \u003e 0 {\n\t\t\t\tkeys := make([]string, 0, len(itr.page.Contents))\n\t\t\t\tfor _, obj := range itr.page.Contents {\n\t\t\t\t\tkeys = append(keys, path.Base(aws.ToString(obj.Key)))\n\t\t\t\t}\n\t\t\t\titr.client.logger.Debug(\"s3 LIST page\", \"prefix\", itr.prefix, \"keys\", keys)\n\t\t\t}\n\n\t\t\t// Batch fetch metadata for the entire page when useMetadata is true.\n\t\t\t// This uses parallel HeadObject calls controlled by MetadataConcurrency\n\t\t\t// to avoid the O(N) sequential calls that caused restore hangs (issue #930).\n\t\t\tif itr.useMetadata \u0026\u0026 len(itr.page.Contents) \u003e 0 {\n\t\t\t\tkeys := make([]string, 0, len(itr.page.Contents))\n\t\t\t\tfor _, obj := range itr.page.Contents {\n\t\t\t\t\tkeys = append(keys, aws.ToString(obj.Key))\n\t\t\t\t}\n\t\t\t\tif err := itr.fetchMetadataBatch(keys); err != nil {\n\t\t\t\t\titr.err = err\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process current object\n\t\tif itr.pageIndex \u003c len(itr.page.Contents) {\n\t\t\tobj := itr.page.Contents[itr.pageIndex]\n\t\t\titr.pageIndex++\n\n\t\t\t// Extract file info from key\n\t\t\tfullKey := aws.ToString(obj.Key)\n\t\t\tkey := path.Base(fullKey)\n\t\t\tminTXID, maxTXID, err := ltx.ParseFilename(key)\n\t\t\tif err != nil {\n\t\t\t\tcontinue // Skip non-LTX files\n\t\t\t}\n\n\t\t\t// Build file info\n\t\t\tinfo := \u0026ltx.FileInfo{\n\t\t\t\tLevel: itr.level,\n\t\t\t\tMinTXID: minTXID,\n\t\t\t\tMaxTXID: maxTXID,\n\t\t\t}\n\n\t\t\t// Skip if below seek TXID\n\t\t\tif info.MinTXID \u003c itr.seek {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Skip if wrong level\n\t\t\tif info.Level != itr.level {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Set file info\n\t\t\tinfo.Size = aws.ToInt64(obj.Size)\n\n\t\t\t// Use cached metadata timestamp if available (from batch fetch),\n\t\t\t// otherwise fallback to LastModified from LIST operation.\n\t\t\tif itr.useMetadata {\n\t\t\t\tif ts, ok := itr.metadataCache[fullKey]; ok {\n\t\t\t\t\tinfo.CreatedAt = ts\n\t\t\t\t} else {\n\t\t\t\t\tinfo.CreatedAt = aws.ToTime(obj.LastModified).UTC()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinfo.CreatedAt = aws.ToTime(obj.LastModified).UTC()\n\t\t\t}\n\n\t\t\titr.info = info\n\t\t\treturn true\n\t\t}\n\t}\n}\n\n// Item returns the metadata for the current file.\nfunc (itr *fileIterator) Item() *ltx.FileInfo {\n\treturn itr.info\n}\n\n// Err returns any error that occurred during iteration.\nfunc (itr *fileIterator) Err() error {\n\treturn itr.err\n}\n\n// ParseURL parses an S3 URL into its host and path parts.\n// If endpoint is set, it can override the host.\nfunc ParseURL(s, endpoint string) (bucket, region, key string, err error) {\n\tu, err := url.Parse(s)\n\tif err != nil {\n\t\treturn \"\", \"\", \"\", err\n\t}\n\n\tif u.Scheme != \"s3\" {\n\t\treturn \"\", \"\", \"\", fmt.Errorf(\"s3: invalid url scheme\")\n\t}\n\n\t// Special handling for filebase.com\n\tif u.Host == \"filebase.com\" {\n\t\tparts := strings.SplitN(strings.TrimPrefix(u.Path, \"/\"), \"/\", 2)\n\t\tif len(parts) == 0 {\n\t\t\treturn \"\", \"\", \"\", fmt.Errorf(\"s3: bucket required\")\n\t\t}\n\t\tbucket = parts[0]\n\t\tif len(parts) \u003e 1 {\n\t\t\tkey = parts[1]\n\t\t}\n\t\treturn bucket, \"\", key, nil\n\t}\n\n\t// For other hosts, check if it's a special endpoint\n\tbucket, region, _, _ = ParseHost(u.Host)\n\tif bucket == \"\" {\n\t\tbucket = u.Host\n\t}\n\n\tkey = strings.TrimPrefix(u.Path, \"/\")\n\treturn bucket, region, key, nil\n}\n\n// ParseHost parses the host/endpoint for an S3-like storage system.\n// Endpoints: https://docs.aws.amazon.com/general/latest/gr/s3.html\nfunc ParseHost(host string) (bucket, region, endpoint string, forcePathStyle bool) {\n\t// Check for MinIO-style hosts (bucket.host:port)\n\tif strings.Contains(host, \":\") \u0026\u0026 !strings.Contains(host, \".com\") {\n\t\tparts := strings.SplitN(host, \".\", 2)\n\t\tif len(parts) == 2 {\n\t\t\t// Extract bucket from bucket.host:port format\n\t\t\tbucket = parts[0]\n\t\t\tendpoint = \"http://\" + parts[1]\n\t\t\treturn bucket, DefaultRegion, endpoint, true\n\t\t}\n\t\t// No bucket in host, just host:port\n\t\treturn \"\", \"\", \"http://\" + host, true\n\t}\n\n\t// Check common object storage providers\n\t// Check for AWS S3 URLs first\n\tif a := awsS3Regex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tif len(a) \u003e 2 \u0026\u0026 a[2] != \"\" {\n\t\t\tregion = a[2]\n\t\t}\n\t\treturn bucket, region, \"\", false\n\t} else if a := digitaloceanRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tregion = a[2]\n\t\treturn bucket, region, fmt.Sprintf(\"https://%s.digitaloceanspaces.com\", region), false\n\t} else if a := backblazeRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tregion = a[2]\n\t\tbucket = a[1]\n\t\tendpoint = fmt.Sprintf(\"https://s3.%s.backblazeb2.com\", region)\n\t\treturn bucket, region, endpoint, true\n\t} else if a := filebaseRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tbucket = a[1]\n\t\tendpoint = \"s3.filebase.com\"\n\t\treturn bucket, \"\", endpoint, false\n\t} else if a := scalewayRegex.FindStringSubmatch(host); len(a) \u003e 1 {\n\t\tregion = a[2]\n\t\tbucket = a[1]\n\t\tendpoint = fmt.Sprintf(\"s3.%s.scw.cloud\", region)\n\t\treturn bucket, region, endpoint, false\n\t}\n\n\t// For standard S3, the host is the bucket name\n\treturn host, \"\", \"\", false\n}\n\nvar (\n\tawsS3Regex = regexp.MustCompile(`^(.+)\\.s3(?:\\.([^.]+))?\\.amazonaws\\.com$`)\n\tdigitaloceanRegex = regexp.MustCompile(`^(?:(.+)\\.)?([^.]+)\\.digitaloceanspaces.com$`)\n\tbackblazeRegex = regexp.MustCompile(`^(?:(.+)\\.)?s3.([^.]+)\\.backblazeb2.com$`)\n\tfilebaseRegex = regexp.MustCompile(`^(?:(.+)\\.)?s3.filebase.com$`)\n\tscalewayRegex = regexp.MustCompile(`^(?:(.+)\\.)?s3.([^.]+)\\.scw\\.cloud$`)\n)\n\nfunc isNotExists(err error) bool {\n\tvar apiErr smithy.APIError\n\tif errors.As(err, \u0026apiErr) {\n\t\treturn apiErr.ErrorCode() == \"NoSuchKey\"\n\t}\n\treturn false\n}\n\nfunc deleteOutputError(out *s3.DeleteObjectsOutput) error {\n\tif len(out.Errors) == 0 {\n\t\treturn nil\n\t}\n\n\t// Build generic error\n\tvar b strings.Builder\n\tb.WriteString(\"failed to delete files:\")\n\tfor _, err := range out.Errors {\n\t\tfmt.Fprintf(\u0026b, \"\\n%s: %s\", aws.ToString(err.Key), aws.ToString(err.Message))\n\t}\n\treturn errors.New(b.String())\n}\n\n// parseS3DebugEnv parses the LITESTREAM_S3_DEBUG environment variable and returns\n// the corresponding AWS SDK ClientLogMode. Supports comma-separated values.\nfunc parseS3DebugEnv() aws.ClientLogMode {\n\tv := os.Getenv(\"LITESTREAM_S3_DEBUG\")\n\tif v == \"\" {\n\t\treturn 0\n\t}\n\n\tvar logMode aws.ClientLogMode\n\tfor _, mode := range strings.Split(v, \",\") {\n\t\tswitch strings.ToLower(strings.TrimSpace(mode)) {\n\t\tcase \"signing\":\n\t\t\tlogMode |= aws.LogSigning\n\t\tcase \"request\":\n\t\t\tlogMode |= aws.LogRequest\n\t\tcase \"request-with-body\":\n\t\t\tlogMode |= aws.LogRequestWithBody\n\t\tcase \"response\":\n\t\t\tlogMode |= aws.LogResponse\n\t\tcase \"response-with-body\":\n\t\t\tlogMode |= aws.LogResponseWithBody\n\t\tcase \"retries\":\n\t\t\tlogMode |= aws.LogRetries\n\t\tcase \"all\":\n\t\t\tlogMode |= aws.LogSigning | aws.LogRequest | aws.LogRequestWithBody |\n\t\t\t\taws.LogResponse | aws.LogResponseWithBody | aws.LogRetries\n\t\tdefault:\n\t\t\tslog.Warn(\"unknown LITESTREAM_S3_DEBUG value, expected: signing, request, request-with-body, response, response-with-body, retries, all\", \"value\", mode)\n\t\t}\n\t}\n\treturn logMode\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[21,29]}},{"name":"cmp","path":"cmp","span":{"start":[5,1],"end":[5,7],"bytes":[30,36]}},{"name":"context","path":"context","span":{"start":[6,1],"end":[6,11],"bytes":[37,47]}},{"name":"md5","path":"crypto/md5","span":{"start":[7,1],"end":[7,14],"bytes":[48,61]}},{"name":"tls","path":"crypto/tls","span":{"start":[8,1],"end":[8,14],"bytes":[62,75]}},{"name":"base64","path":"encoding/base64","span":{"start":[9,1],"end":[9,19],"bytes":[76,94]}},{"name":"errors","path":"errors","span":{"start":[10,1],"end":[10,10],"bytes":[95,104]}},{"name":"fmt","path":"fmt","span":{"start":[11,1],"end":[11,7],"bytes":[105,111]}},{"name":"io","path":"io","span":{"start":[12,1],"end":[12,6],"bytes":[112,117]}},{"name":"slog","path":"log/slog","span":{"start":[13,1],"end":[13,12],"bytes":[118,129]}},{"name":"net","path":"net","span":{"start":[14,1],"end":[14,7],"bytes":[130,136]}},{"name":"http","path":"net/http","span":{"start":[15,1],"end":[15,12],"bytes":[137,148]}},{"name":"url","path":"net/url","span":{"start":[16,1],"end":[16,11],"bytes":[149,159]}},{"name":"os","path":"os","span":{"start":[17,1],"end":[17,6],"bytes":[160,165]}},{"name":"path","path":"path","span":{"start":[18,1],"end":[18,8],"bytes":[166,173]}},{"name":"regexp","path":"regexp","span":{"start":[19,1],"end":[19,10],"bytes":[174,183]}},{"name":"slices","path":"slices","span":{"start":[20,1],"end":[20,10],"bytes":[184,193]}},{"name":"strings","path":"strings","span":{"start":[21,1],"end":[21,11],"bytes":[194,204]}},{"name":"sync","path":"sync","span":{"start":[22,1],"end":[22,8],"bytes":[205,212]}},{"name":"time","path":"time","span":{"start":[23,1],"end":[23,8],"bytes":[213,220]}},{"name":"aws","path":"github.com/aws/aws-sdk-go-v2/aws","span":{"start":[25,1],"end":[25,36],"bytes":[222,257]}},{"name":"ratelimit","path":"github.com/aws/aws-sdk-go-v2/aws/ratelimit","span":{"start":[26,1],"end":[26,46],"bytes":[258,303]}},{"name":"retry","path":"github.com/aws/aws-sdk-go-v2/aws/retry","span":{"start":[27,1],"end":[27,42],"bytes":[304,345]}},{"name":"v4","path":"github.com/aws/aws-sdk-go-v2/aws/signer/v4","alias":"v4","span":{"start":[28,1],"end":[28,49],"bytes":[346,394]}},{"name":"config","path":"github.com/aws/aws-sdk-go-v2/config","span":{"start":[29,1],"end":[29,39],"bytes":[395,433]}},{"name":"credentials","path":"github.com/aws/aws-sdk-go-v2/credentials","span":{"start":[30,1],"end":[30,44],"bytes":[434,477]}},{"name":"manager","path":"github.com/aws/aws-sdk-go-v2/feature/s3/manager","span":{"start":[31,1],"end":[31,51],"bytes":[478,528]}},{"name":"s3","path":"github.com/aws/aws-sdk-go-v2/service/s3","span":{"start":[32,1],"end":[32,43],"bytes":[529,571]}},{"name":"types","path":"github.com/aws/aws-sdk-go-v2/service/s3/types","span":{"start":[33,1],"end":[33,49],"bytes":[572,620]}},{"name":"smithy-go","path":"github.com/aws/smithy-go","span":{"start":[34,1],"end":[34,28],"bytes":[621,648]}},{"name":"xml","path":"github.com/aws/smithy-go/encoding/xml","alias":"smithyxml","span":{"start":[35,1],"end":[35,51],"bytes":[649,699]}},{"name":"middleware","path":"github.com/aws/smithy-go/middleware","span":{"start":[36,1],"end":[36,39],"bytes":[700,738]}},{"name":"time","path":"github.com/aws/smithy-go/time","alias":"smithytime","span":{"start":[37,1],"end":[37,44],"bytes":[739,782]}},{"name":"http","path":"github.com/aws/smithy-go/transport/http","alias":"smithyhttp","span":{"start":[38,1],"end":[38,54],"bytes":[783,836]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[39,1],"end":[39,27],"bytes":[837,863]}},{"name":"errgroup","path":"golang.org/x/sync/errgroup","span":{"start":[40,1],"end":[40,30],"bytes":[864,893]}},{"name":"semaphore","path":"golang.org/x/sync/semaphore","span":{"start":[41,1],"end":[41,31],"bytes":[894,924]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[43,1],"end":[43,37],"bytes":[926,962]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[44,1],"end":[44,46],"bytes":[963,1008]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient","kind":"struct","span":{"start":[87,1],"end":[127,2],"bytes":[2592,4007]},"callables":{"github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","kind":"method","span":{"start":[1282,1],"end":[1326,2],"bytes":[41353,42491]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1282,1],"end":[1282,63],"bytes":[41353,41415]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"1283:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1283:12","span":{"start":[1283,12],"end":[1283,23],"bytes":[41427,41438]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1290:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1290:15","span":{"start":[1290,15],"end":[1293,4],"bytes":[41563,41693]},"callee":null},"1291:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1291:11","span":{"start":[1291,11],"end":[1291,31],"bytes":[41632,41652]},"callee":null},"1292:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1292:11","span":{"start":[1292,11],"end":[1292,35],"bytes":[41664,41688]},"callee":null},"1296:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1296:6","span":{"start":[1296,6],"end":[1296,30],"bytes":[41730,41754]},"callee":null},"1297:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1297:16","span":{"start":[1297,16],"end":[1297,39],"bytes":[41772,41795]},"callee":null},"1299:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1299:11","span":{"start":[1299,11],"end":[1299,55],"bytes":[41824,41868]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1304:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1304:13","span":{"start":[1304,13],"end":[1304,65],"bytes":[41956,42008]},"callee":null},"1309:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1309:6","span":{"start":[1309,6],"end":[1309,17],"bytes":[42066,42077]},"callee":null},"1310:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1310:12","span":{"start":[1310,12],"end":[1310,23],"bytes":[42095,42106]},"callee":null},"1310:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1310:8","span":{"start":[1310,8],"end":[1310,33],"bytes":[42091,42116]},"callee":null},"1312:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1312:15","span":{"start":[1312,15],"end":[1315,5],"bytes":[42132,42287]},"callee":null},"1313:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1313:12","span":{"start":[1313,12],"end":[1313,32],"bytes":[42191,42211]},"callee":null},"1314:54":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1314:54","span":{"start":[1314,54],"end":[1314,68],"bytes":[42266,42280]},"callee":null},"1317:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1317:11","span":{"start":[1317,11],"end":[1317,71],"bytes":[42316,42376]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1318:20":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll@1318:20","span":{"start":[1318,20],"end":[1318,42],"bytes":[42396,42418]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[1206,1],"end":[1279,2],"bytes":[39234,41319]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1206,1],"end":[1206,87],"bytes":[39234,39320]}},{"name":"a","type":"[]invalid type","span":{"start":[1206,1],"end":[1206,87],"bytes":[39234,39320]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"1207:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1207:12","span":{"start":[1207,12],"end":[1207,23],"bytes":[39332,39343]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1211:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1211:5","span":{"start":[1211,5],"end":[1211,11],"bytes":[39379,39385]},"callee":null},"1216:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1216:12","span":{"start":[1216,12],"end":[1216,53],"bytes":[39466,39507]},"callee":null},"1216:46":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1216:46","span":{"start":[1216,46],"end":[1216,52],"bytes":[39500,39506]},"callee":null},"1218:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1218:15","span":{"start":[1218,15],"end":[1218,61],"bytes":[39548,39594]},"callee":null},"1219:25":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1219:25","span":{"start":[1219,25],"end":[1219,69],"bytes":[39619,39663]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1220:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1220:12","span":{"start":[1220,12],"end":[1220,72],"bytes":[39675,39735]},"callee":null},"1220:55":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1220:55","span":{"start":[1220,55],"end":[1220,70],"bytes":[39718,39733]},"callee":null},"1222:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1222:3","span":{"start":[1222,3],"end":[1222,121],"bytes":[39739,39857]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1226:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1226:6","span":{"start":[1226,6],"end":[1226,17],"bytes":[39889,39900]},"callee":null},"1227:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1227:12","span":{"start":[1227,12],"end":[1227,23],"bytes":[39918,39929]},"callee":null},"1227:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1227:8","span":{"start":[1227,8],"end":[1227,33],"bytes":[39914,39939]},"callee":null},"1229:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1229:3","span":{"start":[1229,3],"end":[1229,57],"bytes":[39943,39997]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1231:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1231:12","span":{"start":[1231,12],"end":[1231,22],"bytes":[40010,40020]},"callee":"can://litestream/litestream/@external/time/Now"},"1232:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1232:15","span":{"start":[1232,15],"end":[1235,5],"bytes":[40035,40167]},"callee":null},"1233:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1233:12","span":{"start":[1233,12],"end":[1233,32],"bytes":[40094,40114]},"callee":null},"1236:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1236:15","span":{"start":[1236,15],"end":[1236,32],"bytes":[40182,40199]},"callee":"can://litestream/litestream/@external/time/Since"},"1237:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1237:3","span":{"start":[1237,3],"end":[1237,114],"bytes":[40202,40313]},"callee":null},"1237:3/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1237:3/2","span":{"start":[1237,3],"end":[1237,86],"bytes":[40202,40285]},"callee":null},"1237:95":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1237:95","span":{"start":[1237,95],"end":[1237,113],"bytes":[40294,40312]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"1240:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1240:11","span":{"start":[1240,11],"end":[1240,67],"bytes":[40343,40399]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1245:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1245:14","span":{"start":[1245,14],"end":[1245,30],"bytes":[40451,40467]},"callee":null},"1247:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1247:3","span":{"start":[1247,3],"end":[1251,43],"bytes":[40474,40629]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1250:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1250:14","span":{"start":[1250,14],"end":[1250,29],"bytes":[40570,40585]},"callee":null},"1251:19":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1251:19","span":{"start":[1251,19],"end":[1251,42],"bytes":[40605,40628]},"callee":"can://litestream/litestream/@external/time/Duration.Milliseconds"},"1252:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1252:3","span":{"start":[1252,3],"end":[1252,103],"bytes":[40632,40732]},"callee":null},"1252:3/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1252:3/2","span":{"start":[1252,3],"end":[1252,81],"bytes":[40632,40710]},"callee":null},"1252:86":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1252:86","span":{"start":[1252,86],"end":[1252,102],"bytes":[40715,40731]},"callee":null},"1254:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1254:6","span":{"start":[1254,6],"end":[1254,21],"bytes":[40739,40754]},"callee":null},"1256:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1256:13","span":{"start":[1256,13],"end":[1256,33],"bytes":[40807,40827]},"callee":null},"1257:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1257:5","span":{"start":[1257,5],"end":[1257,95],"bytes":[40832,40922]},"callee":null},"1257:5/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1257:5/2","span":{"start":[1257,5],"end":[1257,89],"bytes":[40832,40916]},"callee":null},"1260:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1260:6","span":{"start":[1260,6],"end":[1263,42],"bytes":[40944,41077]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"1261:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1261:14","span":{"start":[1261,14],"end":[1261,33],"bytes":[40995,41014]},"callee":null},"1263:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1263:18","span":{"start":[1263,18],"end":[1263,41],"bytes":[41053,41076]},"callee":null},"1266:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1266:7","span":{"start":[1266,7],"end":[1266,22],"bytes":[41095,41110]},"callee":null},"1267:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1267:5","span":{"start":[1267,5],"end":[1267,85],"bytes":[41121,41201]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"1267:67":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1267:67","span":{"start":[1267,67],"end":[1267,82],"bytes":[41183,41198]},"callee":null},"1271:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles@1271:13","span":{"start":[1271,13],"end":[1271,35],"bytes":[41224,41246]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","kind":"method","span":{"start":[1329,1],"end":[1363,2],"bytes":[42566,43564]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1329,1],"end":[1329,79],"bytes":[42566,42644]}}],"return_type":"([]string, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1330:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1330:12","span":{"start":[1330,12],"end":[1330,23],"bytes":[42656,42667]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1334:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1334:12","span":{"start":[1334,12],"end":[1334,48],"bytes":[42715,42751]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.GenerationsPathV3"},"1337:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1337:15","span":{"start":[1337,15],"end":[1341,4],"bytes":[42833,42993]},"callee":null},"1338:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1338:14","span":{"start":[1338,14],"end":[1338,34],"bytes":[42905,42925]},"callee":null},"1339:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1339:14","span":{"start":[1339,14],"end":[1339,32],"bytes":[42940,42958]},"callee":null},"1340:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1340:14","span":{"start":[1340,14],"end":[1340,29],"bytes":[42973,42988]},"callee":null},"1344:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1344:6","span":{"start":[1344,6],"end":[1344,30],"bytes":[43026,43050]},"callee":null},"1345:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1345:16","span":{"start":[1345,16],"end":[1345,39],"bytes":[43068,43091]},"callee":null},"1347:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1347:16","span":{"start":[1347,16],"end":[1347,59],"bytes":[43125,43168]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1352:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1352:9","span":{"start":[1352,9],"end":[1352,32],"bytes":[43324,43347]},"callee":null},"1353:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1353:8","span":{"start":[1353,8],"end":[1353,37],"bytes":[43355,43384]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"1354:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1354:8","span":{"start":[1354,8],"end":[1354,34],"bytes":[43392,43418]},"callee":"can://litestream/litestream/@external/strings/TrimSuffix"},"1355:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1355:7","span":{"start":[1355,7],"end":[1355,37],"bytes":[43425,43455]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3"},"1356:19":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1356:19","span":{"start":[1356,19],"end":[1356,41],"bytes":[43476,43498]},"callee":null},"1361:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3@1361:2","span":{"start":[1361,2],"end":[1361,26],"bytes":[43513,43537]},"callee":"can://litestream/litestream/@external/slices/Sort"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.Init":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","kind":"method","span":{"start":[352,1],"end":[504,2],"bytes":[10937,16109]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[352,1],"end":[352,64],"bytes":[10937,11000]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":15},"body":{"353:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@353:2","span":{"start":[353,2],"end":[353,13],"bytes":[11002,11013]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"354:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@354:8","span":{"start":[354,8],"end":[354,21],"bytes":[11021,11034]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"362:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@362:10","span":{"start":[362,10],"end":[362,51],"bytes":[11137,11178]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"366:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@366:12","span":{"start":[366,12],"end":[366,33],"bytes":[11225,11246]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig"},"376:21":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@376:21","span":{"start":[376,21],"end":[376,54],"bytes":[11525,11558]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion"},"377:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@377:12","span":{"start":[377,12],"end":[377,66],"bytes":[11584,11638]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"414:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@414:3","span":{"start":[414,3],"end":[414,28],"bytes":[12719,12744]},"callee":null},"415:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@415:3","span":{"start":[415,3],"end":[415,42],"bytes":[12748,12787]},"callee":null},"419:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@419:15","span":{"start":[419,15],"end":[419,68],"bytes":[12847,12900]},"callee":null},"419:34":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@419:34","span":{"start":[419,34],"end":[419,67],"bytes":[12866,12899]},"callee":null},"429:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@429:16","span":{"start":[429,16],"end":[431,5],"bytes":[13328,13466]},"callee":null},"429:35":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@429:35","span":{"start":[429,35],"end":[431,4],"bytes":[13347,13465]},"callee":null},"430:4":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@430:4","span":{"start":[430,4],"end":[430,82],"bytes":[13382,13460]},"callee":null},"438:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@438:16","span":{"start":[438,16],"end":[438,33],"bytes":[13795,13812]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv"},"439:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@439:16","span":{"start":[439,16],"end":[439,69],"bytes":[13844,13897]},"callee":null},"439:35":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@439:35","span":{"start":[439,35],"end":[439,68],"bytes":[13863,13896]},"callee":null},"443:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@443:14","span":{"start":[443,14],"end":[443,58],"bytes":[13942,13986]},"callee":null},"445:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@445:10","span":{"start":[445,10],"end":[445,59],"bytes":[14013,14062]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"465:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@465:12","span":{"start":[465,12],"end":[468,5],"bytes":[14779,14974]},"callee":null},"472:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@472:2","span":{"start":[472,2],"end":[472,30],"bytes":[15017,15045]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint"},"475:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@475:9","span":{"start":[475,9],"end":[475,41],"bytes":[15076,15108]},"callee":null},"486:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@486:18","span":{"start":[486,18],"end":[488,5],"bytes":[15650,15780]},"callee":null},"492:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@492:18","span":{"start":[492,18],"end":[494,5],"bytes":[15823,15903]},"callee":null},"497:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@497:18","span":{"start":[497,18],"end":[499,5],"bytes":[15948,16034]},"callee":null},"501:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init@501:15","span":{"start":[501,15],"end":[501,57],"bytes":[16052,16094]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_1","kind":"function","span":{"start":[450,1],"end":[455,5],"bytes":[14128,14325]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_1","parameters":[{"name":"o","type":"invalid type","span":{"start":[450,1],"end":[450,24],"bytes":[14128,14151]}}],"body":{"454:19":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_1@454:19","span":{"start":[454,19],"end":[454,61],"bytes":[14278,14320]},"callee":null},"454:40":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_1@454:40","span":{"start":[454,40],"end":[454,60],"bytes":[14299,14319]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption"}}},"closure_2":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_2","kind":"function","span":{"start":[465,1],"end":[468,5],"bytes":[14768,14974]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_2","parameters":[{"name":"o","type":"invalid type","span":{"start":[465,1],"end":[465,48],"bytes":[14768,14815]}}],"body":{}},"closure_3":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_3","kind":"function","span":{"start":[486,1],"end":[488,5],"bytes":[15633,15780]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_3","parameters":[{"name":"u","type":"invalid type","span":{"start":[486,1],"end":[486,66],"bytes":[15633,15698]}}],"body":{}},"closure_4":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_4","kind":"function","span":{"start":[492,1],"end":[494,5],"bytes":[15806,15903]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_4","parameters":[{"name":"u","type":"invalid type","span":{"start":[492,1],"end":[492,66],"bytes":[15806,15871]}}],"body":{}},"closure_5":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_5","kind":"function","span":{"start":[497,1],"end":[499,5],"bytes":[15931,16034]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_5","parameters":[{"name":"u","type":"invalid type","span":{"start":[497,1],"end":[497,66],"bytes":[15931,15996]}}],"body":{}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles","kind":"method","span":{"start":[665,1],"end":[670,2],"bytes":[21965,22213]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[665,1],"end":[665,126],"bytes":[21965,22090]}},{"name":"level","type":"int","span":{"start":[665,1],"end":[665,126],"bytes":[21965,22090]}},{"name":"seek","type":"invalid type","span":{"start":[665,1],"end":[665,126],"bytes":[21965,22090]}},{"name":"useMetadata","type":"bool","span":{"start":[665,1],"end":[665,126],"bytes":[21965,22090]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"666:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles@666:12","span":{"start":[666,12],"end":[666,23],"bytes":[22102,22113]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"669:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles@669:9","span":{"start":[669,9],"end":[669,58],"bytes":[22157,22206]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[674,1],"end":[712,2],"bytes":[22327,23541]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"level","type":"int","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"minTXID","type":"invalid type","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"maxTXID","type":"invalid type","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"offset","type":"int64","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}},{"name":"size","type":"int64","span":{"start":[674,1],"end":[674,140],"bytes":[22327,22466]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"675:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@675:12","span":{"start":[675,12],"end":[675,23],"bytes":[22478,22489]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"681:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@681:14","span":{"start":[681,14],"end":[681,63],"bytes":[22575,22624]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"683:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@683:14","span":{"start":[683,14],"end":[683,46],"bytes":[22648,22680]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"687:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@687:14","span":{"start":[687,14],"end":[687,50],"bytes":[22735,22771]},"callee":null},"688:24":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@688:24","span":{"start":[688,24],"end":[688,63],"bytes":[22795,22834]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"691:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@691:11","span":{"start":[691,11],"end":[691,31],"bytes":[22876,22896]},"callee":null},"692:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@692:11","span":{"start":[692,11],"end":[692,26],"bytes":[22908,22923]},"callee":null},"693:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@693:11","span":{"start":[693,11],"end":[693,31],"bytes":[22935,22955]},"callee":null},"699:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@699:32","span":{"start":[699,32],"end":[699,66],"bytes":[23187,23221]},"callee":null},"700:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@700:26","span":{"start":[700,26],"end":[700,54],"bytes":[23247,23275]},"callee":null},"701:29":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@701:29","span":{"start":[701,29],"end":[701,60],"bytes":[23304,23335]},"callee":null},"704:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@704:14","span":{"start":[704,14],"end":[704,40],"bytes":[23353,23379]},"callee":null},"706:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@706:6","span":{"start":[706,6],"end":[706,22],"bytes":[23402,23418]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"709:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile@709:15","span":{"start":[709,15],"end":[709,60],"bytes":[23469,23514]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","kind":"method","span":{"start":[1455,1],"end":[1483,2],"bytes":[46180,46988]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1455,1],"end":[1455,115],"bytes":[46180,46294]}},{"name":"generation","type":"string","span":{"start":[1455,1],"end":[1455,115],"bytes":[46180,46294]}},{"name":"index","type":"int","span":{"start":[1455,1],"end":[1455,115],"bytes":[46180,46294]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"1456:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1456:12","span":{"start":[1456,12],"end":[1456,23],"bytes":[46306,46317]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1460:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1460:9","span":{"start":[1460,9],"end":[1460,61],"bytes":[46362,46414]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3"},"1463:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1463:11","span":{"start":[1463,11],"end":[1463,31],"bytes":[46456,46476]},"callee":null},"1464:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1464:11","span":{"start":[1464,11],"end":[1464,26],"bytes":[46488,46503]},"callee":null},"1469:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1469:32","span":{"start":[1469,32],"end":[1469,66],"bytes":[46608,46642]},"callee":null},"1470:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1470:26","span":{"start":[1470,26],"end":[1470,54],"bytes":[46668,46696]},"callee":null},"1471:29":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1471:29","span":{"start":[1471,29],"end":[1471,60],"bytes":[46725,46756]},"callee":null},"1474:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1474:14","span":{"start":[1474,14],"end":[1474,40],"bytes":[46774,46800]},"callee":null},"1476:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1476:6","span":{"start":[1476,6],"end":[1476,22],"bytes":[46823,46839]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"1479:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1479:15","span":{"start":[1479,15],"end":[1479,62],"bytes":[46890,46937]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1482:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3@1482:9","span":{"start":[1482,9],"end":[1482,40],"bytes":[46950,46981]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","kind":"method","span":{"start":[1487,1],"end":[1515,2],"bytes":[47110,47947]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1487,1],"end":[1487,131],"bytes":[47110,47240]}},{"name":"generation","type":"string","span":{"start":[1487,1],"end":[1487,131],"bytes":[47110,47240]}},{"name":"index","type":"int","span":{"start":[1487,1],"end":[1487,131],"bytes":[47110,47240]}},{"name":"offset","type":"int64","span":{"start":[1487,1],"end":[1487,131],"bytes":[47110,47240]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"1488:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1488:12","span":{"start":[1488,12],"end":[1488,23],"bytes":[47252,47263]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1492:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1492:9","span":{"start":[1492,9],"end":[1492,71],"bytes":[47308,47370]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3"},"1495:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1495:11","span":{"start":[1495,11],"end":[1495,31],"bytes":[47412,47432]},"callee":null},"1496:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1496:11","span":{"start":[1496,11],"end":[1496,26],"bytes":[47444,47459]},"callee":null},"1501:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1501:32","span":{"start":[1501,32],"end":[1501,66],"bytes":[47564,47598]},"callee":null},"1502:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1502:26","span":{"start":[1502,26],"end":[1502,54],"bytes":[47624,47652]},"callee":null},"1503:29":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1503:29","span":{"start":[1503,29],"end":[1503,60],"bytes":[47681,47712]},"callee":null},"1506:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1506:14","span":{"start":[1506,14],"end":[1506,40],"bytes":[47730,47756]},"callee":null},"1508:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1508:6","span":{"start":[1508,6],"end":[1508,22],"bytes":[47779,47795]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists"},"1511:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1511:15","span":{"start":[1511,15],"end":[1511,65],"bytes":[47846,47896]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1514:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3@1514:9","span":{"start":[1514,9],"end":[1514,40],"bytes":[47909,47940]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SetLogger","kind":"method","span":{"start":[139,1],"end":[141,2],"bytes":[4292,4398]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[139,1],"end":[139,57],"bytes":[4292,4348]}}],"metrics":{"cyclomatic":1},"body":{"140:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SetLogger@140:13","span":{"start":[140,13],"end":[140,48],"bytes":[4361,4396]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","kind":"method","span":{"start":[1366,1],"end":[1405,2],"bytes":[43634,44751]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1366,1],"end":[1366,115],"bytes":[43634,43748]}},{"name":"generation","type":"string","span":{"start":[1366,1],"end":[1366,115],"bytes":[43634,43748]}}],"return_type":"([]github.com/benbjohnson/litestream.SnapshotInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1367:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1367:12","span":{"start":[1367,12],"end":[1367,23],"bytes":[43760,43771]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1371:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1371:12","span":{"start":[1371,12],"end":[1371,58],"bytes":[43819,43865]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3"},"1373:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1373:15","span":{"start":[1373,15],"end":[1376,4],"bytes":[43887,44011]},"callee":null},"1374:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1374:11","span":{"start":[1374,11],"end":[1374,31],"bytes":[43956,43976]},"callee":null},"1375:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1375:11","span":{"start":[1375,11],"end":[1375,29],"bytes":[43988,44006]},"callee":null},"1379:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1379:6","span":{"start":[1379,6],"end":[1379,30],"bytes":[44061,44085]},"callee":null},"1380:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1380:16","span":{"start":[1380,16],"end":[1380,39],"bytes":[44103,44126]},"callee":null},"1382:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1382:16","span":{"start":[1382,16],"end":[1382,57],"bytes":[44160,44201]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1386:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1386:11","span":{"start":[1386,11],"end":[1386,43],"bytes":[44255,44287]},"callee":"can://litestream/litestream/@external/path/Base"},"1386:21":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1386:21","span":{"start":[1386,21],"end":[1386,42],"bytes":[44265,44286]},"callee":null},"1387:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1387:18","span":{"start":[1387,18],"end":[1387,57],"bytes":[44305,44344]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3"},"1392:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1392:16","span":{"start":[1392,16],"end":[1397,6],"bytes":[44424,44616]},"callee":null},"1395:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1395:17","span":{"start":[1395,17],"end":[1395,38],"bytes":[44536,44557]},"callee":null},"1396:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1396:17","span":{"start":[1396,17],"end":[1396,51],"bytes":[44575,44609]},"callee":null},"1396:17/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1396:17/2","span":{"start":[1396,17],"end":[1396,45],"bytes":[44575,44603]},"callee":null},"1401:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3@1401:2","span":{"start":[1401,2],"end":[1403,4],"bytes":[44626,44726]},"callee":"can://litestream/litestream/@external/slices/SortFunc"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3.closure_1","kind":"function","span":{"start":[1401,1],"end":[1403,4],"bytes":[44625,44726]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3.closure_1","parameters":[{"name":"a","type":"github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[1401,1],"end":[1401,71],"bytes":[44625,44695]}},{"name":"b","type":"github.com/benbjohnson/litestream.SnapshotInfoV3","span":{"start":[1401,1],"end":[1401,71],"bytes":[44625,44695]}}],"return_type":"int","body":{}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.Type":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Type","kind":"method","span":{"start":[347,1],"end":[349,2],"bytes":[10796,10863]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","kind":"method","span":{"start":[1408,1],"end":[1451,2],"bytes":[44838,46063]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1408,1],"end":[1408,119],"bytes":[44838,44956]}},{"name":"generation","type":"string","span":{"start":[1408,1],"end":[1408,119],"bytes":[44838,44956]}}],"return_type":"([]github.com/benbjohnson/litestream.WALSegmentInfoV3, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"1409:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1409:12","span":{"start":[1409,12],"end":[1409,23],"bytes":[44968,44979]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"1413:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1413:12","span":{"start":[1413,12],"end":[1413,52],"bytes":[45027,45067]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALPathV3"},"1415:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1415:15","span":{"start":[1415,15],"end":[1418,4],"bytes":[45089,45213]},"callee":null},"1416:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1416:11","span":{"start":[1416,11],"end":[1416,31],"bytes":[45158,45178]},"callee":null},"1417:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1417:11","span":{"start":[1417,11],"end":[1417,29],"bytes":[45190,45208]},"callee":null},"1421:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1421:6","span":{"start":[1421,6],"end":[1421,30],"bytes":[45264,45288]},"callee":null},"1422:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1422:16","span":{"start":[1422,16],"end":[1422,39],"bytes":[45306,45329]},"callee":null},"1424:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1424:16","span":{"start":[1424,16],"end":[1424,60],"bytes":[45363,45407]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1428:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1428:11","span":{"start":[1428,11],"end":[1428,43],"bytes":[45461,45493]},"callee":"can://litestream/litestream/@external/path/Base"},"1428:21":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1428:21","span":{"start":[1428,21],"end":[1428,42],"bytes":[45471,45492]},"callee":null},"1429:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1429:26","span":{"start":[1429,26],"end":[1429,67],"bytes":[45519,45560]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3"},"1434:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1434:15","span":{"start":[1434,15],"end":[1440,6],"bytes":[45639,45856]},"callee":null},"1438:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1438:17","span":{"start":[1438,17],"end":[1438,38],"bytes":[45776,45797]},"callee":null},"1439:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1439:17","span":{"start":[1439,17],"end":[1439,51],"bytes":[45815,45849]},"callee":null},"1439:17/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1439:17/2","span":{"start":[1439,17],"end":[1439,45],"bytes":[45815,45843]},"callee":null},"1444:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3@1444:2","span":{"start":[1444,2],"end":[1449,4],"bytes":[45866,46039]},"callee":"can://litestream/litestream/@external/slices/SortFunc"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3.closure_1","kind":"function","span":{"start":[1444,1],"end":[1449,4],"bytes":[45865,46039]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3.closure_1","parameters":[{"name":"a","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1444,1],"end":[1444,72],"bytes":[45865,45936]}},{"name":"b","type":"github.com/benbjohnson/litestream.WALSegmentInfoV3","span":{"start":[1444,1],"end":[1444,72],"bytes":[45865,45936]}}],"return_type":"int","body":{"1448:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3.closure_1@1448:10","span":{"start":[1448,10],"end":[1448,41],"bytes":[46004,46035]},"callee":"can://litestream/litestream/@external/cmp/Compare"}}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[718,1],"end":[758,2],"bytes":[23853,25147]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}},{"name":"level","type":"int","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}},{"name":"minTXID","type":"invalid type","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}},{"name":"maxTXID","type":"invalid type","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}},{"name":"r","type":"io.Reader","span":{"start":[718,1],"end":[718,134],"bytes":[23853,23986]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"719:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@719:12","span":{"start":[719,12],"end":[719,23],"bytes":[23998,24009]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init"},"723:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@723:14","span":{"start":[723,14],"end":[723,50],"bytes":[24059,24095]},"callee":null},"724:24":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@724:24","span":{"start":[724,24],"end":[724,63],"bytes":[24119,24158]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"726:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@726:14","span":{"start":[726,14],"end":[726,50],"bytes":[24173,24209]},"callee":null},"735:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@735:15","span":{"start":[735,15],"end":[735,114],"bytes":[24496,24595]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"738:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@738:32","span":{"start":[738,32],"end":[738,66],"bytes":[24631,24665]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX"},"743:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@743:2","span":{"start":[743,2],"end":[743,83],"bytes":[24706,24787]},"callee":null},"743:2/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@743:2/2","span":{"start":[743,2],"end":[743,77],"bytes":[24706,24781]},"callee":null},"744:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@744:2","span":{"start":[744,2],"end":[744,96],"bytes":[24789,24883]},"callee":null},"744:2/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@744:2/2","span":{"start":[744,2],"end":[744,77],"bytes":[24789,24864]},"callee":null},"744:82":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@744:82","span":{"start":[744,82],"end":[744,95],"bytes":[24869,24882]},"callee":null},"748:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile@748:15","span":{"start":[748,15],"end":[748,64],"bytes":[24954,25003]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint","kind":"method","span":{"start":[507,1],"end":[525,2],"bytes":[16199,16763]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint","parameters":[{"name":"opts","type":"*[]func(invalid type)","span":{"start":[507,1],"end":[507,71],"bytes":[16199,16269]}}],"metrics":{"cyclomatic":4},"body":{"509:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint@509:11","span":{"start":[509,11],"end":[523,5],"bytes":[16303,16758]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1","kind":"function","span":{"start":[509,1],"end":[523,5],"bytes":[16293,16758]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1","parameters":[{"name":"o","type":"invalid type","span":{"start":[509,1],"end":[509,46],"bytes":[16293,16338]}}],"body":{"514:51":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1@514:51","span":{"start":[514,51],"end":[514,90],"bytes":[16485,16524]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"514:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1@514:8","span":{"start":[514,8],"end":[514,46],"bytes":[16442,16480]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"518:21":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1@518:21","span":{"start":[518,21],"end":[518,41],"bytes":[16590,16610]},"callee":null},"520:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1@520:7","span":{"start":[520,7],"end":[520,45],"bytes":[16666,16704]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"}}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","kind":"method","span":{"start":[615,1],"end":[658,2],"bytes":[20313,21577]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[615,1],"end":[615,95],"bytes":[20313,20407]}},{"name":"bucket","type":"string","span":{"start":[615,1],"end":[615,95],"bytes":[20313,20407]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"618:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@618:3","span":{"start":[618,3],"end":[618,42],"bytes":[20510,20549]},"callee":null},"623:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@623:16","span":{"start":[623,16],"end":[625,5],"bytes":[20662,20800]},"callee":null},"623:35":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@623:35","span":{"start":[623,35],"end":[625,4],"bytes":[20681,20799]},"callee":null},"624:4":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@624:4","span":{"start":[624,4],"end":[624,82],"bytes":[20716,20794]},"callee":null},"629:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@629:14","span":{"start":[629,14],"end":[629,58],"bytes":[20845,20889]},"callee":null},"631:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@631:14","span":{"start":[631,14],"end":[631,81],"bytes":[20920,20987]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"641:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@641:2","span":{"start":[641,2],"end":[641,30],"bytes":[21182,21210]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint"},"643:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@643:12","span":{"start":[643,12],"end":[643,44],"bytes":[21223,21255]},"callee":null},"646:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@646:14","span":{"start":[646,14],"end":[648,4],"bytes":[21294,21385]},"callee":null},"647:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@647:11","span":{"start":[647,11],"end":[647,29],"bytes":[21362,21380]},"callee":null},"657:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion@657:9","span":{"start":[657,9],"end":[657,39],"bytes":[21540,21570]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption","kind":"method","span":{"start":[887,1],"end":[1075,2],"bytes":[30071,36313]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption","parameters":[],"return_type":"func(invalid type) error","metrics":{"cyclomatic":30},"body":{},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1","kind":"function","span":{"start":[888,1],"end":[1074,3],"bytes":[30146,36311]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1","parameters":[{"name":"stack","type":"invalid type","span":{"start":[888,1],"end":[888,46],"bytes":[30146,30191]}}],"return_type":"error","error_channel":["error"],"body":{"1006:4":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@1006:4","span":{"start":[1006,4],"end":[1006,52],"bytes":[34113,34161]},"callee":null},"1011:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@1011:13","span":{"start":[1011,13],"end":[1028,4],"bytes":[34302,34885]},"callee":null},"1012:4":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@1012:4","span":{"start":[1012,4],"end":[1026,5],"bytes":[34325,34859]},"callee":null},"1067:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@1067:13","span":{"start":[1067,13],"end":[1067,113],"bytes":[36075,36175]},"callee":null},"1067:35":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@1067:35","span":{"start":[1067,35],"end":[1067,50],"bytes":[36097,36112]},"callee":null},"1068:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@1068:14","span":{"start":[1068,14],"end":[1068,67],"bytes":[36203,36256]},"callee":null},"1068:33":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@1068:33","span":{"start":[1068,33],"end":[1068,48],"bytes":[36222,36237]},"callee":null},"890:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@890:14","span":{"start":[890,14],"end":[917,5],"bytes":[30232,31162]},"callee":null},"891:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@891:5","span":{"start":[891,5],"end":[915,6],"bytes":[30257,31133]},"callee":null},"922:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@922:13","span":{"start":[922,13],"end":[940,4],"bytes":[31214,31850]},"callee":null},"923:4":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@923:4","span":{"start":[923,4],"end":[938,5],"bytes":[31234,31824]},"callee":null},"944:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@944:6","span":{"start":[944,6],"end":[944,45],"bytes":[31889,31928]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint"},"945:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@945:14","span":{"start":[945,14],"end":[958,5],"bytes":[31944,32405]},"callee":null},"946:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@946:5","span":{"start":[946,5],"end":[956,6],"bytes":[31965,32377]},"callee":null},"963:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@963:31","span":{"start":[963,31],"end":[963,82],"bytes":[32475,32526]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint"},"964:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@964:14","span":{"start":[964,14],"end":[978,5],"bytes":[32542,33032]},"callee":null},"965:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@965:5","span":{"start":[965,5],"end":[975,6],"bytes":[32569,32988]},"callee":null},"988:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@988:8","span":{"start":[988,8],"end":[988,54],"bytes":[33334,33380]},"callee":null},"989:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@989:14","span":{"start":[989,14],"end":[989,52],"bytes":[33394,33432]},"callee":null},"992:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@992:8","span":{"start":[992,8],"end":[992,53],"bytes":[33474,33519]},"callee":null},"993:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1@993:14","span":{"start":[993,14],"end":[993,56],"bytes":[33533,33575]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1","kind":"function","span":{"start":[893,1],"end":[914,8],"bytes":[30335,31127]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[893,1],"end":[893,97],"bytes":[30335,30431]}},{"name":"in","type":"invalid type","span":{"start":[893,1],"end":[893,97],"bytes":[30335,30431]}},{"name":"next","type":"invalid type","span":{"start":[893,1],"end":[893,97],"bytes":[30335,30431]}}],"return_type":"(invalid type, invalid type, error)","error_channel":["error"],"body":{"896:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1@896:10","span":{"start":[896,10],"end":[896,42],"bytes":[30529,30561]},"callee":null},"897:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1@897:15","span":{"start":[897,15],"end":[897,44],"bytes":[30597,30626]},"callee":null},"901:56":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1@901:56","span":{"start":[901,56],"end":[901,81],"bytes":[30749,30774]},"callee":null},"902:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1@902:15","span":{"start":[902,15],"end":[902,44],"bytes":[30796,30825]},"callee":null},"905:24":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1@905:24","span":{"start":[905,24],"end":[905,68],"bytes":[30858,30902]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5"},"910:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1@910:14","span":{"start":[910,14],"end":[910,76],"bytes":[31005,31067]},"callee":null},"913:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1@913:14","span":{"start":[913,14],"end":[913,43],"bytes":[31090,31119]},"callee":null}}},"closure_2":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2","kind":"function","span":{"start":[925,1],"end":[937,7],"bytes":[31293,31819]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[925,1],"end":[925,88],"bytes":[31293,31380]}},{"name":"in","type":"invalid type","span":{"start":[925,1],"end":[925,88],"bytes":[31293,31380]}},{"name":"next","type":"invalid type","span":{"start":[925,1],"end":[925,88],"bytes":[31293,31380]}}],"return_type":"(invalid type, invalid type, error)","error_channel":["error"],"body":{"929:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2@929:18","span":{"start":[929,18],"end":[929,46],"bytes":[31538,31566]},"callee":null},"931:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2@931:8","span":{"start":[931,8],"end":[931,50],"bytes":[31599,31641]},"callee":null},"932:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2@932:18","span":{"start":[932,18],"end":[932,57],"bytes":[31659,31698]},"callee":"can://litestream/litestream/@external/strings/Contains"},"933:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2@933:8","span":{"start":[933,8],"end":[933,59],"bytes":[31708,31759]},"callee":null},"936:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2@936:13","span":{"start":[936,13],"end":[936,38],"bytes":[31787,31812]},"callee":null}}},"closure_3":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_3","kind":"function","span":{"start":[948,1],"end":[955,8],"bytes":[32032,32371]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[948,1],"end":[948,89],"bytes":[32032,32120]}},{"name":"in","type":"invalid type","span":{"start":[948,1],"end":[948,89],"bytes":[32032,32120]}},{"name":"next","type":"invalid type","span":{"start":[948,1],"end":[948,89],"bytes":[32032,32120]}}],"return_type":"(invalid type, invalid type, error)","error_channel":["error"],"body":{"952:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_3@952:8","span":{"start":[952,8],"end":[952,53],"bytes":[32271,32316]},"callee":null},"954:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_3@954:14","span":{"start":[954,14],"end":[954,39],"bytes":[32338,32363]},"callee":null}}},"closure_4":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_4","kind":"function","span":{"start":[967,1],"end":[974,8],"bytes":[32643,32982]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_4","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[967,1],"end":[967,95],"bytes":[32643,32737]}},{"name":"in","type":"invalid type","span":{"start":[967,1],"end":[967,95],"bytes":[32643,32737]}},{"name":"next","type":"invalid type","span":{"start":[967,1],"end":[967,95],"bytes":[32643,32737]}}],"return_type":"(invalid type, invalid type, error)","error_channel":["error"],"body":{"971:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_4@971:8","span":{"start":[971,8],"end":[971,41],"bytes":[32891,32924]},"callee":null},"973:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_4@973:14","span":{"start":[973,14],"end":[973,42],"bytes":[32946,32974]},"callee":null}}},"closure_5":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5","kind":"function","span":{"start":[1014,1],"end":[1025,7],"bytes":[34390,34854]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1014,1],"end":[1014,94],"bytes":[34390,34483]}},{"name":"in","type":"invalid type","span":{"start":[1014,1],"end":[1014,94],"bytes":[34390,34483]}},{"name":"next","type":"invalid type","span":{"start":[1014,1],"end":[1014,94],"bytes":[34390,34483]}}],"return_type":"(invalid type, invalid type, error)","error_channel":["error"],"body":{"1018:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5@1018:7","span":{"start":[1018,7],"end":[1022,8],"bytes":[34633,34799]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1020:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5@1020:15","span":{"start":[1020,15],"end":[1020,31],"bytes":[34705,34721]},"callee":null},"1021:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5@1021:31","span":{"start":[1021,31],"end":[1021,68],"bytes":[34753,34790]},"callee":null},"1024:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5@1024:13","span":{"start":[1024,13],"end":[1024,41],"bytes":[34819,34847]},"callee":null}}},"closure_6":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6","kind":"function","span":{"start":[1036,1],"end":[1062,4],"bytes":[34966,35818]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6","parameters":[],"return_type":"invalid type","body":{"1037:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6@1037:11","span":{"start":[1037,11],"end":[1061,5],"bytes":[35034,35814]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1","kind":"function","span":{"start":[1039,1],"end":[1060,7],"bytes":[35103,35809]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1039,1],"end":[1039,94],"bytes":[35103,35196]}},{"name":"in","type":"invalid type","span":{"start":[1039,1],"end":[1039,94],"bytes":[35103,35196]}},{"name":"next","type":"invalid type","span":{"start":[1039,1],"end":[1039,94],"bytes":[35103,35196]}}],"return_type":"(invalid type, invalid type, error)","error_channel":["error"],"body":{"1042:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1@1042:9","span":{"start":[1042,9],"end":[1042,41],"bytes":[35290,35322]},"callee":null},"1043:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1@1043:14","span":{"start":[1043,14],"end":[1043,42],"bytes":[35357,35385]},"callee":null},"1046:21":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1@1046:21","span":{"start":[1046,21],"end":[1046,72],"bytes":[35414,35465]},"callee":null},"1048:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1@1048:14","span":{"start":[1048,14],"end":[1048,42],"bytes":[35513,35541]},"callee":null},"1053:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1@1053:14","span":{"start":[1053,14],"end":[1053,42],"bytes":[35626,35654]},"callee":null},"1055:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1@1055:9","span":{"start":[1055,9],"end":[1055,38],"bytes":[35670,35699]},"callee":null},"1056:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1@1056:7","span":{"start":[1056,7],"end":[1056,46],"bytes":[35714,35753]},"callee":null},"1059:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_6.closure_1@1059:13","span":{"start":[1059,13],"end":[1059,41],"bytes":[35774,35802]},"callee":null}}}}}}}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","kind":"method","span":{"start":[858,1],"end":[885,2],"bytes":[29179,30069]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","parameters":[{"name":"key","type":"string","span":{"start":[858,1],"end":[858,93],"bytes":[29179,29271]}},{"name":"timestamp","type":"time.Time","span":{"start":[858,1],"end":[858,93],"bytes":[29179,29271]}}],"return_type":"invalid type","metrics":{"cyclomatic":4},"body":{"860:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput@860:11","span":{"start":[860,11],"end":[860,31],"bytes":[29312,29332]},"callee":null},"861:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput@861:11","span":{"start":[861,11],"end":[861,26],"bytes":[29344,29359]},"callee":null},"864:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput@864:26","span":{"start":[864,26],"end":[864,60],"bytes":[29486,29520]},"callee":"can://litestream/litestream/@external/time/Time.Format"},"868:24":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput@868:24","span":{"start":[868,24],"end":[868,58],"bytes":[29580,29614]},"callee":null},"873:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput@873:32","span":{"start":[873,32],"end":[873,66],"bytes":[29718,29752]},"callee":null},"874:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput@874:26","span":{"start":[874,26],"end":[874,54],"bytes":[29778,29806]},"callee":null},"875:29":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput@875:29","span":{"start":[875,29],"end":[875,60],"bytes":[29835,29866]},"callee":null},"881:23":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput@881:23","span":{"start":[881,23],"end":[881,48],"bytes":[30024,30049]},"callee":null}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","kind":"method","span":{"start":[762,1],"end":[773,2],"bytes":[25286,25901]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[762,1],"end":[762,133],"bytes":[25286,25418]}},{"name":"key","type":"string","span":{"start":[762,1],"end":[762,133],"bytes":[25286,25418]}},{"name":"r","type":"io.Reader","span":{"start":[762,1],"end":[762,133],"bytes":[25286,25418]}},{"name":"partSize","type":"int64","span":{"start":[762,1],"end":[762,133],"bytes":[25286,25418]}}],"return_type":"(int64, time.Time, *string, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"766:20":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX@766:20","span":{"start":[766,20],"end":[766,46],"bytes":[25610,25636]},"callee":"can://litestream/litestream/@external/io/Seeker.Seek"},"767:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX@767:11","span":{"start":[767,11],"end":[767,58],"bytes":[25661,25708]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX"},"772:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX@772:9","span":{"start":[772,9],"end":[772,51],"bytes":[25857,25899]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","kind":"method","span":{"start":[776,1],"end":[816,2],"bytes":[25973,27460]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}},{"name":"key","type":"string","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}},{"name":"rs","type":"io.ReadSeeker","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}},{"name":"start","type":"int64","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}},{"name":"partSize","type":"int64","span":{"start":[776,1],"end":[776,150],"bytes":[25973,26122]}}],"return_type":"(int64, time.Time, *string, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"777:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@777:14","span":{"start":[777,14],"end":[777,36],"bytes":[26136,26158]},"callee":"can://litestream/litestream/@external/io/Seeker.Seek"},"779:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@779:31","span":{"start":[779,31],"end":[779,79],"bytes":[26206,26254]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"782:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@782:15","span":{"start":[782,15],"end":[782,43],"bytes":[26293,26321]},"callee":"can://litestream/litestream/@external/io/Seeker.Seek"},"783:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@783:31","span":{"start":[783,31],"end":[783,81],"bytes":[26366,26416]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"788:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@788:17","span":{"start":[788,17],"end":[788,35],"bytes":[26526,26544]},"callee":null},"790:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@790:31","span":{"start":[790,31],"end":[790,87],"bytes":[26592,26648]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"792:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@792:15","span":{"start":[792,15],"end":[792,50],"bytes":[26666,26701]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"792:15/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@792:15/2","span":{"start":[792,15],"end":[792,44],"bytes":[26666,26695]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"793:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@793:15","span":{"start":[793,15],"end":[793,43],"bytes":[26716,26744]},"callee":"can://litestream/litestream/@external/io/Seeker.Seek"},"794:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@794:31","span":{"start":[794,31],"end":[794,81],"bytes":[26789,26839]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"797:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@797:11","span":{"start":[797,11],"end":[797,43],"bytes":[26854,26886]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput"},"801:25":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@801:25","span":{"start":[801,25],"end":[801,40],"bytes":[26951,26966]},"callee":null},"802:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@802:15","span":{"start":[802,15],"end":[802,41],"bytes":[26981,27007]},"callee":null},"804:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@804:32","span":{"start":[804,32],"end":[804,77],"bytes":[27057,27102]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"811:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@811:14","span":{"start":[811,14],"end":[811,43],"bytes":[27295,27324]},"callee":null},"813:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX@813:31","span":{"start":[813,31],"end":[813,75],"bytes":[27372,27416]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","kind":"method","span":{"start":[820,1],"end":[854,2],"bytes":[27615,29032]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[820,1],"end":[820,141],"bytes":[27615,27755]}},{"name":"key","type":"string","span":{"start":[820,1],"end":[820,141],"bytes":[27615,27755]}},{"name":"r","type":"io.Reader","span":{"start":[820,1],"end":[820,141],"bytes":[27615,27755]}},{"name":"partSize","type":"int64","span":{"start":[820,1],"end":[820,141],"bytes":[27615,27755]}}],"return_type":"(int64, time.Time, *string, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"823:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@823:17","span":{"start":[823,17],"end":[823,54],"bytes":[27867,27904]},"callee":null},"823:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@823:32","span":{"start":[823,32],"end":[823,53],"bytes":[27882,27903]},"callee":"can://litestream/litestream/@external/io/TeeReader"},"825:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@825:31","span":{"start":[825,31],"end":[825,87],"bytes":[27952,28008]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"827:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@827:15","span":{"start":[827,15],"end":[827,50],"bytes":[28026,28061]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"827:15/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@827:15/2","span":{"start":[827,15],"end":[827,44],"bytes":[28026,28055]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"829:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@829:15","span":{"start":[829,15],"end":[829,59],"bytes":[28077,28121]},"callee":"can://litestream/litestream/@external/io/CopyN"},"829:42":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@829:42","span":{"start":[829,42],"end":[829,58],"bytes":[28104,28120]},"callee":null},"829:48":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@829:48","span":{"start":[829,48],"end":[829,57],"bytes":[28110,28119]},"callee":"can://litestream/litestream/@external/bytes/Buffer.Len"},"829:76":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@829:76","span":{"start":[829,76],"end":[829,98],"bytes":[28138,28160]},"callee":"can://litestream/litestream/@external/errors/Is"},"830:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@830:31","span":{"start":[830,31],"end":[830,83],"bytes":[28193,28245]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"833:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@833:11","span":{"start":[833,11],"end":[833,43],"bytes":[28260,28292]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput"},"836:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@836:13","span":{"start":[836,13],"end":[836,29],"bytes":[28380,28396]},"callee":null},"836:19":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@836:19","span":{"start":[836,19],"end":[836,28],"bytes":[28386,28395]},"callee":"can://litestream/litestream/@external/bytes/Buffer.Len"},"837:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@837:16","span":{"start":[837,16],"end":[837,44],"bytes":[28431,28459]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"837:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@837:32","span":{"start":[837,32],"end":[837,43],"bytes":[28447,28458]},"callee":"can://litestream/litestream/@external/bytes/Buffer.Bytes"},"838:25":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@838:25","span":{"start":[838,25],"end":[838,40],"bytes":[28484,28499]},"callee":null},"839:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@839:15","span":{"start":[839,15],"end":[839,41],"bytes":[28514,28540]},"callee":null},"841:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@841:32","span":{"start":[841,32],"end":[841,77],"bytes":[28590,28635]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"847:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@847:32","span":{"start":[847,32],"end":[847,79],"bytes":[28786,28833]},"callee":"can://litestream/litestream/@external/io/MultiReader"},"847:47":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@847:47","span":{"start":[847,47],"end":[847,75],"bytes":[28801,28829]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"847:63":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@847:63","span":{"start":[847,63],"end":[847,74],"bytes":[28817,28828]},"callee":"can://litestream/litestream/@external/bytes/Buffer.Bytes"},"847:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@847:8","span":{"start":[847,8],"end":[847,80],"bytes":[28762,28834]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter"},"849:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@849:14","span":{"start":[849,14],"end":[849,43],"bytes":[28865,28894]},"callee":null},"851:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@851:31","span":{"start":[851,31],"end":[851,75],"bytes":[28942,28986]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"853:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX@853:9","span":{"start":[853,9],"end":[853,15],"bytes":[28998,29004]},"callee":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N"}}},"github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","kind":"method","span":{"start":[528,1],"end":[582,2],"bytes":[16834,18856]},"signature":"github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":14},"body":{"531:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@531:10","span":{"start":[531,10],"end":[531,108],"bytes":[17014,17112]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"540:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@540:11","span":{"start":[540,11],"end":[540,98],"bytes":[17360,17447]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"544:20":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@544:20","span":{"start":[544,20],"end":[544,69],"bytes":[17547,17596]},"callee":"can://litestream/litestream/@external/encoding/base64/Encoding.DecodeString"},"546:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@546:11","span":{"start":[546,11],"end":[546,75],"bytes":[17625,17689]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"548:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@548:6","span":{"start":[548,6],"end":[548,19],"bytes":[17699,17712]},"callee":null},"549:100":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@549:100","span":{"start":[549,100],"end":[549,113],"bytes":[17820,17833]},"callee":null},"549:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@549:11","span":{"start":[549,11],"end":[549,114],"bytes":[17731,17834]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"554:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@554:11","span":{"start":[554,11],"end":[554,28],"bytes":[17921,17938]},"callee":"can://litestream/litestream/@external/crypto/md5/Sum"},"555:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@555:26","span":{"start":[555,26],"end":[555,67],"bytes":[17964,18005]},"callee":"can://litestream/litestream/@external/encoding/base64/Encoding.EncodeToString"},"561:51":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@561:51","span":{"start":[561,51],"end":[561,90],"bytes":[18189,18228]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"561:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@561:8","span":{"start":[561,8],"end":[561,46],"bytes":[18146,18184]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"564:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@564:7","span":{"start":[564,7],"end":[564,45],"bytes":[18279,18317]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"565:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@565:15","span":{"start":[565,15],"end":[565,34],"bytes":[18334,18353]},"callee":"can://litestream/litestream/@external/net/url/Parse"},"567:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@567:14","span":{"start":[567,14],"end":[567,26],"bytes":[18387,18399]},"callee":"can://litestream/litestream/@external/net/url/URL.Hostname"},"571:22":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@571:22","span":{"start":[571,22],"end":[571,39],"bytes":[18518,18535]},"callee":"can://litestream/litestream/@external/net/ParseIP"},"571:55":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@571:55","span":{"start":[571,55],"end":[571,70],"bytes":[18551,18566]},"callee":"can://litestream/litestream/@external/net/IP.IsLoopback"},"571:74":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@571:74","span":{"start":[571,74],"end":[571,88],"bytes":[18570,18584]},"callee":"can://litestream/litestream/@external/net/IP.IsPrivate"},"574:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig@574:14","span":{"start":[574,14],"end":[574,123],"bytes":[18707,18816]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}}},"fields":{"AccessKeyID":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/AccessKeyID","kind":"field","type":"string","span":{"start":[94,1],"end":[94,24],"bytes":[2757,2780]}},"Bucket":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Bucket","kind":"field","type":"string","span":{"start":[99,1],"end":[99,27],"bytes":[2859,2885]}},"Concurrency":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Concurrency","kind":"field","type":"int","span":{"start":[111,1],"end":[111,72],"bytes":[3187,3258]}},"Endpoint":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Endpoint","kind":"field","type":"string","span":{"start":[101,1],"end":[101,27],"bytes":[2913,2939]}},"ForcePathStyle":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/ForcePathStyle","kind":"field","type":"bool","span":{"start":[102,1],"end":[102,25],"bytes":[2940,2964]}},"MetadataConcurrency":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/MetadataConcurrency","kind":"field","type":"int","span":{"start":[116,1],"end":[116,25],"bytes":[3473,3497]}},"PartSize":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/PartSize","kind":"field","type":"int64","span":{"start":[110,1],"end":[110,69],"bytes":[3118,3186]}},"Path":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[100,1],"end":[100,27],"bytes":[2886,2912]}},"Region":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/Region","kind":"field","type":"string","span":{"start":[98,1],"end":[98,27],"bytes":[2832,2858]}},"RequireContentMD5":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/RequireContentMD5","kind":"field","type":"bool","span":{"start":[106,1],"end":[106,25],"bytes":[3040,3064]}},"SSECustomerAlgorithm":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SSECustomerAlgorithm","kind":"field","type":"string","span":{"start":[120,1],"end":[120,56],"bytes":[3631,3686]}},"SSECustomerKey":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SSECustomerKey","kind":"field","type":"string","span":{"start":[121,1],"end":[121,80],"bytes":[3687,3766]}},"SSECustomerKeyMD5":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SSECustomerKeyMD5","kind":"field","type":"string","span":{"start":[122,1],"end":[122,85],"bytes":[3767,3851]}},"SSEKMSKeyID":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SSEKMSKeyID","kind":"field","type":"string","span":{"start":[126,1],"end":[126,49],"bytes":[3957,4005]}},"SecretAccessKey":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SecretAccessKey","kind":"field","type":"string","span":{"start":[95,1],"end":[95,24],"bytes":[2781,2804]}},"SignAcceptEncoding":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SignAcceptEncoding","kind":"field","type":"bool","span":{"start":[105,1],"end":[105,25],"bytes":[3015,3039]}},"SignPayload":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SignPayload","kind":"field","type":"bool","span":{"start":[104,1],"end":[104,25],"bytes":[2990,3014]}},"SkipVerify":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/SkipVerify","kind":"field","type":"bool","span":{"start":[103,1],"end":[103,25],"bytes":[2965,2989]}},"StorageClass":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/StorageClass","kind":"field","type":"string","span":{"start":[107,1],"end":[107,27],"bytes":[3065,3091]}},"logger":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[91,1],"end":[91,23],"bytes":[2704,2726]}},"mu":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[88,1],"end":[88,21],"bytes":[2620,2640]}},"s3":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/s3","kind":"field","type":"invalid type","span":{"start":[89,1],"end":[89,35],"bytes":[2641,2675]}},"uploader":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/uploader","kind":"field","type":"invalid type","span":{"start":[90,1],"end":[90,28],"bytes":[2676,2703]}}}},"contentMD5StackKey":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.contentMD5StackKey","kind":"struct","span":{"start":[81,1],"end":[81,33],"bytes":[2387,2419]},"callables":{}},"fileIterator":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator","kind":"struct","span":{"start":[1518,1],"end":[1536,2],"bytes":[48010,48466]},"callables":{"github.com/benbjohnson/litestream/s3.fileIterator.Close":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Close","kind":"method","span":{"start":[1636,1],"end":[1640,2],"bytes":[51301,51398]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"1638:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Close@1638:2","span":{"start":[1638,2],"end":[1638,14],"bytes":[51368,51380]},"callee":null}}},"github.com/benbjohnson/litestream/s3.fileIterator.Err":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Err","kind":"method","span":{"start":[1745,1],"end":[1747,2],"bytes":[54089,54145]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.Err","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.fileIterator.Item":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Item","kind":"method","span":{"start":[1740,1],"end":[1742,2],"bytes":[53964,54030]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.Item","parameters":[],"return_type":"invalid type","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/s3.fileIterator.Next":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next","kind":"method","span":{"start":[1643,1],"end":[1737,2],"bytes":[51479,53911]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.Next","parameters":[],"return_type":"bool","metrics":{"cyclomatic":17},"body":{"1651:42":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1651:42","span":{"start":[1651,42],"end":[1651,64],"bytes":[51701,51723]},"callee":null},"1652:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1652:8","span":{"start":[1652,8],"end":[1652,36],"bytes":[51733,51761]},"callee":null},"1657:20":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1657:20","span":{"start":[1657,20],"end":[1657,51],"bytes":[51823,51854]},"callee":null},"1665:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1665:7","span":{"start":[1665,7],"end":[1665,29],"bytes":[51981,52003]},"callee":null},"1666:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1666:13","span":{"start":[1666,13],"end":[1666,54],"bytes":[52022,52063]},"callee":null},"1666:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1666:31","span":{"start":[1666,31],"end":[1666,53],"bytes":[52040,52062]},"callee":null},"1668:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1668:13","span":{"start":[1668,13],"end":[1668,59],"bytes":[52120,52166]},"callee":null},"1668:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1668:26","span":{"start":[1668,26],"end":[1668,58],"bytes":[52133,52165]},"callee":"can://litestream/litestream/@external/path/Base"},"1668:36":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1668:36","span":{"start":[1668,36],"end":[1668,57],"bytes":[52143,52164]},"callee":null},"1670:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1670:5","span":{"start":[1670,5],"end":[1670,80],"bytes":[52177,52252]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"1676:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1676:26","span":{"start":[1676,26],"end":[1676,48],"bytes":[52514,52536]},"callee":null},"1677:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1677:13","span":{"start":[1677,13],"end":[1677,54],"bytes":[52555,52596]},"callee":null},"1677:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1677:31","span":{"start":[1677,31],"end":[1677,53],"bytes":[52573,52595]},"callee":null},"1679:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1679:13","span":{"start":[1679,13],"end":[1679,48],"bytes":[52653,52688]},"callee":null},"1679:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1679:26","span":{"start":[1679,26],"end":[1679,47],"bytes":[52666,52687]},"callee":null},"1681:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1681:15","span":{"start":[1681,15],"end":[1681,43],"bytes":[52709,52737]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch"},"1689:22":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1689:22","span":{"start":[1689,22],"end":[1689,44],"bytes":[52854,52876]},"callee":null},"1694:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1694:15","span":{"start":[1694,15],"end":[1694,36],"bytes":[52989,53010]},"callee":null},"1695:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1695:11","span":{"start":[1695,11],"end":[1695,29],"bytes":[53021,53039]},"callee":"can://litestream/litestream/@external/path/Base"},"1696:29":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1696:29","span":{"start":[1696,29],"end":[1696,51],"bytes":[53068,53090]},"callee":null},"1719:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1719:16","span":{"start":[1719,16],"end":[1719,37],"bytes":[53466,53487]},"callee":null},"1727:23":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1727:23","span":{"start":[1727,23],"end":[1727,57],"bytes":[53754,53788]},"callee":null},"1727:23/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1727:23/2","span":{"start":[1727,23],"end":[1727,51],"bytes":[53754,53782]},"callee":null},"1730:22":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1730:22","span":{"start":[1730,22],"end":[1730,56],"bytes":[53828,53862]},"callee":null},"1730:22/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next@1730:22/2","span":{"start":[1730,22],"end":[1730,50],"bytes":[53828,53856]},"callee":null}}},"github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch","kind":"method","span":{"start":[1563,1],"end":[1633,2],"bytes":[49257,51220]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch","parameters":[{"name":"keys","type":"[]string","span":{"start":[1563,1],"end":[1563,67],"bytes":[49257,49323]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"1564:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch@1564:5","span":{"start":[1564,5],"end":[1564,14],"bytes":[49328,49337]},"callee":null},"1575:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch@1575:13","span":{"start":[1575,13],"end":[1575,50],"bytes":[49591,49628]},"callee":null},"1575:40":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch@1575:40","span":{"start":[1575,40],"end":[1575,49],"bytes":[49618,49627]},"callee":null},"1579:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch@1579:31","span":{"start":[1579,31],"end":[1579,49],"bytes":[49757,49775]},"callee":null},"1579:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch@1579:9","span":{"start":[1579,9],"end":[1579,50],"bytes":[49735,49776]},"callee":null},"1580:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch@1580:12","span":{"start":[1580,12],"end":[1580,41],"bytes":[49788,49817]},"callee":null},"1585:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch@1585:3","span":{"start":[1585,3],"end":[1621,5],"bytes":[49888,51063]},"callee":null},"1624:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch@1624:12","span":{"start":[1624,12],"end":[1624,20],"bytes":[51079,51087]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1","kind":"function","span":{"start":[1585,1],"end":[1621,5],"bytes":[49886,51063]},"signature":"github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1","parameters":[],"return_type":"error","error_channel":["error"],"body":{"1587:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1587:14","span":{"start":[1587,14],"end":[1587,33],"bytes":[49987,50006]},"callee":null},"1590:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1590:10","span":{"start":[1590,10],"end":[1590,24],"bytes":[50071,50085]},"callee":null,"is_deferred":true},"1593:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1593:13","span":{"start":[1593,13],"end":[1593,42],"bytes":[50136,50165]},"callee":null},"1594:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1594:13","span":{"start":[1594,13],"end":[1594,28],"bytes":[50179,50194]},"callee":null},"1600:38":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1600:38","span":{"start":[1600,38],"end":[1600,81],"bytes":[50451,50494]},"callee":null},"1601:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1601:32","span":{"start":[1601,32],"end":[1601,69],"bytes":[50526,50563]},"callee":null},"1602:35":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1602:35","span":{"start":[1602,35],"end":[1602,75],"bytes":[50598,50638]},"callee":null},"1605:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1605:17","span":{"start":[1605,17],"end":[1605,57],"bytes":[50661,50701]},"callee":null},"1613:24":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1613:24","span":{"start":[1613,24],"end":[1613,56],"bytes":[50918,50950]},"callee":"can://litestream/litestream/@external/time/Parse"},"1614:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1614:7","span":{"start":[1614,7],"end":[1614,16],"bytes":[50971,50980]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"1616:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1@1616:7","span":{"start":[1616,7],"end":[1616,18],"bytes":[51015,51026]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"}}}}}},"fields":{"cancel":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[1520,1],"end":[1520,27],"bytes":[48061,48087]}},"client":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/client","kind":"field","type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","span":{"start":[1521,1],"end":[1521,23],"bytes":[48088,48110]}},"closed":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/closed","kind":"field","type":"bool","span":{"start":[1533,1],"end":[1533,13],"bytes":[48416,48428]}},"ctx":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/ctx","kind":"field","type":"context.Context","span":{"start":[1519,1],"end":[1519,24],"bytes":[48037,48060]}},"err":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/err","kind":"field","type":"error","span":{"start":[1534,1],"end":[1534,14],"bytes":[48429,48442]}},"info":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/info","kind":"field","type":"invalid type","span":{"start":[1535,1],"end":[1535,22],"bytes":[48443,48464]}},"level":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/level","kind":"field","type":"int","span":{"start":[1522,1],"end":[1522,12],"bytes":[48111,48122]}},"metadataCache":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/metadataCache","kind":"field","type":"map[string]time.Time","span":{"start":[1527,1],"end":[1527,80],"bytes":[48246,48325]}},"page":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/page","kind":"field","type":"invalid type","span":{"start":[1530,1],"end":[1530,35],"bytes":[48365,48399]}},"pageIndex":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/pageIndex","kind":"field","type":"int","span":{"start":[1531,1],"end":[1531,15],"bytes":[48400,48414]}},"paginator":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/paginator","kind":"field","type":"invalid type","span":{"start":[1529,1],"end":[1529,38],"bytes":[48327,48364]}},"prefix":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/prefix","kind":"field","type":"string","span":{"start":[1524,1],"end":[1524,15],"bytes":[48140,48154]}},"seek":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/seek","kind":"field","type":"invalid type","span":{"start":[1523,1],"end":[1523,17],"bytes":[48123,48139]}},"useMetadata":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/useMetadata","kind":"field","type":"bool","span":{"start":[1526,1],"end":[1526,90],"bytes":[48156,48245]}}}}},"functions":{"github.com/benbjohnson/litestream/s3.NewReplicaClient":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","kind":"function","span":{"start":[130,1],"end":[137,2],"bytes":[4070,4290]},"signature":"github.com/benbjohnson/litestream/s3.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","metrics":{"cyclomatic":1},"body":{"132:23":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient@132:23","span":{"start":[132,23],"end":[132,66],"bytes":[4157,4200]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"132:23/2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient@132:23/2","span":{"start":[132,23],"end":[132,37],"bytes":[4157,4171]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","kind":"function","span":{"start":[145,1],"end":[344,2],"bytes":[4536,10753]},"signature":"github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}},{"name":"host","type":"string","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}},{"name":"urlPath","type":"string","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}},{"name":"query","type":"net/url.Values","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[145,1],"end":[145,137],"bytes":[4536,4672]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":47},"body":{"146:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@146:12","span":{"start":[146,12],"end":[146,30],"bytes":[4684,4702]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient"},"167:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@167:5","span":{"start":[167,5],"end":[167,36],"bytes":[5199,5230]},"callee":"can://litestream/litestream/@external/strings/HasPrefix"},"169:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@169:12","span":{"start":[169,12],"end":[169,44],"bytes":[5260,5292]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN"},"171:46":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@171:46","span":{"start":[171,46],"end":[171,61],"bytes":[5348,5363]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost"},"175:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@175:18","span":{"start":[175,18],"end":[175,39],"bytes":[5432,5453]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"177:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@177:18","span":{"start":[177,18],"end":[177,60],"bytes":[5576,5618]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme"},"180:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@180:15","span":{"start":[180,15],"end":[180,85],"bytes":[5735,5805]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"184:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@184:16","span":{"start":[184,16],"end":[184,35],"bytes":[5865,5884]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"187:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@187:14","span":{"start":[187,14],"end":[187,84],"bytes":[5937,6007]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"190:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@190:14","span":{"start":[190,14],"end":[190,75],"bytes":[6051,6112]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"193:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@193:14","span":{"start":[193,14],"end":[193,77],"bytes":[6152,6215]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"197:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@197:14","span":{"start":[197,14],"end":[197,92],"bytes":[6280,6358]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"201:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@201:14","span":{"start":[201,14],"end":[201,90],"bytes":[6437,6513]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue"},"205:19":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@205:19","span":{"start":[205,19],"end":[205,65],"bytes":[6581,6627]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue"},"208:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@208:17","span":{"start":[208,17],"end":[208,23],"bytes":[6692,6698]},"callee":null},"211:19":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@211:19","span":{"start":[211,19],"end":[211,75],"bytes":[6744,6800]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue"},"216:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@216:10","span":{"start":[216,10],"end":[216,35],"bytes":[6876,6901]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"218:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@218:17","span":{"start":[218,17],"end":[218,43],"bytes":[6948,6974]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"224:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@224:15","span":{"start":[224,15],"end":[224,63],"bytes":[7067,7115]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"228:23":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@228:23","span":{"start":[228,23],"end":[228,50],"bytes":[7210,7237]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"228:60":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@228:60","span":{"start":[228,60],"end":[228,89],"bytes":[7247,7276]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"231:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@231:10","span":{"start":[231,10],"end":[231,40],"bytes":[7344,7374]},"callee":"can://litestream/litestream/@external/os/Getenv"},"233:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@233:17","span":{"start":[233,17],"end":[233,54],"bytes":[7427,7464]},"callee":"can://litestream/litestream/@external/os/Getenv"},"236:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@236:10","span":{"start":[236,10],"end":[236,44],"bytes":[7513,7547]},"callee":"can://litestream/litestream/@external/os/Getenv"},"238:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@238:17","span":{"start":[238,17],"end":[238,58],"bytes":[7604,7645]},"callee":"can://litestream/litestream/@external/os/Getenv"},"243:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@243:11","span":{"start":[243,11],"end":[243,46],"bytes":[7721,7756]},"callee":"can://litestream/litestream/@external/os/Getenv"},"244:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@244:18","span":{"start":[244,18],"end":[244,52],"bytes":[7785,7819]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme"},"252:15":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@252:15","span":{"start":[252,15],"end":[252,53],"bytes":[7979,8017]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint"},"253:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@253:14","span":{"start":[253,14],"end":[253,51],"bytes":[8031,8068]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint"},"254:20":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@254:20","span":{"start":[254,20],"end":[254,63],"bytes":[8088,8131]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint"},"255:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@255:17","span":{"start":[255,17],"end":[255,57],"bytes":[8148,8188]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint"},"256:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@256:16","span":{"start":[256,16],"end":[256,55],"bytes":[8204,8243]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint"},"257:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@257:16","span":{"start":[257,16],"end":[257,55],"bytes":[8259,8298]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint"},"258:20":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@258:20","span":{"start":[258,20],"end":[258,63],"bytes":[8318,8361]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint"},"259:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@259:13","span":{"start":[259,13],"end":[259,49],"bytes":[8374,8410]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint"},"260:16":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@260:16","span":{"start":[260,16],"end":[260,55],"bytes":[8426,8465]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint"},"320:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@320:10","span":{"start":[320,10],"end":[320,43],"bytes":[10010,10043]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"322:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@322:17","span":{"start":[322,17],"end":[322,52],"bytes":[10105,10140]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"325:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@325:10","span":{"start":[325,10],"end":[325,37],"bytes":[10198,10225]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"327:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@327:17","span":{"start":[327,17],"end":[327,46],"bytes":[10281,10310]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"330:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@330:10","span":{"start":[330,10],"end":[330,40],"bytes":[10362,10392]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"332:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@332:17","span":{"start":[332,17],"end":[332,50],"bytes":[10451,10484]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"337:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@337:10","span":{"start":[337,10],"end":[337,34],"bytes":[10587,10611]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"339:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL@339:17","span":{"start":[339,17],"end":[339,44],"bytes":[10664,10691]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"}}},"github.com/benbjohnson/litestream/s3.ParseHost":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","kind":"function","span":{"start":[1786,1],"end":[1830,2],"bytes":[55152,56729]},"signature":"github.com/benbjohnson/litestream/s3.ParseHost","parameters":[{"name":"host","type":"string","span":{"start":[1786,1],"end":[1786,85],"bytes":[55152,55236]}}],"return_type":"(string, string, string, bool)","metrics":{"cyclomatic":9},"body":{"1788:37":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1788:37","span":{"start":[1788,37],"end":[1788,67],"bytes":[55324,55354]},"callee":"can://litestream/litestream/@external/strings/Contains"},"1788:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1788:5","span":{"start":[1788,5],"end":[1788,32],"bytes":[55292,55319]},"callee":"can://litestream/litestream/@external/strings/Contains"},"1789:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1789:12","span":{"start":[1789,12],"end":[1789,40],"bytes":[55368,55396]},"callee":"can://litestream/litestream/@external/strings/SplitN"},"1790:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1790:6","span":{"start":[1790,6],"end":[1790,16],"bytes":[55402,55412]},"callee":null},"1802:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1802:10","span":{"start":[1802,10],"end":[1802,45],"bytes":[55744,55779]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"1802:47":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1802:47","span":{"start":[1802,47],"end":[1802,53],"bytes":[55781,55787]},"callee":null},"1804:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1804:6","span":{"start":[1804,6],"end":[1804,12],"bytes":[55815,55821]},"callee":null},"1808:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1808:17","span":{"start":[1808,17],"end":[1808,59],"bytes":[55914,55956]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"1808:61":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1808:61","span":{"start":[1808,61],"end":[1808,67],"bytes":[55958,55964]},"callee":null},"1811:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1811:26","span":{"start":[1811,26],"end":[1811,82],"bytes":[56028,56084]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1812:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1812:17","span":{"start":[1812,17],"end":[1812,56],"bytes":[56108,56147]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"1812:58":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1812:58","span":{"start":[1812,58],"end":[1812,64],"bytes":[56149,56155]},"callee":null},"1815:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1815:14","span":{"start":[1815,14],"end":[1815,66],"bytes":[56207,56259]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1817:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1817:17","span":{"start":[1817,17],"end":[1817,55],"bytes":[56316,56354]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"1817:57":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1817:57","span":{"start":[1817,57],"end":[1817,63],"bytes":[56356,56362]},"callee":null},"1821:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1821:17","span":{"start":[1821,17],"end":[1821,55],"bytes":[56469,56507]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"1821:57":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1821:57","span":{"start":[1821,57],"end":[1821,63],"bytes":[56509,56515]},"callee":null},"1824:14":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost@1824:14","span":{"start":[1824,14],"end":[1824,52],"bytes":[56567,56605]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream/s3.ParseURL":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL","kind":"function","span":{"start":[1751,1],"end":[1782,2],"bytes":[54255,55013]},"signature":"github.com/benbjohnson/litestream/s3.ParseURL","parameters":[{"name":"s","type":"string","span":{"start":[1751,1],"end":[1751,76],"bytes":[54255,54330]}},{"name":"endpoint","type":"string","span":{"start":[1751,1],"end":[1751,76],"bytes":[54255,54330]}}],"return_type":"(string, string, string, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"1752:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1752:12","span":{"start":[1752,12],"end":[1752,24],"bytes":[54342,54354]},"callee":"can://litestream/litestream/@external/net/url/Parse"},"1758:22":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1758:22","span":{"start":[1758,22],"end":[1758,58],"bytes":[54445,54481]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1763:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1763:12","span":{"start":[1763,12],"end":[1763,67],"bytes":[54566,54621]},"callee":"can://litestream/litestream/@external/strings/SplitN"},"1763:27":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1763:27","span":{"start":[1763,27],"end":[1763,58],"bytes":[54581,54612]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"},"1764:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1764:6","span":{"start":[1764,6],"end":[1764,16],"bytes":[54627,54637]},"callee":null},"1765:23":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1765:23","span":{"start":[1765,23],"end":[1765,56],"bytes":[54667,54700]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"1768:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1768:6","span":{"start":[1768,6],"end":[1768,16],"bytes":[54730,54740]},"callee":null},"1775:25":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1775:25","span":{"start":[1775,25],"end":[1775,42],"bytes":[54881,54898]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost"},"1780:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL@1780:8","span":{"start":[1780,8],"end":[1780,39],"bytes":[54947,54978]},"callee":"can://litestream/litestream/@external/strings/TrimPrefix"}}},"github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","kind":"function","span":{"start":[1077,1],"end":[1092,2],"bytes":[36315,36656]},"signature":"github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","parameters":[{"name":"deleteInput","type":"invalid type","span":{"start":[1077,1],"end":[1077,81],"bytes":[36315,36395]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1082:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5@1082:18","span":{"start":[1082,18],"end":[1082,51],"bytes":[36459,36492]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects"},"1086:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5@1086:5","span":{"start":[1086,5],"end":[1086,17],"bytes":[36534,36546]},"callee":null},"1090:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5@1090:9","span":{"start":[1090,9],"end":[1090,25],"bytes":[36583,36599]},"callee":"can://litestream/litestream/@external/crypto/md5/Sum"},"1091:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5@1091:9","span":{"start":[1091,9],"end":[1091,50],"bytes":[36608,36649]},"callee":"can://litestream/litestream/@external/encoding/base64/Encoding.EncodeToString"}}},"github.com/benbjohnson/litestream/s3.deleteOutputError":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","kind":"function","span":{"start":[1848,1],"end":[1860,2],"bytes":[57303,57645]},"signature":"github.com/benbjohnson/litestream/s3.deleteOutputError","parameters":[{"name":"out","type":"invalid type","span":{"start":[1848,1],"end":[1848,60],"bytes":[57303,57362]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1849:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError@1849:5","span":{"start":[1849,5],"end":[1849,20],"bytes":[57367,57382]},"callee":null},"1855:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError@1855:2","span":{"start":[1855,2],"end":[1855,42],"bytes":[57455,57495]},"callee":"can://litestream/litestream/@external/strings/Builder.WriteString"},"1857:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError@1857:3","span":{"start":[1857,3],"end":[1857,80],"bytes":[57532,57609]},"callee":"can://litestream/litestream/@external/fmt/Fprintf"},"1857:31":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError@1857:31","span":{"start":[1857,31],"end":[1857,52],"bytes":[57560,57581]},"callee":null},"1857:54":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError@1857:54","span":{"start":[1857,54],"end":[1857,79],"bytes":[57583,57608]},"callee":null},"1859:20":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError@1859:20","span":{"start":[1859,20],"end":[1859,30],"bytes":[57632,57642]},"callee":"can://litestream/litestream/@external/strings/Builder.String"},"1859:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError@1859:9","span":{"start":[1859,9],"end":[1859,31],"bytes":[57621,57643]},"callee":"can://litestream/litestream/@external/errors/New"}}},"github.com/benbjohnson/litestream/s3.encodeDeleteDocument":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument","kind":"function","span":{"start":[1117,1],"end":[1140,2],"bytes":[37177,37694]},"signature":"github.com/benbjohnson/litestream/s3.encodeDeleteDocument","parameters":[{"name":"v","type":"invalid type","span":{"start":[1117,1],"end":[1117,74],"bytes":[37177,37250]}},{"name":"value","type":"invalid type","span":{"start":[1117,1],"end":[1117,74],"bytes":[37177,37250]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1118:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument@1118:8","span":{"start":[1118,8],"end":[1118,21],"bytes":[37258,37271]},"callee":null,"is_deferred":true},"1125:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument@1125:9","span":{"start":[1125,9],"end":[1125,37],"bytes":[37393,37421]},"callee":null},"1126:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument@1126:13","span":{"start":[1126,13],"end":[1126,54],"bytes":[37434,37475]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList"},"1136:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument@1136:9","span":{"start":[1136,9],"end":[1136,34],"bytes":[37629,37654]},"callee":null},"1137:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument@1137:3","span":{"start":[1137,3],"end":[1137,23],"bytes":[37657,37677]},"callee":null}}},"github.com/benbjohnson/litestream/s3.encodeObjectIdentifier":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier","kind":"function","span":{"start":[1160,1],"end":[1203,2],"bytes":[38235,39183]},"signature":"github.com/benbjohnson/litestream/s3.encodeObjectIdentifier","parameters":[{"name":"v","type":"invalid type","span":{"start":[1160,1],"end":[1160,86],"bytes":[38235,38320]}},{"name":"value","type":"invalid type","span":{"start":[1160,1],"end":[1160,86],"bytes":[38235,38320]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"1161:8":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1161:8","span":{"start":[1161,8],"end":[1161,21],"bytes":[38328,38341]},"callee":null,"is_deferred":true},"1163:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1163:9","span":{"start":[1163,9],"end":[1167,5],"bytes":[38370,38468]},"callee":null},"1168:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1168:3","span":{"start":[1168,3],"end":[1168,21],"bytes":[38471,38489]},"callee":null},"1171:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1171:9","span":{"start":[1171,9],"end":[1175,5],"bytes":[38520,38617]},"callee":null},"1176:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1176:3","span":{"start":[1176,3],"end":[1176,20],"bytes":[38620,38637]},"callee":null},"1179:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1179:9","span":{"start":[1179,9],"end":[1183,5],"bytes":[38681,38791]},"callee":null},"1184:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1184:13","span":{"start":[1184,13],"end":[1184,59],"bytes":[38804,38850]},"callee":null},"1184:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1184:3","span":{"start":[1184,3],"end":[1184,60],"bytes":[38794,38851]},"callee":null},"1187:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1187:9","span":{"start":[1187,9],"end":[1191,5],"bytes":[38883,38981]},"callee":null},"1192:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1192:3","span":{"start":[1192,3],"end":[1192,19],"bytes":[38984,39000]},"callee":null},"1195:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1195:9","span":{"start":[1195,9],"end":[1199,5],"bytes":[39037,39140]},"callee":null},"1200:3":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier@1200:3","span":{"start":[1200,3],"end":[1200,26],"bytes":[39143,39166]},"callee":null}}},"github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList","kind":"function","span":{"start":[1142,1],"end":[1155,2],"bytes":[37696,38009]},"signature":"github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList","parameters":[{"name":"v","type":"[]invalid type","span":{"start":[1142,1],"end":[1142,91],"bytes":[37696,37786]}},{"name":"value","type":"invalid type","span":{"start":[1142,1],"end":[1142,91],"bytes":[37696,37786]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"1143:6":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList@1143:6","span":{"start":[1143,6],"end":[1143,25],"bytes":[37792,37811]},"callee":null},"1144:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList@1144:9","span":{"start":[1144,9],"end":[1144,22],"bytes":[37822,37835]},"callee":null,"is_deferred":true},"1147:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList@1147:11","span":{"start":[1147,11],"end":[1147,24],"bytes":[37850,37863]},"callee":null},"1149:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList@1149:13","span":{"start":[1149,13],"end":[1149,27],"bytes":[37896,37910]},"callee":null},"1150:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList@1150:13","span":{"start":[1150,13],"end":[1150,50],"bytes":[37923,37960]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier"}}},"github.com/benbjohnson/litestream/s3.init":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.init","kind":"function","span":{"start":[47,1],"end":[49,2],"bytes":[1012,1099]},"signature":"github.com/benbjohnson/litestream/s3.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"48:2":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.init@48:2","span":{"start":[48,2],"end":[48,72],"bytes":[1027,1097]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}},"github.com/benbjohnson/litestream/s3.isNotExists":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","kind":"function","span":{"start":[1840,1],"end":[1846,2],"bytes":[57147,57301]},"signature":"github.com/benbjohnson/litestream/s3.isNotExists","parameters":[{"name":"err","type":"error","span":{"start":[1840,1],"end":[1840,35],"bytes":[57147,57181]}}],"return_type":"bool","metrics":{"cyclomatic":2},"body":{"1842:5":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists@1842:5","span":{"start":[1842,5],"end":[1842,28],"bytes":[57214,57237]},"callee":"can://litestream/litestream/@external/errors/As"},"1843:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists@1843:10","span":{"start":[1843,10],"end":[1843,28],"bytes":[57249,57267]},"callee":null}}},"github.com/benbjohnson/litestream/s3.marshalDeleteObjects":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects","kind":"function","span":{"start":[1094,1],"end":[1115,2],"bytes":[36658,37175]},"signature":"github.com/benbjohnson/litestream/s3.marshalDeleteObjects","parameters":[{"name":"deleteInput","type":"invalid type","span":{"start":[1094,1],"end":[1094,71],"bytes":[36658,36728]}}],"return_type":"([]byte, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"1100:13":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects@1100:13","span":{"start":[1100,13],"end":[1100,39],"bytes":[36810,36836]},"callee":null},"1106:4":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects@1106:4","span":{"start":[1106,4],"end":[1106,82],"bytes":[36948,37026]},"callee":null},"1110:12":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects@1110:12","span":{"start":[1110,12],"end":[1110,72],"bytes":[37048,37108]},"callee":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument"},"1110:46":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects@1110:46","span":{"start":[1110,46],"end":[1110,71],"bytes":[37082,37107]},"callee":null},"1114:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects@1114:9","span":{"start":[1114,9],"end":[1114,24],"bytes":[37153,37168]},"callee":null}}},"github.com/benbjohnson/litestream/s3.newFileIterator":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator","kind":"function","span":{"start":[1538,1],"end":[1560,2],"bytes":[48468,49164]},"signature":"github.com/benbjohnson/litestream/s3.newFileIterator","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}},{"name":"client","type":"*github.com/benbjohnson/litestream/s3.ReplicaClient","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}},{"name":"level","type":"int","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}},{"name":"seek","type":"invalid type","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}},{"name":"useMetadata","type":"bool","span":{"start":[1538,1],"end":[1538,125],"bytes":[48468,48592]}}],"return_type":"*github.com/benbjohnson/litestream/s3.fileIterator","metrics":{"cyclomatic":1},"body":{"1539:17":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator@1539:17","span":{"start":[1539,17],"end":[1539,40],"bytes":[48609,48632]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"1541:32":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator@1541:32","span":{"start":[1541,32],"end":[1541,59],"bytes":[48665,48692]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"1550:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator@1550:18","span":{"start":[1550,18],"end":[1550,44],"bytes":[48907,48933]},"callee":null},"1554:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator@1554:18","span":{"start":[1554,18],"end":[1557,4],"bytes":[49015,49149]},"callee":null},"1555:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator@1555:11","span":{"start":[1555,11],"end":[1555,36],"bytes":[49089,49114]},"callee":null},"1556:11":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator@1556:11","span":{"start":[1556,11],"end":[1556,29],"bytes":[49126,49144]},"callee":null}}},"github.com/benbjohnson/litestream/s3.newTransportRetryer":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newTransportRetryer","kind":"function","span":{"start":[594,1],"end":[612,2],"bytes":[19486,20228]},"signature":"github.com/benbjohnson/litestream/s3.newTransportRetryer","parameters":[],"return_type":"invalid type","metrics":{"cyclomatic":1},"body":{"595:9":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newTransportRetryer@595:9","span":{"start":[595,9],"end":[611,4],"bytes":[19535,20226]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newTransportRetryer/github.com/benbjohnson/litestream/s3.newTransportRetryer.closure_1","kind":"function","span":{"start":[595,1],"end":[611,4],"bytes":[19527,20226]},"signature":"github.com/benbjohnson/litestream/s3.newTransportRetryer.closure_1","parameters":[{"name":"o","type":"invalid type","span":{"start":[595,1],"end":[595,59],"bytes":[19527,19585]}}],"body":{"603:18":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newTransportRetryer/github.com/benbjohnson/litestream/s3.newTransportRetryer.closure_1@603:18","span":{"start":[603,18],"end":[610,4],"bytes":[20008,20222]},"callee":null}}}}},"github.com/benbjohnson/litestream/s3.parseS3DebugEnv":{"id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","kind":"function","span":{"start":[1864,1],"end":[1893,2],"bytes":[57807,58710]},"signature":"github.com/benbjohnson/litestream/s3.parseS3DebugEnv","parameters":[],"return_type":"invalid type","metrics":{"cyclomatic":12},"body":{"1865:7":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv@1865:7","span":{"start":[1865,7],"end":[1865,39],"bytes":[57856,57888]},"callee":"can://litestream/litestream/@external/os/Getenv"},"1871:23":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv@1871:23","span":{"start":[1871,23],"end":[1871,44],"bytes":[57971,57992]},"callee":"can://litestream/litestream/@external/strings/Split"},"1872:10":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv@1872:10","span":{"start":[1872,10],"end":[1872,50],"bytes":[58004,58044]},"callee":"can://litestream/litestream/@external/strings/ToLower"},"1872:26":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv@1872:26","span":{"start":[1872,26],"end":[1872,49],"bytes":[58020,58043]},"callee":"can://litestream/litestream/@external/strings/TrimSpace"},"1889:4":{"kind":"call","id":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv@1889:4","span":{"start":[1889,4],"end":[1889,156],"bytes":[58533,58685]},"callee":"can://litestream/litestream/@external/log/slog/Warn"}}}},"content_hash":"067ee2bdceaeb371ea22bf7d32034bcfa8e86ff8c0292bcb38d3d784db69cc78"},"server.go":{"id":"can://litestream/litestream/go/server.go","kind":"module","span":{"start":[1,1],"end":[681,1],"bytes":[0,17841]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/pprof\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n)\n\n// SocketConfig configures the Unix socket for control commands.\ntype SocketConfig struct {\n\tEnabled bool `yaml:\"enabled\"`\n\tPath string `yaml:\"path\"`\n\tPermissions uint32 `yaml:\"permissions\"`\n}\n\n// DefaultSocketConfig returns the default socket configuration.\nfunc DefaultSocketConfig() SocketConfig {\n\treturn SocketConfig{\n\t\tEnabled: false,\n\t\tPath: \"/var/run/litestream.sock\",\n\t\tPermissions: 0600,\n\t}\n}\n\n// Server manages runtime control via Unix socket using HTTP.\ntype Server struct {\n\tstore *Store\n\n\t// SocketPath is the path to the Unix socket.\n\tSocketPath string\n\n\t// SocketPerms is the file permissions for the socket.\n\tSocketPerms uint32\n\n\t// PathExpander optionally expands paths (e.g., ~ expansion).\n\t// If nil, paths are used as-is.\n\tPathExpander func(string) (string, error)\n\n\t// Version is the version string to report in /info.\n\tVersion string\n\n\t// startedAt is set when the server starts.\n\tstartedAt time.Time\n\n\tsocketListener net.Listener\n\thttpServer *http.Server\n\n\tctx context.Context\n\tcancel context.CancelFunc\n\twg sync.WaitGroup\n\n\tlogger *slog.Logger\n}\n\n// NewServer creates a new Server instance.\nfunc NewServer(store *Store) *Server {\n\tctx, cancel := context.WithCancel(context.Background())\n\ts := \u0026Server{\n\t\tstore: store,\n\t\tSocketPerms: 0600,\n\t\tctx: ctx,\n\t\tcancel: cancel,\n\t\tlogger: slog.Default().With(LogKeySystem, LogSystemServer),\n\t}\n\n\tmux := http.NewServeMux()\n\tmux.HandleFunc(\"POST /start\", s.handleStart)\n\tmux.HandleFunc(\"POST /stop\", s.handleStop)\n\tmux.HandleFunc(\"GET /txid\", s.handleTXID)\n\tmux.HandleFunc(\"POST /register\", s.handleRegister)\n\tmux.HandleFunc(\"POST /unregister\", s.handleUnregister)\n\tmux.HandleFunc(\"POST /sync\", s.handleSync)\n\tmux.HandleFunc(\"GET /list\", s.handleList)\n\tmux.HandleFunc(\"GET /info\", s.handleInfo)\n\tmux.HandleFunc(\"GET /debug/sync-status\", s.handleSyncStatus)\n\n\t// pprof endpoints\n\tmux.HandleFunc(\"GET /debug/pprof/\", pprof.Index)\n\tmux.HandleFunc(\"GET /debug/pprof/cmdline\", pprof.Cmdline)\n\tmux.HandleFunc(\"GET /debug/pprof/profile\", pprof.Profile)\n\tmux.HandleFunc(\"GET /debug/pprof/symbol\", pprof.Symbol)\n\tmux.HandleFunc(\"GET /debug/pprof/trace\", pprof.Trace)\n\n\ts.httpServer = \u0026http.Server{Handler: mux}\n\n\treturn s\n}\n\n// Start begins listening for control connections.\nfunc (s *Server) Start() error {\n\tif s.SocketPath == \"\" {\n\t\treturn fmt.Errorf(\"socket path required\")\n\t}\n\n\t// Check if socket file exists and is actually a socket before removing\n\tif info, err := os.Lstat(s.SocketPath); err == nil {\n\t\tif info.Mode()\u0026os.ModeSocket != 0 {\n\t\t\tif err := os.Remove(s.SocketPath); err != nil {\n\t\t\t\treturn fmt.Errorf(\"remove existing socket: %w\", err)\n\t\t\t}\n\t\t} else {\n\t\t\treturn fmt.Errorf(\"socket path exists but is not a socket: %s\", s.SocketPath)\n\t\t}\n\t} else if !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"check socket path: %w\", err)\n\t}\n\n\tlistener, err := net.Listen(\"unix\", s.SocketPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"listen on unix socket: %w\", err)\n\t}\n\ts.socketListener = listener\n\n\tif err := os.Chmod(s.SocketPath, os.FileMode(s.SocketPerms)); err != nil {\n\t\tlistener.Close()\n\t\treturn fmt.Errorf(\"chmod socket: %w\", err)\n\t}\n\n\t// Set startedAt after successful socket setup to ensure uptime reflects\n\t// the actual time the server became available.\n\ts.startedAt = time.Now()\n\n\ts.logger.Info(\"control socket listening\", \"path\", s.SocketPath)\n\n\ts.wg.Add(1)\n\tgo func() {\n\t\tdefer s.wg.Done()\n\t\tif err := s.httpServer.Serve(listener); err != nil \u0026\u0026 err != http.ErrServerClosed {\n\t\t\ts.logger.Error(\"http server error\", \"error\", err)\n\t\t}\n\t}()\n\n\treturn nil\n}\n\n// Close gracefully shuts down the control server.\nfunc (s *Server) Close() error {\n\ts.cancel()\n\n\tctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\n\tdefer cancel()\n\n\tif s.httpServer != nil {\n\t\tif err := s.httpServer.Shutdown(ctx); err != nil {\n\t\t\ts.logger.Error(\"http server shutdown error\", \"error\", err)\n\t\t}\n\t}\n\ts.wg.Wait()\n\treturn nil\n}\n\n// expandPath expands the path using PathExpander if set.\nfunc (s *Server) expandPath(path string) (string, error) {\n\tif s.PathExpander != nil {\n\t\treturn s.PathExpander(path)\n\t}\n\treturn path, nil\n}\n\nfunc (s *Server) handleStart(w http.ResponseWriter, r *http.Request) {\n\tvar req StartRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\tctx := s.ctx\n\tif req.Timeout \u003e 0 {\n\t\tvar cancel context.CancelFunc\n\t\tctx, cancel = context.WithTimeout(s.ctx, time.Duration(req.Timeout)*time.Second)\n\t\tdefer cancel()\n\t}\n\n\tdb := s.store.FindDB(expandedPath)\n\tif db == nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"database not found: %s\", expandedPath), nil)\n\t\treturn\n\t}\n\n\tstatus := \"started\"\n\tif db.IsOpen() {\n\t\tstatus = \"already_running\"\n\t} else {\n\t\tif err := s.store.EnableDB(ctx, expandedPath); err != nil {\n\t\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\t\treturn\n\t\t}\n\t}\n\ttxID, err := s.storeTXID(expandedPath)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\treturn\n\t}\n\n\twriteJSON(w, http.StatusOK, StartResponse{\n\t\tStatus: status,\n\t\tPath: expandedPath,\n\t\tTXID: txID,\n\t})\n}\n\nfunc (s *Server) handleStop(w http.ResponseWriter, r *http.Request) {\n\tvar req StopRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\ttimeout := req.Timeout\n\tif timeout == 0 {\n\t\ttimeout = 30\n\t}\n\tctx, cancel := context.WithTimeout(s.ctx, time.Duration(timeout)*time.Second)\n\tdefer cancel()\n\n\tdb := s.store.FindDB(expandedPath)\n\tif db == nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"database not found: %s\", expandedPath), nil)\n\t\treturn\n\t}\n\n\tstatus := \"stopped\"\n\tif !db.IsOpen() {\n\t\tstatus = \"already_stopped\"\n\t} else {\n\t\tif err := s.store.DisableDB(ctx, expandedPath); err != nil {\n\t\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\t\treturn\n\t\t}\n\t}\n\ttxID, err := s.storeTXID(expandedPath)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\treturn\n\t}\n\n\twriteJSON(w, http.StatusOK, StopResponse{\n\t\tStatus: status,\n\t\tPath: expandedPath,\n\t\tTXID: txID,\n\t})\n}\n\nfunc (s *Server) storeTXID(path string) (uint64, error) {\n\tdb := s.store.FindDB(path)\n\tif db == nil {\n\t\treturn 0, fmt.Errorf(\"database not found: %s\", path)\n\t}\n\n\t_, maxTXID, err := db.MaxLTX()\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"read txid: %w\", err)\n\t}\n\treturn uint64(maxTXID), nil\n}\n\nfunc (s *Server) handleTXID(w http.ResponseWriter, r *http.Request) {\n\tpath := r.URL.Query().Get(\"path\")\n\tif path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\tdb := s.store.FindDB(expandedPath)\n\tif db == nil {\n\t\twriteJSONError(w, http.StatusNotFound, \"database not found\", nil)\n\t\treturn\n\t}\n\n\tpos, err := db.Pos()\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\treturn\n\t}\n\n\twriteJSON(w, http.StatusOK, TXIDResponse{\n\t\tTXID: uint64(pos.TXID),\n\t})\n}\n\nfunc (s *Server) handleSyncStatus(w http.ResponseWriter, r *http.Request) {\n\tpath := r.URL.Query().Get(\"path\")\n\tif path != \"\" {\n\t\texpandedPath, err := s.expandPath(path)\n\t\tif err != nil {\n\t\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\t\treturn\n\t\t}\n\n\t\tdb := s.store.FindDB(expandedPath)\n\t\tif db == nil {\n\t\t\twriteJSONError(w, http.StatusNotFound, \"database not found\", nil)\n\t\t\treturn\n\t\t}\n\n\t\twriteJSON(w, http.StatusOK, SyncDiagnosticsResponse{\n\t\t\tDatabases: []SyncDiagnostic{db.SyncDiagnostic()},\n\t\t})\n\t\treturn\n\t}\n\n\tdbs := s.store.DBs()\n\tdiagnostics := make([]SyncDiagnostic, 0, len(dbs))\n\tfor _, db := range dbs {\n\t\tdiagnostics = append(diagnostics, db.SyncDiagnostic())\n\t}\n\twriteJSON(w, http.StatusOK, SyncDiagnosticsResponse{Databases: diagnostics})\n}\n\nfunc writeJSON(w http.ResponseWriter, status int, v interface{}) {\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(status)\n\tjson.NewEncoder(w).Encode(v)\n}\n\nfunc writeJSONError(w http.ResponseWriter, status int, message string, details interface{}) {\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(status)\n\tjson.NewEncoder(w).Encode(ErrorResponse{\n\t\tError: message,\n\t\tDetails: details,\n\t})\n}\n\n// StartRequest is the request body for the /start endpoint.\ntype StartRequest struct {\n\tPath string `json:\"path\"`\n\tTimeout int `json:\"timeout,omitempty\"`\n}\n\n// StartResponse is the response body for the /start endpoint.\ntype StartResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n\tTXID uint64 `json:\"txid\"`\n}\n\n// StopRequest is the request body for the /stop endpoint.\ntype StopRequest struct {\n\tPath string `json:\"path\"`\n\tTimeout int `json:\"timeout,omitempty\"`\n}\n\n// StopResponse is the response body for the /stop endpoint.\ntype StopResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n\tTXID uint64 `json:\"txid\"`\n}\n\n// ErrorResponse is returned when an error occurs.\ntype ErrorResponse struct {\n\tError string `json:\"error\"`\n\tDetails interface{} `json:\"details,omitempty\"`\n}\n\n// TXIDResponse is the response body for the /txid endpoint.\ntype TXIDResponse struct {\n\tTXID uint64 `json:\"txid\"`\n}\n\n// SyncDiagnosticsResponse is the response body for /debug/sync-status.\ntype SyncDiagnosticsResponse struct {\n\tDatabases []SyncDiagnostic `json:\"databases\"`\n}\n\nfunc (s *Server) handleSync(w http.ResponseWriter, r *http.Request) {\n\tvar req SyncRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\tctx := s.ctx\n\tif req.Wait \u0026\u0026 req.Timeout == 0 {\n\t\treq.Timeout = 30\n\t}\n\tif req.Timeout \u003e 0 {\n\t\tvar cancel context.CancelFunc\n\t\tctx, cancel = context.WithTimeout(s.ctx, time.Duration(req.Timeout)*time.Second)\n\t\tdefer cancel()\n\t}\n\n\tresult, err := s.store.SyncDB(ctx, expandedPath, req.Wait)\n\tif err != nil {\n\t\tswitch {\n\t\tcase errors.Is(err, ErrDatabaseNotFound):\n\t\t\twriteJSONError(w, http.StatusNotFound, err.Error(), nil)\n\t\tcase errors.Is(err, ErrDatabaseNotOpen):\n\t\t\twriteJSONError(w, http.StatusConflict, err.Error(), nil)\n\t\tdefault:\n\t\t\twriteJSONError(w, http.StatusInternalServerError, err.Error(), nil)\n\t\t}\n\t\treturn\n\t}\n\n\tvar status string\n\tif !result.Changed {\n\t\tstatus = \"no_change\"\n\t} else if req.Wait {\n\t\tstatus = \"synced\"\n\t} else {\n\t\tstatus = \"synced_local\"\n\t}\n\n\twriteJSON(w, http.StatusOK, SyncResponse{\n\t\tStatus: status,\n\t\tPath: expandedPath,\n\t\tTXID: result.TXID,\n\t\tReplicatedTXID: result.ReplicatedTXID,\n\t})\n}\n\n// SyncRequest is the request body for the /sync endpoint.\ntype SyncRequest struct {\n\tPath string `json:\"path\"`\n\tWait bool `json:\"wait,omitempty\"`\n\tTimeout int `json:\"timeout,omitempty\"`\n}\n\n// SyncResponse is the response body for the /sync endpoint.\ntype SyncResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n\tTXID uint64 `json:\"txid\"`\n\tReplicatedTXID uint64 `json:\"replicated_txid\"`\n}\n\nfunc (s *Server) handleList(w http.ResponseWriter, _ *http.Request) {\n\tdbs := s.store.DBs()\n\tresp := ListResponse{\n\t\tDatabases: make([]DatabaseSummary, 0, len(dbs)),\n\t}\n\n\tfor _, db := range dbs {\n\t\tvar status string\n\t\tif db.IsOpen() {\n\t\t\tif db.Replica != nil \u0026\u0026 db.Replica.MonitorEnabled {\n\t\t\t\tstatus = \"replicating\"\n\t\t\t} else {\n\t\t\t\tstatus = \"open\"\n\t\t\t}\n\t\t} else {\n\t\t\tstatus = \"stopped\"\n\t\t}\n\n\t\tsummary := DatabaseSummary{\n\t\t\tPath: db.Path(),\n\t\t\tStatus: status,\n\t\t}\n\n\t\tif t := db.LastSuccessfulSyncAt(); !t.IsZero() {\n\t\t\tsummary.LastSyncAt = \u0026t\n\t\t}\n\n\t\tresp.Databases = append(resp.Databases, summary)\n\t}\n\n\twriteJSON(w, http.StatusOK, resp)\n}\n\nfunc (s *Server) handleInfo(w http.ResponseWriter, _ *http.Request) {\n\tresp := InfoResponse{\n\t\tVersion: s.Version,\n\t\tPID: os.Getpid(),\n\t\tStartedAt: s.startedAt,\n\t\tUptimeSeconds: int64(time.Since(s.startedAt).Seconds()),\n\t\tDatabaseCount: len(s.store.DBs()),\n\t}\n\n\twriteJSON(w, http.StatusOK, resp)\n}\n\n// ListResponse is the response body for the /list endpoint.\ntype ListResponse struct {\n\tDatabases []DatabaseSummary `json:\"databases\"`\n}\n\n// DatabaseSummary contains summary information about a database.\ntype DatabaseSummary struct {\n\tPath string `json:\"path\"`\n\tStatus string `json:\"status\"`\n\n\t// LastSyncAt is the timestamp of the last successful replica sync.\n\t// This reflects when data was last successfully uploaded to the replica\n\t// storage backend, not just when the local WAL was processed.\n\tLastSyncAt *time.Time `json:\"last_sync_at,omitempty\"`\n}\n\n// InfoResponse is the response body for the /info endpoint.\ntype InfoResponse struct {\n\tVersion string `json:\"version\"`\n\tPID int `json:\"pid\"`\n\tUptimeSeconds int64 `json:\"uptime_seconds\"`\n\tStartedAt time.Time `json:\"started_at\"`\n\tDatabaseCount int `json:\"database_count\"`\n}\n\n// RegisterDatabaseRequest is the request body for the /register endpoint.\ntype RegisterDatabaseRequest struct {\n\tPath string `json:\"path\"`\n\tReplicaURL string `json:\"replica_url\"`\n}\n\n// RegisterDatabaseResponse is the response body for the /register endpoint.\ntype RegisterDatabaseResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n}\n\n// UnregisterDatabaseRequest is the request body for the /unregister endpoint.\ntype UnregisterDatabaseRequest struct {\n\tPath string `json:\"path\"`\n\tTimeout int `json:\"timeout,omitempty\"`\n}\n\n// UnregisterDatabaseResponse is the response body for the /unregister endpoint.\ntype UnregisterDatabaseResponse struct {\n\tStatus string `json:\"status\"`\n\tPath string `json:\"path\"`\n\tTXID uint64 `json:\"txid\"`\n}\n\nfunc (s *Server) handleRegister(w http.ResponseWriter, r *http.Request) {\n\tvar req RegisterDatabaseRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\tif req.ReplicaURL == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"replica_url required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\t// Check if database already exists.\n\tif existing := s.store.FindDB(expandedPath); existing != nil {\n\t\twriteJSON(w, http.StatusOK, RegisterDatabaseResponse{\n\t\t\tStatus: \"already_registered\",\n\t\t\tPath: expandedPath,\n\t\t})\n\t\treturn\n\t}\n\n\t// Create replica client from URL.\n\tclient, err := NewReplicaClientFromURL(req.ReplicaURL)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid replica url: %v\", err), nil)\n\t\treturn\n\t}\n\n\t// Create new database.\n\tdb := NewDB(expandedPath)\n\n\t// Create replica and attach client.\n\treplica := NewReplica(db)\n\treplica.Client = client\n\tdb.Replica = replica\n\n\t// Register database with store (this also opens the database).\n\tif err := s.store.RegisterDB(db); err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"failed to register database: %v\", err), nil)\n\t\treturn\n\t}\n\n\twriteJSON(w, http.StatusOK, RegisterDatabaseResponse{\n\t\tStatus: \"registered\",\n\t\tPath: expandedPath,\n\t})\n}\n\nfunc (s *Server) handleUnregister(w http.ResponseWriter, r *http.Request) {\n\tvar req UnregisterDatabaseRequest\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, \"invalid request body\", err.Error())\n\t\treturn\n\t}\n\n\tif req.Path == \"\" {\n\t\twriteJSONError(w, http.StatusBadRequest, \"path required\", nil)\n\t\treturn\n\t}\n\n\texpandedPath, err := s.expandPath(req.Path)\n\tif err != nil {\n\t\twriteJSONError(w, http.StatusBadRequest, fmt.Sprintf(\"invalid path: %v\", err), nil)\n\t\treturn\n\t}\n\n\t// Set up timeout context. Treat non-positive values as default.\n\ttimeout := req.Timeout\n\tif timeout \u003c= 0 {\n\t\ttimeout = 30\n\t}\n\tctx, cancel := context.WithTimeout(s.ctx, time.Duration(timeout)*time.Second)\n\tdefer cancel()\n\n\tdb := s.store.FindDB(expandedPath)\n\n\t// Remove database from store (this also closes it).\n\tif err := s.store.UnregisterDB(ctx, expandedPath); err != nil {\n\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"failed to unregister database: %v\", err), nil)\n\t\treturn\n\t}\n\tvar txID uint64\n\tstatus := \"already_unregistered\"\n\tif db != nil {\n\t\t_, maxTXID, err := db.MaxLTX()\n\t\tif err != nil {\n\t\t\twriteJSONError(w, http.StatusInternalServerError, fmt.Sprintf(\"failed to read final txid: %v\", err), nil)\n\t\t\treturn\n\t\t}\n\t\ttxID = uint64(maxTXID)\n\t\tstatus = \"unregistered\"\n\t}\n\n\twriteJSON(w, http.StatusOK, UnregisterDatabaseResponse{\n\t\tStatus: status,\n\t\tPath: expandedPath,\n\t\tTXID: txID,\n\t})\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"json","path":"encoding/json","span":{"start":[5,1],"end":[5,17],"bytes":[40,56]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[57,66]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[67,73]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[74,85]}},{"name":"net","path":"net","span":{"start":[9,1],"end":[9,7],"bytes":[86,92]}},{"name":"http","path":"net/http","span":{"start":[10,1],"end":[10,12],"bytes":[93,104]}},{"name":"pprof","path":"net/http/pprof","span":{"start":[11,1],"end":[11,18],"bytes":[105,122]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[123,128]}},{"name":"sync","path":"sync","span":{"start":[13,1],"end":[13,8],"bytes":[129,136]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[137,144]}}],"types":{"DatabaseSummary":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.DatabaseSummary","kind":"struct","span":{"start":[527,1],"end":[535,2],"bytes":[13353,13707]},"callables":{},"fields":{"LastSyncAt":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.DatabaseSummary/LastSyncAt","kind":"field","type":"*time.Time","span":{"start":[534,1],"end":[534,55],"bytes":[13651,13705]}},"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.DatabaseSummary/Path","kind":"field","type":"string","span":{"start":[528,1],"end":[528,29],"bytes":[13383,13411]}},"Status":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.DatabaseSummary/Status","kind":"field","type":"string","span":{"start":[529,1],"end":[529,31],"bytes":[13412,13442]}}}},"ErrorResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.ErrorResponse","kind":"struct","span":{"start":[388,1],"end":[391,2],"bytes":[9884,9997]},"callables":{},"fields":{"Details":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.ErrorResponse/Details","kind":"field","type":"interface{}","span":{"start":[390,1],"end":[390,48],"bytes":[9948,9995]}},"Error":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.ErrorResponse/Error","kind":"field","type":"string","span":{"start":[389,1],"end":[389,36],"bytes":[9912,9947]}}}},"InfoResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.InfoResponse","kind":"struct","span":{"start":[538,1],"end":[544,2],"bytes":[13770,14021]},"callables":{},"fields":{"DatabaseCount":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.InfoResponse/DatabaseCount","kind":"field","type":"int","span":{"start":[543,1],"end":[543,49],"bytes":[13971,14019]}},"PID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.InfoResponse/PID","kind":"field","type":"int","span":{"start":[540,1],"end":[540,38],"bytes":[13839,13876]}},"StartedAt":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.InfoResponse/StartedAt","kind":"field","type":"time.Time","span":{"start":[542,1],"end":[542,45],"bytes":[13926,13970]}},"UptimeSeconds":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.InfoResponse/UptimeSeconds","kind":"field","type":"int64","span":{"start":[541,1],"end":[541,49],"bytes":[13877,13925]}},"Version":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.InfoResponse/Version","kind":"field","type":"string","span":{"start":[539,1],"end":[539,42],"bytes":[13797,13838]}}}},"ListResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.ListResponse","kind":"struct","span":{"start":[522,1],"end":[524,2],"bytes":[13209,13285]},"callables":{},"fields":{"Databases":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.ListResponse/Databases","kind":"field","type":"[]github.com/benbjohnson/litestream.DatabaseSummary","span":{"start":[523,1],"end":[523,48],"bytes":[13236,13283]}}}},"RegisterDatabaseRequest":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.RegisterDatabaseRequest","kind":"struct","span":{"start":[547,1],"end":[550,2],"bytes":[14098,14210]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.RegisterDatabaseRequest/Path","kind":"field","type":"string","span":{"start":[548,1],"end":[548,33],"bytes":[14136,14168]}},"ReplicaURL":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.RegisterDatabaseRequest/ReplicaURL","kind":"field","type":"string","span":{"start":[549,1],"end":[549,40],"bytes":[14169,14208]}}}},"RegisterDatabaseResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.RegisterDatabaseResponse","kind":"struct","span":{"start":[553,1],"end":[556,2],"bytes":[14289,14389]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.RegisterDatabaseResponse/Path","kind":"field","type":"string","span":{"start":[555,1],"end":[555,29],"bytes":[14359,14387]}},"Status":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.RegisterDatabaseResponse/Status","kind":"field","type":"string","span":{"start":[554,1],"end":[554,31],"bytes":[14328,14358]}}}},"Server":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server","kind":"struct","span":{"start":[34,1],"end":[61,2],"bytes":[638,1253]},"callables":{"github.com/benbjohnson/litestream.Server.Close":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","kind":"method","span":{"start":[145,1],"end":[158,2],"bytes":[3780,4090]},"signature":"github.com/benbjohnson/litestream.Server.Close","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"146:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close@146:2","span":{"start":[146,2],"end":[146,12],"bytes":[3814,3824]},"callee":null},"148:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close@148:17","span":{"start":[148,17],"end":[148,73],"bytes":[3842,3898]},"callee":"can://litestream/litestream/@external/context/WithTimeout"},"148:37":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close@148:37","span":{"start":[148,37],"end":[148,57],"bytes":[3862,3882]},"callee":"can://litestream/litestream/@external/context/Background"},"149:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close@149:8","span":{"start":[149,8],"end":[149,16],"bytes":[3906,3914]},"callee":null,"is_deferred":true},"152:13":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close@152:13","span":{"start":[152,13],"end":[152,39],"bytes":[3954,3980]},"callee":"can://litestream/litestream/@external/net/http/Server.Shutdown"},"153:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close@153:4","span":{"start":[153,4],"end":[153,62],"bytes":[3998,4056]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"156:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close@156:2","span":{"start":[156,2],"end":[156,13],"bytes":[4065,4076]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Wait"}}},"github.com/benbjohnson/litestream.Server.Start":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","kind":"method","span":{"start":[98,1],"end":[142,2],"bytes":[2437,3727]},"signature":"github.com/benbjohnson/litestream.Server.Start","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"100:10":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@100:10","span":{"start":[100,10],"end":[100,44],"bytes":[2504,2538]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"104:18":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@104:18","span":{"start":[104,18],"end":[104,40],"bytes":[2633,2655]},"callee":"can://litestream/litestream/@external/os/Lstat"},"105:6":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@105:6","span":{"start":[105,6],"end":[105,17],"bytes":[2675,2686]},"callee":"can://litestream/litestream/@external/io/fs/FileInfo.Mode"},"106:14":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@106:14","span":{"start":[106,14],"end":[106,37],"bytes":[2721,2744]},"callee":"can://litestream/litestream/@external/os/Remove"},"107:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@107:12","span":{"start":[107,12],"end":[107,57],"bytes":[2770,2815]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"110:11":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@110:11","span":{"start":[110,11],"end":[110,81],"bytes":[2842,2912]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"112:13":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@112:13","span":{"start":[112,13],"end":[112,31],"bytes":[2929,2947]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"113:10":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@113:10","span":{"start":[113,10],"end":[113,50],"bytes":[2959,2999]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"116:19":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@116:19","span":{"start":[116,19],"end":[116,51],"bytes":[3022,3054]},"callee":"can://litestream/litestream/@external/net/Listen"},"118:10":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@118:10","span":{"start":[118,10],"end":[118,54],"bytes":[3081,3125]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"122:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@122:12","span":{"start":[122,12],"end":[122,62],"bytes":[3170,3220]},"callee":"can://litestream/litestream/@external/os/Chmod"},"122:35":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@122:35","span":{"start":[122,35],"end":[122,61],"bytes":[3193,3219]},"callee":null},"123:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@123:3","span":{"start":[123,3],"end":[123,19],"bytes":[3237,3253]},"callee":"can://litestream/litestream/@external/net/Listener.Close"},"124:10":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@124:10","span":{"start":[124,10],"end":[124,45],"bytes":[3263,3298]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"129:16":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@129:16","span":{"start":[129,16],"end":[129,26],"bytes":[3441,3451]},"callee":"can://litestream/litestream/@external/time/Now"},"131:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@131:2","span":{"start":[131,2],"end":[131,65],"bytes":[3454,3517]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"133:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@133:2","span":{"start":[133,2],"end":[133,13],"bytes":[3520,3531]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"134:5":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start@134:5","span":{"start":[134,5],"end":[139,5],"bytes":[3536,3712]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start/github.com/benbjohnson/litestream.Server.Start.closure_1","kind":"function","span":{"start":[134,1],"end":[139,5],"bytes":[3532,3712]},"signature":"github.com/benbjohnson/litestream.Server.Start.closure_1","parameters":[],"body":{"135:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start/github.com/benbjohnson/litestream.Server.Start.closure_1@135:9","span":{"start":[135,9],"end":[135,20],"bytes":[3553,3564]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"136:13":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start/github.com/benbjohnson/litestream.Server.Start.closure_1@136:13","span":{"start":[136,13],"end":[136,41],"bytes":[3577,3605]},"callee":"can://litestream/litestream/@external/net/http/Server.Serve"},"137:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start/github.com/benbjohnson/litestream.Server.Start.closure_1@137:4","span":{"start":[137,4],"end":[137,53],"bytes":[3654,3703]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"}}}}},"github.com/benbjohnson/litestream.Server.expandPath":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","kind":"method","span":{"start":[161,1],"end":[166,2],"bytes":[4150,4289]},"signature":"github.com/benbjohnson/litestream.Server.expandPath","parameters":[{"name":"path","type":"string","span":{"start":[161,1],"end":[161,59],"bytes":[4150,4208]}}],"return_type":"(string, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"163:10":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath@163:10","span":{"start":[163,10],"end":[163,30],"bytes":[4246,4266]},"callee":null}}},"github.com/benbjohnson/litestream.Server.handleInfo":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo","kind":"method","span":{"start":[509,1],"end":[519,2],"bytes":[12829,13146]},"signature":"github.com/benbjohnson/litestream.Server.handleInfo","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[509,1],"end":[509,70],"bytes":[12829,12898]}},{"name":"_","type":"*net/http.Request","span":{"start":[509,1],"end":[509,70],"bytes":[12829,12898]}}],"metrics":{"cyclomatic":1},"body":{"512:18":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo@512:18","span":{"start":[512,18],"end":[512,29],"bytes":[12967,12978]},"callee":"can://litestream/litestream/@external/os/Getpid"},"514:18":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo@514:18","span":{"start":[514,18],"end":[514,58],"bytes":[13027,13067]},"callee":null},"514:24":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo@514:24","span":{"start":[514,24],"end":[514,57],"bytes":[13033,13066]},"callee":"can://litestream/litestream/@external/time/Duration.Seconds"},"514:24/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo@514:24/2","span":{"start":[514,24],"end":[514,47],"bytes":[13033,13056]},"callee":"can://litestream/litestream/@external/time/Since"},"515:18":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo@515:18","span":{"start":[515,18],"end":[515,36],"bytes":[13086,13104]},"callee":null},"515:22":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo@515:22","span":{"start":[515,22],"end":[515,35],"bytes":[13090,13103]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"518:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo@518:2","span":{"start":[518,2],"end":[518,35],"bytes":[13111,13144]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleList":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","kind":"method","span":{"start":[476,1],"end":[507,2],"bytes":[12185,12827]},"signature":"github.com/benbjohnson/litestream.Server.handleList","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[476,1],"end":[476,70],"bytes":[12185,12254]}},{"name":"_","type":"*net/http.Request","span":{"start":[476,1],"end":[476,70],"bytes":[12185,12254]}}],"metrics":{"cyclomatic":5},"body":{"477:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@477:9","span":{"start":[477,9],"end":[477,22],"bytes":[12263,12276]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"479:14":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@479:14","span":{"start":[479,14],"end":[479,50],"bytes":[12313,12349]},"callee":null},"479:41":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@479:41","span":{"start":[479,41],"end":[479,49],"bytes":[12340,12348]},"callee":null},"484:6":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@484:6","span":{"start":[484,6],"end":[484,17],"bytes":[12406,12417]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"495:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@495:12","span":{"start":[495,12],"end":[495,21],"bytes":[12618,12627]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"499:11":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@499:11","span":{"start":[499,11],"end":[499,36],"bytes":[12663,12688]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt"},"499:39":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@499:39","span":{"start":[499,39],"end":[499,49],"bytes":[12691,12701]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"503:20":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@503:20","span":{"start":[503,20],"end":[503,51],"bytes":[12755,12786]},"callee":null},"506:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList@506:2","span":{"start":[506,2],"end":[506,35],"bytes":[12792,12825]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleRegister":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","kind":"method","span":{"start":[571,1],"end":[628,2],"bytes":[14800,16393]},"signature":"github.com/benbjohnson/litestream.Server.handleRegister","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[571,1],"end":[571,74],"bytes":[14800,14873]}},{"name":"r","type":"*net/http.Request","span":{"start":[571,1],"end":[571,74],"bytes":[14800,14873]}}],"metrics":{"cyclomatic":8},"body":{"573:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@573:12","span":{"start":[573,12],"end":[573,48],"bytes":[14918,14954]},"callee":"can://litestream/litestream/@external/encoding/json/Decoder.Decode"},"573:12/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@573:12/2","span":{"start":[573,12],"end":[573,35],"bytes":[14918,14941]},"callee":"can://litestream/litestream/@external/encoding/json/NewDecoder"},"574:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@574:3","span":{"start":[574,3],"end":[574,80],"bytes":[14971,15048]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"574:68":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@574:68","span":{"start":[574,68],"end":[574,79],"bytes":[15036,15047]},"callee":null},"579:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@579:3","span":{"start":[579,3],"end":[579,65],"bytes":[15085,15147]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"584:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@584:3","span":{"start":[584,3],"end":[584,72],"bytes":[15190,15259]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"588:23":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@588:23","span":{"start":[588,23],"end":[588,45],"bytes":[15295,15317]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"590:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@590:3","span":{"start":[590,3],"end":[590,86],"bytes":[15337,15420]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"590:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@590:44","span":{"start":[590,44],"end":[590,80],"bytes":[15378,15414]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"595:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@595:17","span":{"start":[595,17],"end":[595,45],"bytes":[15488,15516]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"596:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@596:3","span":{"start":[596,3],"end":[599,5],"bytes":[15538,15654]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"},"604:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@604:17","span":{"start":[604,17],"end":[604,56],"bytes":[15720,15759]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL"},"606:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@606:3","span":{"start":[606,3],"end":[606,93],"bytes":[15779,15869]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"606:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@606:44","span":{"start":[606,44],"end":[606,87],"bytes":[15820,15863]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"611:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@611:8","span":{"start":[611,8],"end":[611,27],"bytes":[15915,15934]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB"},"614:13":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@614:13","span":{"start":[614,13],"end":[614,27],"bytes":[15986,16000]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica"},"619:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@619:12","span":{"start":[619,12],"end":[619,34],"bytes":[16125,16147]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB"},"620:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@620:3","span":{"start":[620,3],"end":[620,110],"bytes":[16164,16271]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"620:53":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@620:53","span":{"start":[620,53],"end":[620,104],"bytes":[16214,16265]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"624:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister@624:2","span":{"start":[624,2],"end":[627,4],"bytes":[16286,16391]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleStart":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","kind":"method","span":{"start":[168,1],"end":[219,2],"bytes":[4291,5621]},"signature":"github.com/benbjohnson/litestream.Server.handleStart","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[168,1],"end":[168,71],"bytes":[4291,4361]}},{"name":"r","type":"*net/http.Request","span":{"start":[168,1],"end":[168,71],"bytes":[4291,4361]}}],"metrics":{"cyclomatic":9},"body":{"170:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@170:12","span":{"start":[170,12],"end":[170,48],"bytes":[4395,4431]},"callee":"can://litestream/litestream/@external/encoding/json/Decoder.Decode"},"170:12/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@170:12/2","span":{"start":[170,12],"end":[170,35],"bytes":[4395,4418]},"callee":"can://litestream/litestream/@external/encoding/json/NewDecoder"},"171:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@171:3","span":{"start":[171,3],"end":[171,80],"bytes":[4448,4525]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"171:68":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@171:68","span":{"start":[171,68],"end":[171,79],"bytes":[4513,4524]},"callee":null},"176:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@176:3","span":{"start":[176,3],"end":[176,65],"bytes":[4562,4624]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"180:23":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@180:23","span":{"start":[180,23],"end":[180,45],"bytes":[4660,4682]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"182:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@182:3","span":{"start":[182,3],"end":[182,86],"bytes":[4702,4785]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"182:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@182:44","span":{"start":[182,44],"end":[182,80],"bytes":[4743,4779]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"189:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@189:17","span":{"start":[189,17],"end":[189,83],"bytes":[4883,4949]},"callee":"can://litestream/litestream/@external/context/WithTimeout"},"189:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@189:44","span":{"start":[189,44],"end":[189,70],"bytes":[4910,4936]},"callee":null},"190:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@190:9","span":{"start":[190,9],"end":[190,17],"bytes":[4958,4966]},"callee":null,"is_deferred":true},"193:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@193:8","span":{"start":[193,8],"end":[193,36],"bytes":[4978,5006]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"195:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@195:3","span":{"start":[195,3],"end":[195,110],"bytes":[5025,5132]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"195:53":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@195:53","span":{"start":[195,53],"end":[195,104],"bytes":[5075,5126]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"200:5":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@200:5","span":{"start":[200,5],"end":[200,16],"bytes":[5171,5182]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"203:13":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@203:13","span":{"start":[203,13],"end":[203,48],"bytes":[5236,5271]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB"},"204:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@204:4","span":{"start":[204,4],"end":[204,71],"bytes":[5289,5356]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"204:54":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@204:54","span":{"start":[204,54],"end":[204,65],"bytes":[5339,5350]},"callee":null},"208:15":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@208:15","span":{"start":[208,15],"end":[208,40],"bytes":[5388,5413]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID"},"210:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@210:3","span":{"start":[210,3],"end":[210,70],"bytes":[5433,5500]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"210:53":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@210:53","span":{"start":[210,53],"end":[210,64],"bytes":[5483,5494]},"callee":null},"214:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart@214:2","span":{"start":[214,2],"end":[218,4],"bytes":[5515,5619]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleStop":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","kind":"method","span":{"start":[221,1],"end":[272,2],"bytes":[5623,6937]},"signature":"github.com/benbjohnson/litestream.Server.handleStop","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[221,1],"end":[221,70],"bytes":[5623,5692]}},{"name":"r","type":"*net/http.Request","span":{"start":[221,1],"end":[221,70],"bytes":[5623,5692]}}],"metrics":{"cyclomatic":9},"body":{"223:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@223:12","span":{"start":[223,12],"end":[223,48],"bytes":[5725,5761]},"callee":"can://litestream/litestream/@external/encoding/json/Decoder.Decode"},"223:12/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@223:12/2","span":{"start":[223,12],"end":[223,35],"bytes":[5725,5748]},"callee":"can://litestream/litestream/@external/encoding/json/NewDecoder"},"224:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@224:3","span":{"start":[224,3],"end":[224,80],"bytes":[5778,5855]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"224:68":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@224:68","span":{"start":[224,68],"end":[224,79],"bytes":[5843,5854]},"callee":null},"229:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@229:3","span":{"start":[229,3],"end":[229,65],"bytes":[5892,5954]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"233:23":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@233:23","span":{"start":[233,23],"end":[233,45],"bytes":[5990,6012]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"235:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@235:3","span":{"start":[235,3],"end":[235,86],"bytes":[6032,6115]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"235:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@235:44","span":{"start":[235,44],"end":[235,80],"bytes":[6073,6109]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"243:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@243:17","span":{"start":[243,17],"end":[243,79],"bytes":[6206,6268]},"callee":"can://litestream/litestream/@external/context/WithTimeout"},"243:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@243:44","span":{"start":[243,44],"end":[243,66],"bytes":[6233,6255]},"callee":null},"244:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@244:8","span":{"start":[244,8],"end":[244,16],"bytes":[6276,6284]},"callee":null,"is_deferred":true},"246:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@246:8","span":{"start":[246,8],"end":[246,36],"bytes":[6293,6321]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"248:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@248:3","span":{"start":[248,3],"end":[248,110],"bytes":[6340,6447]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"248:53":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@248:53","span":{"start":[248,53],"end":[248,104],"bytes":[6390,6441]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"253:6":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@253:6","span":{"start":[253,6],"end":[253,17],"bytes":[6487,6498]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"256:13":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@256:13","span":{"start":[256,13],"end":[256,49],"bytes":[6552,6588]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB"},"257:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@257:4","span":{"start":[257,4],"end":[257,71],"bytes":[6606,6673]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"257:54":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@257:54","span":{"start":[257,54],"end":[257,65],"bytes":[6656,6667]},"callee":null},"261:15":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@261:15","span":{"start":[261,15],"end":[261,40],"bytes":[6705,6730]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID"},"263:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@263:3","span":{"start":[263,3],"end":[263,70],"bytes":[6750,6817]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"263:53":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@263:53","span":{"start":[263,53],"end":[263,64],"bytes":[6800,6811]},"callee":null},"267:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop@267:2","span":{"start":[267,2],"end":[271,4],"bytes":[6832,6935]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleSync":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","kind":"method","span":{"start":[403,1],"end":[459,2],"bytes":[10277,11730]},"signature":"github.com/benbjohnson/litestream.Server.handleSync","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[403,1],"end":[403,70],"bytes":[10277,10346]}},{"name":"r","type":"*net/http.Request","span":{"start":[403,1],"end":[403,70],"bytes":[10277,10346]}}],"metrics":{"cyclomatic":13},"body":{"405:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@405:12","span":{"start":[405,12],"end":[405,48],"bytes":[10379,10415]},"callee":"can://litestream/litestream/@external/encoding/json/Decoder.Decode"},"405:12/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@405:12/2","span":{"start":[405,12],"end":[405,35],"bytes":[10379,10402]},"callee":"can://litestream/litestream/@external/encoding/json/NewDecoder"},"406:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@406:3","span":{"start":[406,3],"end":[406,80],"bytes":[10432,10509]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"406:68":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@406:68","span":{"start":[406,68],"end":[406,79],"bytes":[10497,10508]},"callee":null},"411:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@411:3","span":{"start":[411,3],"end":[411,65],"bytes":[10546,10608]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"415:23":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@415:23","span":{"start":[415,23],"end":[415,45],"bytes":[10644,10666]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"417:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@417:3","span":{"start":[417,3],"end":[417,86],"bytes":[10686,10769]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"417:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@417:44","span":{"start":[417,44],"end":[417,80],"bytes":[10727,10763]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"427:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@427:17","span":{"start":[427,17],"end":[427,83],"bytes":[10924,10990]},"callee":"can://litestream/litestream/@external/context/WithTimeout"},"427:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@427:44","span":{"start":[427,44],"end":[427,70],"bytes":[10951,10977]},"callee":null},"428:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@428:9","span":{"start":[428,9],"end":[428,17],"bytes":[10999,11007]},"callee":null,"is_deferred":true},"431:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@431:17","span":{"start":[431,17],"end":[431,60],"bytes":[11028,11071]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB"},"434:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@434:8","span":{"start":[434,8],"end":[434,43],"bytes":[11107,11142]},"callee":"can://litestream/litestream/@external/errors/Is"},"435:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@435:4","span":{"start":[435,4],"end":[435,60],"bytes":[11147,11203]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"435:43":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@435:43","span":{"start":[435,43],"end":[435,54],"bytes":[11186,11197]},"callee":null},"436:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@436:8","span":{"start":[436,8],"end":[436,42],"bytes":[11211,11245]},"callee":"can://litestream/litestream/@external/errors/Is"},"437:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@437:4","span":{"start":[437,4],"end":[437,60],"bytes":[11250,11306]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"437:43":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@437:43","span":{"start":[437,43],"end":[437,54],"bytes":[11289,11300]},"callee":null},"439:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@439:4","span":{"start":[439,4],"end":[439,71],"bytes":[11321,11388]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"439:54":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@439:54","span":{"start":[439,54],"end":[439,65],"bytes":[11371,11382]},"callee":null},"453:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync@453:2","span":{"start":[453,2],"end":[458,4],"bytes":[11553,11728]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleSyncStatus":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","kind":"method","span":{"start":[317,1],"end":[344,2],"bytes":[7917,8710]},"signature":"github.com/benbjohnson/litestream.Server.handleSyncStatus","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[317,1],"end":[317,76],"bytes":[7917,7992]}},{"name":"r","type":"*net/http.Request","span":{"start":[317,1],"end":[317,76],"bytes":[7917,7992]}}],"metrics":{"cyclomatic":5},"body":{"318:10":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@318:10","span":{"start":[318,10],"end":[318,35],"bytes":[8002,8027]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"318:10/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@318:10/2","span":{"start":[318,10],"end":[318,23],"bytes":[8002,8015]},"callee":"can://litestream/litestream/@external/net/url/URL.Query"},"320:24":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@320:24","span":{"start":[320,24],"end":[320,42],"bytes":[8068,8086]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"322:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@322:4","span":{"start":[322,4],"end":[322,87],"bytes":[8108,8191]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"322:45":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@322:45","span":{"start":[322,45],"end":[322,81],"bytes":[8149,8185]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"326:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@326:9","span":{"start":[326,9],"end":[326,37],"bytes":[8215,8243]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"328:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@328:4","span":{"start":[328,4],"end":[328,69],"bytes":[8264,8329]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"332:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@332:3","span":{"start":[332,3],"end":[334,5],"bytes":[8347,8457]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"},"333:32":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@333:32","span":{"start":[333,32],"end":[333,51],"bytes":[8431,8450]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic"},"338:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@338:9","span":{"start":[338,9],"end":[338,22],"bytes":[8479,8492]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"339:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@339:17","span":{"start":[339,17],"end":[339,52],"bytes":[8509,8544]},"callee":null},"339:43":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@339:43","span":{"start":[339,43],"end":[339,51],"bytes":[8535,8543]},"callee":null},"341:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@341:17","span":{"start":[341,17],"end":[341,57],"bytes":[8587,8627]},"callee":null},"341:37":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@341:37","span":{"start":[341,37],"end":[341,56],"bytes":[8607,8626]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic"},"343:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus@343:2","span":{"start":[343,2],"end":[343,78],"bytes":[8632,8708]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.handleTXID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","kind":"method","span":{"start":[287,1],"end":[315,2],"bytes":[7229,7915]},"signature":"github.com/benbjohnson/litestream.Server.handleTXID","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[287,1],"end":[287,70],"bytes":[7229,7298]}},{"name":"r","type":"*net/http.Request","span":{"start":[287,1],"end":[287,70],"bytes":[7229,7298]}}],"metrics":{"cyclomatic":5},"body":{"288:10":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@288:10","span":{"start":[288,10],"end":[288,35],"bytes":[7308,7333]},"callee":"can://litestream/litestream/@external/net/url/Values.Get"},"288:10/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@288:10/2","span":{"start":[288,10],"end":[288,23],"bytes":[7308,7321]},"callee":"can://litestream/litestream/@external/net/url/URL.Query"},"290:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@290:3","span":{"start":[290,3],"end":[290,65],"bytes":[7353,7415]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"294:23":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@294:23","span":{"start":[294,23],"end":[294,41],"bytes":[7451,7469]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"296:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@296:3","span":{"start":[296,3],"end":[296,86],"bytes":[7489,7572]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"296:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@296:44","span":{"start":[296,44],"end":[296,80],"bytes":[7530,7566]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"300:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@300:8","span":{"start":[300,8],"end":[300,36],"bytes":[7593,7621]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"302:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@302:3","span":{"start":[302,3],"end":[302,68],"bytes":[7640,7705]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"306:14":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@306:14","span":{"start":[306,14],"end":[306,22],"bytes":[7732,7740]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"308:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@308:3","span":{"start":[308,3],"end":[308,70],"bytes":[7760,7827]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"308:53":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@308:53","span":{"start":[308,53],"end":[308,64],"bytes":[7810,7821]},"callee":null},"312:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@312:2","span":{"start":[312,2],"end":[314,4],"bytes":[7842,7913]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"},"313:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID@313:9","span":{"start":[313,9],"end":[313,25],"bytes":[7892,7908]},"callee":null}}},"github.com/benbjohnson/litestream.Server.handleUnregister":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","kind":"method","span":{"start":[630,1],"end":[680,2],"bytes":[16395,17840]},"signature":"github.com/benbjohnson/litestream.Server.handleUnregister","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[630,1],"end":[630,76],"bytes":[16395,16470]}},{"name":"r","type":"*net/http.Request","span":{"start":[630,1],"end":[630,76],"bytes":[16395,16470]}}],"metrics":{"cyclomatic":8},"body":{"632:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@632:12","span":{"start":[632,12],"end":[632,48],"bytes":[16517,16553]},"callee":"can://litestream/litestream/@external/encoding/json/Decoder.Decode"},"632:12/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@632:12/2","span":{"start":[632,12],"end":[632,35],"bytes":[16517,16540]},"callee":"can://litestream/litestream/@external/encoding/json/NewDecoder"},"633:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@633:3","span":{"start":[633,3],"end":[633,80],"bytes":[16570,16647]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"633:68":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@633:68","span":{"start":[633,68],"end":[633,79],"bytes":[16635,16646]},"callee":null},"638:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@638:3","span":{"start":[638,3],"end":[638,65],"bytes":[16684,16746]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"642:23":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@642:23","span":{"start":[642,23],"end":[642,45],"bytes":[16782,16804]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath"},"644:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@644:3","span":{"start":[644,3],"end":[644,86],"bytes":[16824,16907]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"644:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@644:44","span":{"start":[644,44],"end":[644,80],"bytes":[16865,16901]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"653:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@653:17","span":{"start":[653,17],"end":[653,79],"bytes":[17064,17126]},"callee":"can://litestream/litestream/@external/context/WithTimeout"},"653:44":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@653:44","span":{"start":[653,44],"end":[653,66],"bytes":[17091,17113]},"callee":null},"654:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@654:8","span":{"start":[654,8],"end":[654,16],"bytes":[17134,17142]},"callee":null,"is_deferred":true},"656:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@656:8","span":{"start":[656,8],"end":[656,36],"bytes":[17151,17179]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"659:12":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@659:12","span":{"start":[659,12],"end":[659,51],"bytes":[17246,17285]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB"},"660:3":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@660:3","span":{"start":[660,3],"end":[660,112],"bytes":[17302,17411]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"660:53":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@660:53","span":{"start":[660,53],"end":[660,106],"bytes":[17352,17405]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"666:22":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@666:22","span":{"start":[666,22],"end":[666,33],"bytes":[17512,17523]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"668:4":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@668:4","span":{"start":[668,4],"end":[668,109],"bytes":[17545,17650]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError"},"668:54":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@668:54","span":{"start":[668,54],"end":[668,103],"bytes":[17595,17644]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"671:10":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@671:10","span":{"start":[671,10],"end":[671,25],"bytes":[17674,17689]},"callee":null},"675:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister@675:2","span":{"start":[675,2],"end":[679,4],"bytes":[17721,17838]},"callee":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON"}}},"github.com/benbjohnson/litestream.Server.storeTXID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","kind":"method","span":{"start":[274,1],"end":[285,2],"bytes":[6939,7227]},"signature":"github.com/benbjohnson/litestream.Server.storeTXID","parameters":[{"name":"path","type":"string","span":{"start":[274,1],"end":[274,58],"bytes":[6939,6996]}}],"return_type":"(uint64, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"275:8":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID@275:8","span":{"start":[275,8],"end":[275,28],"bytes":[7004,7024]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"277:13":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID@277:13","span":{"start":[277,13],"end":[277,55],"bytes":[7053,7095]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"280:21":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID@280:21","span":{"start":[280,21],"end":[280,32],"bytes":[7120,7131]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"282:13":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID@282:13","span":{"start":[282,13],"end":[282,45],"bytes":[7161,7193]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"284:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID@284:9","span":{"start":[284,9],"end":[284,24],"bytes":[7205,7220]},"callee":null}}}},"fields":{"PathExpander":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/PathExpander","kind":"field","type":"func(string) (string, error)","span":{"start":[45,1],"end":[45,43],"bytes":[915,957]}},"SocketPath":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/SocketPath","kind":"field","type":"string","span":{"start":[38,1],"end":[38,19],"bytes":[721,739]}},"SocketPerms":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/SocketPerms","kind":"field","type":"uint32","span":{"start":[41,1],"end":[41,20],"bytes":[797,816]}},"Version":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/Version","kind":"field","type":"string","span":{"start":[48,1],"end":[48,16],"bytes":[1013,1028]}},"cancel":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/cancel","kind":"field","type":"context.CancelFunc","span":{"start":[57,1],"end":[57,27],"bytes":[1180,1206]}},"ctx":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/ctx","kind":"field","type":"context.Context","span":{"start":[56,1],"end":[56,24],"bytes":[1156,1179]}},"httpServer":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/httpServer","kind":"field","type":"*net/http.Server","span":{"start":[54,1],"end":[54,29],"bytes":[1126,1154]}},"logger":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[60,1],"end":[60,21],"bytes":[1231,1251]}},"socketListener":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/socketListener","kind":"field","type":"net.Listener","span":{"start":[53,1],"end":[53,29],"bytes":[1097,1125]}},"startedAt":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/startedAt","kind":"field","type":"time.Time","span":{"start":[51,1],"end":[51,21],"bytes":[1075,1095]}},"store":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/store","kind":"field","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[35,1],"end":[35,14],"bytes":[659,672]}},"wg":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[58,1],"end":[58,23],"bytes":[1207,1229]}}}},"SocketConfig":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SocketConfig","kind":"struct","span":{"start":[18,1],"end":[22,2],"bytes":[213,353]},"callables":{},"fields":{"Enabled":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SocketConfig/Enabled","kind":"field","type":"bool","span":{"start":[19,1],"end":[19,37],"bytes":[240,276]}},"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SocketConfig/Path","kind":"field","type":"string","span":{"start":[20,1],"end":[20,34],"bytes":[277,310]}},"Permissions":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SocketConfig/Permissions","kind":"field","type":"uint32","span":{"start":[21,1],"end":[21,41],"bytes":[311,351]}}}},"StartRequest":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StartRequest","kind":"struct","span":{"start":[362,1],"end":[365,2],"bytes":[9206,9307]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StartRequest/Path","kind":"field","type":"string","span":{"start":[363,1],"end":[363,30],"bytes":[9233,9262]}},"Timeout":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StartRequest/Timeout","kind":"field","type":"int","span":{"start":[364,1],"end":[364,43],"bytes":[9263,9305]}}}},"StartResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StartResponse","kind":"struct","span":{"start":[368,1],"end":[372,2],"bytes":[9372,9490]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StartResponse/Path","kind":"field","type":"string","span":{"start":[370,1],"end":[370,29],"bytes":[9431,9459]}},"Status":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StartResponse/Status","kind":"field","type":"string","span":{"start":[369,1],"end":[369,31],"bytes":[9400,9430]}},"TXID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StartResponse/TXID","kind":"field","type":"uint64","span":{"start":[371,1],"end":[371,29],"bytes":[9460,9488]}}}},"StopRequest":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StopRequest","kind":"struct","span":{"start":[375,1],"end":[378,2],"bytes":[9551,9651]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StopRequest/Path","kind":"field","type":"string","span":{"start":[376,1],"end":[376,30],"bytes":[9577,9606]}},"Timeout":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StopRequest/Timeout","kind":"field","type":"int","span":{"start":[377,1],"end":[377,43],"bytes":[9607,9649]}}}},"StopResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StopResponse","kind":"struct","span":{"start":[381,1],"end":[385,2],"bytes":[9714,9831]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StopResponse/Path","kind":"field","type":"string","span":{"start":[383,1],"end":[383,29],"bytes":[9772,9800]}},"Status":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StopResponse/Status","kind":"field","type":"string","span":{"start":[382,1],"end":[382,31],"bytes":[9741,9771]}},"TXID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.StopResponse/TXID","kind":"field","type":"uint64","span":{"start":[384,1],"end":[384,29],"bytes":[9801,9829]}}}},"SyncDiagnosticsResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncDiagnosticsResponse","kind":"struct","span":{"start":[399,1],"end":[401,2],"bytes":[10189,10275]},"callables":{},"fields":{"Databases":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncDiagnosticsResponse/Databases","kind":"field","type":"[]github.com/benbjohnson/litestream.SyncDiagnostic","span":{"start":[400,1],"end":[400,47],"bytes":[10227,10273]}}}},"SyncRequest":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncRequest","kind":"struct","span":{"start":[462,1],"end":[466,2],"bytes":[11791,11931]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncRequest/Path","kind":"field","type":"string","span":{"start":[463,1],"end":[463,30],"bytes":[11817,11846]}},"Timeout":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncRequest/Timeout","kind":"field","type":"int","span":{"start":[465,1],"end":[465,43],"bytes":[11887,11929]}},"Wait":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncRequest/Wait","kind":"field","type":"bool","span":{"start":[464,1],"end":[464,40],"bytes":[11847,11886]}}}},"SyncResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncResponse","kind":"struct","span":{"start":[469,1],"end":[474,2],"bytes":[11994,12183]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncResponse/Path","kind":"field","type":"string","span":{"start":[471,1],"end":[471,37],"bytes":[12060,12096]}},"ReplicatedTXID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncResponse/ReplicatedTXID","kind":"field","type":"uint64","span":{"start":[473,1],"end":[473,48],"bytes":[12134,12181]}},"Status":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncResponse/Status","kind":"field","type":"string","span":{"start":[470,1],"end":[470,39],"bytes":[12021,12059]}},"TXID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.SyncResponse/TXID","kind":"field","type":"uint64","span":{"start":[472,1],"end":[472,37],"bytes":[12097,12133]}}}},"TXIDResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.TXIDResponse","kind":"struct","span":{"start":[394,1],"end":[396,2],"bytes":[10060,10115]},"callables":{},"fields":{"TXID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.TXIDResponse/TXID","kind":"field","type":"uint64","span":{"start":[395,1],"end":[395,27],"bytes":[10087,10113]}}}},"UnregisterDatabaseRequest":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseRequest","kind":"struct","span":{"start":[559,1],"end":[562,2],"bytes":[14470,14584]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseRequest/Path","kind":"field","type":"string","span":{"start":[560,1],"end":[560,30],"bytes":[14510,14539]}},"Timeout":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseRequest/Timeout","kind":"field","type":"int","span":{"start":[561,1],"end":[561,43],"bytes":[14540,14582]}}}},"UnregisterDatabaseResponse":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseResponse","kind":"struct","span":{"start":[565,1],"end":[569,2],"bytes":[14667,14798]},"callables":{},"fields":{"Path":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseResponse/Path","kind":"field","type":"string","span":{"start":[567,1],"end":[567,29],"bytes":[14739,14767]}},"Status":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseResponse/Status","kind":"field","type":"string","span":{"start":[566,1],"end":[566,31],"bytes":[14708,14738]}},"TXID":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.UnregisterDatabaseResponse/TXID","kind":"field","type":"uint64","span":{"start":[568,1],"end":[568,29],"bytes":[14768,14796]}}}}},"functions":{"github.com/benbjohnson/litestream.DefaultSocketConfig":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.DefaultSocketConfig","kind":"function","span":{"start":[25,1],"end":[31,2],"bytes":[420,574]},"signature":"github.com/benbjohnson/litestream.DefaultSocketConfig","parameters":[],"return_type":"github.com/benbjohnson/litestream.SocketConfig","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.NewServer":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer","kind":"function","span":{"start":[64,1],"end":[95,2],"bytes":[1299,2384]},"signature":"github.com/benbjohnson/litestream.NewServer","parameters":[{"name":"store","type":"*github.com/benbjohnson/litestream.Store","span":{"start":[64,1],"end":[64,39],"bytes":[1299,1337]}}],"return_type":"*github.com/benbjohnson/litestream.Server","metrics":{"cyclomatic":1},"body":{"65:17":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@65:17","span":{"start":[65,17],"end":[65,57],"bytes":[1354,1394]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"65:36":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@65:36","span":{"start":[65,36],"end":[65,56],"bytes":[1373,1393]},"callee":"can://litestream/litestream/@external/context/Background"},"71:16":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@71:16","span":{"start":[71,16],"end":[71,66],"bytes":[1511,1561]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"71:16/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@71:16/2","span":{"start":[71,16],"end":[71,30],"bytes":[1511,1525]},"callee":"can://litestream/litestream/@external/log/slog/Default"},"74:9":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@74:9","span":{"start":[74,9],"end":[74,27],"bytes":[1575,1593]},"callee":"can://litestream/litestream/@external/net/http/NewServeMux"},"75:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@75:2","span":{"start":[75,2],"end":[75,46],"bytes":[1595,1639]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"76:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@76:2","span":{"start":[76,2],"end":[76,44],"bytes":[1641,1683]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"77:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@77:2","span":{"start":[77,2],"end":[77,43],"bytes":[1685,1726]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"78:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@78:2","span":{"start":[78,2],"end":[78,52],"bytes":[1728,1778]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"79:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@79:2","span":{"start":[79,2],"end":[79,56],"bytes":[1780,1834]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"80:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@80:2","span":{"start":[80,2],"end":[80,44],"bytes":[1836,1878]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"81:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@81:2","span":{"start":[81,2],"end":[81,43],"bytes":[1880,1921]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"82:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@82:2","span":{"start":[82,2],"end":[82,43],"bytes":[1923,1964]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"83:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@83:2","span":{"start":[83,2],"end":[83,62],"bytes":[1966,2026]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"86:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@86:2","span":{"start":[86,2],"end":[86,50],"bytes":[2049,2097]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"87:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@87:2","span":{"start":[87,2],"end":[87,59],"bytes":[2099,2156]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"88:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@88:2","span":{"start":[88,2],"end":[88,59],"bytes":[2158,2215]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"89:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@89:2","span":{"start":[89,2],"end":[89,57],"bytes":[2217,2272]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"},"90:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer@90:2","span":{"start":[90,2],"end":[90,55],"bytes":[2274,2327]},"callee":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc"}}},"github.com/benbjohnson/litestream.writeJSON":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","kind":"function","span":{"start":[346,1],"end":[350,2],"bytes":[8712,8885]},"signature":"github.com/benbjohnson/litestream.writeJSON","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[346,1],"end":[346,67],"bytes":[8712,8778]}},{"name":"status","type":"int","span":{"start":[346,1],"end":[346,67],"bytes":[8712,8778]}},{"name":"v","type":"interface{}","span":{"start":[346,1],"end":[346,67],"bytes":[8712,8778]}}],"metrics":{"cyclomatic":1},"body":{"347:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON@347:2","span":{"start":[347,2],"end":[347,52],"bytes":[8780,8830]},"callee":"can://litestream/litestream/@external/net/http/Header.Set"},"347:2/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON@347:2/2","span":{"start":[347,2],"end":[347,12],"bytes":[8780,8790]},"callee":"can://litestream/litestream/@external/net/http/ResponseWriter.Header"},"348:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON@348:2","span":{"start":[348,2],"end":[348,23],"bytes":[8832,8853]},"callee":"can://litestream/litestream/@external/net/http/ResponseWriter.WriteHeader"},"349:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON@349:2","span":{"start":[349,2],"end":[349,30],"bytes":[8855,8883]},"callee":"can://litestream/litestream/@external/encoding/json/Encoder.Encode"},"349:2/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON@349:2/2","span":{"start":[349,2],"end":[349,20],"bytes":[8855,8873]},"callee":"can://litestream/litestream/@external/encoding/json/NewEncoder"}}},"github.com/benbjohnson/litestream.writeJSONError":{"id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","kind":"function","span":{"start":[352,1],"end":[359,2],"bytes":[8887,9143]},"signature":"github.com/benbjohnson/litestream.writeJSONError","parameters":[{"name":"w","type":"net/http.ResponseWriter","span":{"start":[352,1],"end":[352,94],"bytes":[8887,8980]}},{"name":"status","type":"int","span":{"start":[352,1],"end":[352,94],"bytes":[8887,8980]}},{"name":"message","type":"string","span":{"start":[352,1],"end":[352,94],"bytes":[8887,8980]}},{"name":"details","type":"interface{}","span":{"start":[352,1],"end":[352,94],"bytes":[8887,8980]}}],"metrics":{"cyclomatic":1},"body":{"353:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError@353:2","span":{"start":[353,2],"end":[353,52],"bytes":[8982,9032]},"callee":"can://litestream/litestream/@external/net/http/Header.Set"},"353:2/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError@353:2/2","span":{"start":[353,2],"end":[353,12],"bytes":[8982,8992]},"callee":"can://litestream/litestream/@external/net/http/ResponseWriter.Header"},"354:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError@354:2","span":{"start":[354,2],"end":[354,23],"bytes":[9034,9055]},"callee":"can://litestream/litestream/@external/net/http/ResponseWriter.WriteHeader"},"355:2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError@355:2","span":{"start":[355,2],"end":[358,4],"bytes":[9057,9141]},"callee":"can://litestream/litestream/@external/encoding/json/Encoder.Encode"},"355:2/2":{"kind":"call","id":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError@355:2/2","span":{"start":[355,2],"end":[355,20],"bytes":[9057,9075]},"callee":"can://litestream/litestream/@external/encoding/json/NewEncoder"}}}},"content_hash":"e3f807d05a146d30c5e210067903fb9f8756128b292c0e8c140648ec80767946"},"sftp/replica_client.go":{"id":"can://litestream/litestream/go/sftp/replica_client.go","kind":"module","span":{"start":[1,1],"end":[431,1],"bytes":[0,11844]},"package":"sftp","source":"package sftp\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/pkg/sftp\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/crypto/ssh\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"sftp\", NewReplicaClientFromURL)\n}\n\n// ReplicaClientType is the client type for this package.\nconst ReplicaClientType = \"sftp\"\n\n// Default settings for replica client.\nconst (\n\tDefaultDialTimeout = 30 * time.Second\n)\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\n// ReplicaClient is a client for writing LTX files over SFTP.\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tsshClient *ssh.Client\n\tsftpClient *sftp.Client\n\tlogger *slog.Logger\n\n\t// SFTP connection info\n\tHost string\n\tUser string\n\tPassword string\n\tPath string\n\tKeyPath string\n\tHostKey string\n\tDialTimeout time.Duration\n\n\t// ConcurrentWrites enables concurrent writes for better performance.\n\t// Note: This makes resuming failed transfers unsafe.\n\tConcurrentWrites bool\n}\n\n// NewReplicaClient returns a new instance of ReplicaClient.\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tDialTimeout: DefaultDialTimeout,\n\t\tConcurrentWrites: true, // Default to true for better performance\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: sftp://[user[:password]@]host[:port]/path\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\t// Extract credentials from userinfo\n\tif userinfo != nil {\n\t\tclient.User = userinfo.Username()\n\t\tclient.Password, _ = userinfo.Password()\n\t}\n\n\tclient.Host = host\n\tclient.Path = urlPath\n\n\tif client.Host == \"\" {\n\t\treturn nil, fmt.Errorf(\"host required for sftp replica URL\")\n\t}\n\tif client.User == \"\" {\n\t\treturn nil, fmt.Errorf(\"user required for sftp replica URL\")\n\t}\n\n\treturn client, nil\n}\n\n// Type returns \"sftp\" as the client type.\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\n// Init initializes the connection to SFTP. No-op if already initialized.\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\t_, err := c.init(ctx)\n\treturn err\n}\n\n// init initializes the connection and returns the SFTP client.\nfunc (c *ReplicaClient) init(ctx context.Context) (_ *sftp.Client, err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.sftpClient != nil {\n\t\treturn c.sftpClient, nil\n\t}\n\n\tif c.User == \"\" {\n\t\treturn nil, fmt.Errorf(\"sftp user required\")\n\t}\n\n\t// Build SSH configuration \u0026 auth methods\n\tvar hostkey ssh.HostKeyCallback\n\tif c.HostKey != \"\" {\n\t\tvar pubkey, _, _, _, err = ssh.ParseAuthorizedKey([]byte(c.HostKey))\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"cannot parse sftp host key: %w\", err)\n\t\t}\n\t\thostkey = ssh.FixedHostKey(pubkey)\n\t} else {\n\t\tslog.Warn(\"sftp host key not verified\", \"host\", c.Host)\n\t\thostkey = ssh.InsecureIgnoreHostKey()\n\t}\n\tconfig := \u0026ssh.ClientConfig{\n\t\tUser: c.User,\n\t\tHostKeyCallback: hostkey,\n\t\tBannerCallback: ssh.BannerDisplayStderr(),\n\t}\n\tif c.Password != \"\" {\n\t\tconfig.Auth = append(config.Auth, ssh.Password(c.Password))\n\t}\n\n\tif c.KeyPath != \"\" {\n\t\tbuf, err := os.ReadFile(c.KeyPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"sftp: cannot read sftp key path: %w\", err)\n\t\t}\n\n\t\tsigner, err := ssh.ParsePrivateKey(buf)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"sftp: cannot parse sftp key path: %w\", err)\n\t\t}\n\t\tconfig.Auth = append(config.Auth, ssh.PublicKeys(signer))\n\t}\n\n\t// Append standard port, if necessary.\n\thost := c.Host\n\tif _, _, err := net.SplitHostPort(c.Host); err != nil {\n\t\thost = net.JoinHostPort(c.Host, \"22\")\n\t}\n\n\t// Connect via SSH.\n\tif c.sshClient, err = ssh.Dial(\"tcp\", host, config); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Wrap connection with an SFTP client.\n\t// Configure options based on client settings\n\topts := []sftp.ClientOption{}\n\tif c.ConcurrentWrites {\n\t\topts = append(opts, sftp.UseConcurrentWrites(true))\n\t}\n\n\tif c.sftpClient, err = sftp.NewClient(c.sshClient, opts...); err != nil {\n\t\tc.sshClient.Close()\n\t\tc.sshClient = nil\n\t\treturn nil, err\n\t}\n\n\treturn c.sftpClient, nil\n}\n\n// DeleteAll deletes all LTX files.\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) (err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar dirs []string\n\twalker := sftpClient.Walk(c.Path)\n\tfor walker.Step() {\n\t\tif err := walker.Err(); os.IsNotExist(err) {\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn fmt.Errorf(\"sftp: cannot walk path %q: %w\", walker.Path(), err)\n\t\t}\n\t\tif walker.Stat().IsDir() {\n\t\t\tdirs = append(dirs, walker.Path())\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := sftpClient.Remove(walker.Path()); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"sftp: cannot delete file %q: %w\", walker.Path(), err)\n\t\t}\n\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\t// Remove directories in reverse order after they have been emptied.\n\tfor i := len(dirs) - 1; i \u003e= 0; i-- {\n\t\tfilename := dirs[i]\n\t\tif err := sftpClient.RemoveDirectory(filename); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"sftp: cannot delete directory %q: %w\", filename, err)\n\t\t}\n\t}\n\n\t// log.Printf(\"%s(%s): retainer: deleting all\", r.db.Path(), r.Name())\n\n\treturn nil\n}\n\n// LTXFiles returns an iterator over all available LTX files for a level.\n// SFTP uses file ModTime for timestamps, which is set via Chtimes() to preserve original timestamp.\n// The useMetadata parameter is ignored since ModTime always contains the accurate timestamp.\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, _ bool) (_ ltx.FileIterator, err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdir := litestream.LTXLevelDir(c.Path, level)\n\tfis, err := sftpClient.ReadDir(dir)\n\tif os.IsNotExist(err) {\n\t\treturn ltx.NewFileInfoSliceIterator(nil), nil\n\t} else if err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Iterate over every file and convert to metadata.\n\tinfos := make([]*ltx.FileInfo, 0, len(fis))\n\tfor _, fi := range fis {\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(path.Base(fi.Name()))\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t} else if minTXID \u003c seek {\n\t\t\tcontinue\n\t\t}\n\n\t\tinfos = append(infos, \u0026ltx.FileInfo{\n\t\t\tLevel: level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: fi.Size(),\n\t\t\tCreatedAt: fi.ModTime().UTC(), // ModTime contains accurate timestamp from Chtimes()\n\t\t})\n\t}\n\n\treturn ltx.NewFileInfoSliceIterator(infos), nil\n}\n\n// WriteLTXFile writes a LTX file from rd into a remote file.\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\t// Use TeeReader to peek at LTX header while preserving data for upload\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\t// Extract timestamp from LTX header\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Combine buffered data with rest of reader\n\tfullReader := io.MultiReader(\u0026buf, rd)\n\n\tif err := sftpClient.MkdirAll(path.Dir(filename)); err != nil {\n\t\treturn nil, fmt.Errorf(\"sftp: cannot make parent snapshot directory %q: %w\", path.Dir(filename), err)\n\t}\n\n\ttmpFilename := fmt.Sprintf(\"%s.%d.%d.tmp\", filename, os.Getpid(), time.Now().UnixNano())\n\tf, err := sftpClient.OpenFile(tmpFilename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"sftp: cannot open temporary snapshot file for writing: %w\", err)\n\t}\n\tdefer func() {\n\t\tif f != nil {\n\t\t\t_ = f.Close()\n\t\t}\n\t\tif err != nil {\n\t\t\t_ = sftpClient.Remove(tmpFilename)\n\t\t}\n\t}()\n\n\tn, err := io.Copy(f, fullReader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Flush the data to stable storage before the rename so a server crash\n\t// cannot leave an empty file at the final path. Servers that do not\n\t// advertise fsync@openssh.com are left to their own write-back policy.\n\tif _, ok := sftpClient.HasExtension(\"fsync@openssh.com\"); ok {\n\t\tif err := f.Sync(); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"sftp: cannot sync temporary ltx file %q: %w\", tmpFilename, err)\n\t\t}\n\t}\n\n\tif err := f.Close(); err != nil {\n\t\treturn nil, err\n\t}\n\tf = nil\n\n\tif err := sftpClient.Chtimes(tmpFilename, timestamp, timestamp); err != nil {\n\t\treturn nil, fmt.Errorf(\"sftp: cannot set file timestamps: %w\", err)\n\t}\n\n\tif err := sftpClient.Rename(tmpFilename, filename); err != nil {\n\t\treturn nil, fmt.Errorf(\"sftp: cannot rename temporary ltx file %q to %q: %w\", tmpFilename, filename, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(n))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: n,\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\n// OpenLTXFile returns a reader for an LTX file.\n// Returns os.ErrNotExist if no matching position is found.\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (_ io.ReadCloser, err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\tf, err := sftpClient.OpenFile(filename, os.O_RDONLY)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif offset \u003e 0 {\n\t\tif _, err := f.Seek(offset, io.SeekStart); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\n\tif size \u003e 0 {\n\t\treturn internal.LimitReadCloser(f, size), nil\n\t}\n\treturn f, nil\n}\n\n// DeleteLTXFiles deletes LTX files with at the given positions.\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) (err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, info := range a {\n\t\tfilename := litestream.LTXFilePath(c.Path, info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", filename)\n\n\t\tif err := sftpClient.Remove(filename); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\t\treturn fmt.Errorf(\"sftp: cannot delete ltx file %q: %w\", filename, err)\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n\n// Cleanup deletes path \u0026 directories after empty.\nfunc (c *ReplicaClient) Cleanup(ctx context.Context) (err error) {\n\tdefer func() { c.resetOnConnError(err) }()\n\n\tsftpClient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := sftpClient.RemoveDirectory(c.Path); err != nil \u0026\u0026 !os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"sftp: cannot delete path: %w\", err)\n\t}\n\treturn nil\n}\n\n// resetOnConnError closes \u0026 clears the client if a connection error occurs.\nfunc (c *ReplicaClient) resetOnConnError(err error) {\n\tif !errors.Is(err, sftp.ErrSSHFxConnectionLost) {\n\t\treturn\n\t}\n\n\tif c.sftpClient != nil {\n\t\tc.sftpClient.Close()\n\t\tc.sftpClient = nil\n\t}\n\tif c.sshClient != nil {\n\t\tc.sshClient.Close()\n\t\tc.sshClient = nil\n\t}\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[23,31]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[32,42]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[43,52]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[53,59]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[60,65]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[66,77]}},{"name":"net","path":"net","span":{"start":[10,1],"end":[10,7],"bytes":[78,84]}},{"name":"url","path":"net/url","span":{"start":[11,1],"end":[11,11],"bytes":[85,95]}},{"name":"os","path":"os","span":{"start":[12,1],"end":[12,6],"bytes":[96,101]}},{"name":"path","path":"path","span":{"start":[13,1],"end":[13,8],"bytes":[102,109]}},{"name":"sync","path":"sync","span":{"start":[14,1],"end":[14,8],"bytes":[110,117]}},{"name":"time","path":"time","span":{"start":[15,1],"end":[15,8],"bytes":[118,125]}},{"name":"sftp","path":"github.com/pkg/sftp","span":{"start":[17,1],"end":[17,23],"bytes":[127,149]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[18,1],"end":[18,27],"bytes":[150,176]}},{"name":"ssh","path":"golang.org/x/crypto/ssh","span":{"start":[19,1],"end":[19,27],"bytes":[177,203]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[21,1],"end":[21,37],"bytes":[205,241]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[22,1],"end":[22,46],"bytes":[242,287]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient","kind":"struct","span":{"start":[40,1],"end":[58,2],"bytes":[682,1131]},"callables":{"github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","kind":"method","span":{"start":[402,1],"end":[414,2],"bytes":[11168,11502]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[402,1],"end":[402,67],"bytes":[11168,11234]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"403:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup@403:8","span":{"start":[403,8],"end":[403,44],"bytes":[11242,11278]},"callee":null,"is_deferred":true},"405:21":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup@405:21","span":{"start":[405,21],"end":[405,32],"bytes":[11300,11311]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"410:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup@410:12","span":{"start":[410,12],"end":[410,46],"bytes":[11357,11391]},"callee":null},"410:63":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup@410:63","span":{"start":[410,63],"end":[410,81],"bytes":[11408,11426]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"411:10":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup@411:10","span":{"start":[411,10],"end":[411,57],"bytes":[11438,11485]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup.closure_1","kind":"function","span":{"start":[403,1],"end":[403,44],"bytes":[11235,11278]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup.closure_1","parameters":[],"body":{"403:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup.closure_1@403:17","span":{"start":[403,17],"end":[403,40],"bytes":[11251,11274]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError"}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll","kind":"method","span":{"start":[184,1],"end":[223,2],"bytes":[4537,5679]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[184,1],"end":[184,69],"bytes":[4537,4605]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"185:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@185:8","span":{"start":[185,8],"end":[185,44],"bytes":[4613,4649]},"callee":null,"is_deferred":true},"187:21":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@187:21","span":{"start":[187,21],"end":[187,32],"bytes":[4671,4682]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"193:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@193:12","span":{"start":[193,12],"end":[193,35],"bytes":[4747,4770]},"callee":null},"194:6":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@194:6","span":{"start":[194,6],"end":[194,19],"bytes":[4776,4789]},"callee":null},"195:13":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@195:13","span":{"start":[195,13],"end":[195,25],"bytes":[4804,4816]},"callee":null},"195:27":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@195:27","span":{"start":[195,27],"end":[195,45],"bytes":[4818,4836]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"198:11":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@198:11","span":{"start":[198,11],"end":[198,74],"bytes":[4886,4949]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"198:55":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@198:55","span":{"start":[198,55],"end":[198,68],"bytes":[4930,4943]},"callee":null},"200:6":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@200:6","span":{"start":[200,6],"end":[200,27],"bytes":[4959,4980]},"callee":null},"200:6/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@200:6/2","span":{"start":[200,6],"end":[200,19],"bytes":[4959,4972]},"callee":null},"201:11":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@201:11","span":{"start":[201,11],"end":[201,38],"bytes":[4993,5020]},"callee":null},"201:24":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@201:24","span":{"start":[201,24],"end":[201,37],"bytes":[5006,5019]},"callee":null},"205:13":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@205:13","span":{"start":[205,13],"end":[205,45],"bytes":[5050,5082]},"callee":null},"205:31":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@205:31","span":{"start":[205,31],"end":[205,44],"bytes":[5068,5081]},"callee":null},"205:62":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@205:62","span":{"start":[205,62],"end":[205,80],"bytes":[5099,5117]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"206:11":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@206:11","span":{"start":[206,11],"end":[206,76],"bytes":[5130,5195]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"206:57":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@206:57","span":{"start":[206,57],"end":[206,70],"bytes":[5176,5189]},"callee":null},"209:3":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@209:3","span":{"start":[209,3],"end":[209,87],"bytes":[5203,5287]},"callee":null},"209:3/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@209:3/2","span":{"start":[209,3],"end":[209,81],"bytes":[5203,5281]},"callee":null},"213:11":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@213:11","span":{"start":[213,11],"end":[213,20],"bytes":[5372,5381]},"callee":null},"215:13":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@215:13","span":{"start":[215,13],"end":[215,49],"bytes":[5435,5471]},"callee":null},"215:66":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@215:66","span":{"start":[215,66],"end":[215,84],"bytes":[5488,5506]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"216:11":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll@216:11","span":{"start":[216,11],"end":[216,76],"bytes":[5519,5584]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll.closure_1","kind":"function","span":{"start":[185,1],"end":[185,44],"bytes":[4606,4649]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll.closure_1","parameters":[],"body":{"185:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll.closure_1@185:17","span":{"start":[185,17],"end":[185,40],"bytes":[4622,4645]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError"}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[379,1],"end":[399,2],"bytes":[10411,11115]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[379,1],"end":[379,93],"bytes":[10411,10503]}},{"name":"a","type":"[]invalid type","span":{"start":[379,1],"end":[379,93],"bytes":[10411,10503]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"380:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@380:8","span":{"start":[380,8],"end":[380,44],"bytes":[10511,10547]},"callee":null,"is_deferred":true},"382:21":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@382:21","span":{"start":[382,21],"end":[382,32],"bytes":[10569,10580]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"388:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@388:15","span":{"start":[388,15],"end":[388,85],"bytes":[10655,10725]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"390:3":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@390:3","span":{"start":[390,3],"end":[390,127],"bytes":[10729,10853]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"392:13":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@392:13","span":{"start":[392,13],"end":[392,40],"bytes":[10867,10894]},"callee":null},"392:57":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@392:57","span":{"start":[392,57],"end":[392,75],"bytes":[10911,10929]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"393:11":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@393:11","span":{"start":[393,11],"end":[393,75],"bytes":[10942,11006]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"395:3":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@395:3","span":{"start":[395,3],"end":[395,87],"bytes":[11013,11097]},"callee":null},"395:3/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles@395:3/2","span":{"start":[395,3],"end":[395,81],"bytes":[11013,11091]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles.closure_1","kind":"function","span":{"start":[380,1],"end":[380,44],"bytes":[10504,10547]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles.closure_1","parameters":[],"body":{"380:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles.closure_1@380:17","span":{"start":[380,17],"end":[380,40],"bytes":[10520,10543]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError"}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.Init":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Init","kind":"method","span":{"start":[104,1],"end":[107,2],"bytes":[2484,2578]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[104,1],"end":[104,58],"bytes":[2484,2541]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"105:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Init@105:12","span":{"start":[105,12],"end":[105,23],"bytes":[2553,2564]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","kind":"method","span":{"start":[228,1],"end":[264,2],"bytes":[5950,6935]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[228,1],"end":[228,122],"bytes":[5950,6071]}},{"name":"level","type":"int","span":{"start":[228,1],"end":[228,122],"bytes":[5950,6071]}},{"name":"seek","type":"invalid type","span":{"start":[228,1],"end":[228,122],"bytes":[5950,6071]}},{"name":"_","type":"bool","span":{"start":[228,1],"end":[228,122],"bytes":[5950,6071]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":7},"body":{"229:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@229:8","span":{"start":[229,8],"end":[229,44],"bytes":[6079,6115]},"callee":null,"is_deferred":true},"231:21":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@231:21","span":{"start":[231,21],"end":[231,32],"bytes":[6137,6148]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"236:9":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@236:9","span":{"start":[236,9],"end":[236,46],"bytes":[6196,6233]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"237:14":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@237:14","span":{"start":[237,14],"end":[237,37],"bytes":[6247,6270]},"callee":null},"238:5":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@238:5","span":{"start":[238,5],"end":[238,23],"bytes":[6275,6293]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"239:10":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@239:10","span":{"start":[239,10],"end":[239,43],"bytes":[6305,6338]},"callee":null},"245:11":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@245:11","span":{"start":[245,11],"end":[245,45],"bytes":[6453,6487]},"callee":null},"245:36":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@245:36","span":{"start":[245,36],"end":[245,44],"bytes":[6478,6486]},"callee":null},"247:28":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@247:28","span":{"start":[247,28],"end":[247,67],"bytes":[6541,6580]},"callee":null},"247:46":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@247:46","span":{"start":[247,46],"end":[247,66],"bytes":[6559,6579]},"callee":"can://litestream/litestream/@external/path/Base"},"247:56":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@247:56","span":{"start":[247,56],"end":[247,65],"bytes":[6569,6578]},"callee":null},"254:11":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@254:11","span":{"start":[254,11],"end":[260,5],"bytes":[6667,6880]},"callee":null},"258:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@258:15","span":{"start":[258,15],"end":[258,24],"bytes":[6777,6786]},"callee":null},"259:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@259:15","span":{"start":[259,15],"end":[259,33],"bytes":[6802,6820]},"callee":null},"259:15/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@259:15/2","span":{"start":[259,15],"end":[259,27],"bytes":[6802,6814]},"callee":null},"263:9":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles@263:9","span":{"start":[263,9],"end":[263,44],"bytes":[6893,6928]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles.closure_1","kind":"function","span":{"start":[229,1],"end":[229,44],"bytes":[6072,6115]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles.closure_1","parameters":[],"body":{"229:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles.closure_1@229:17","span":{"start":[229,17],"end":[229,40],"bytes":[6088,6111]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError"}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[350,1],"end":[376,2],"bytes":[9652,10344]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"level","type":"int","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"minTXID","type":"invalid type","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"maxTXID","type":"invalid type","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"offset","type":"int64","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}},{"name":"size","type":"int64","span":{"start":[350,1],"end":[350,146],"bytes":[9652,9797]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"351:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile@351:8","span":{"start":[351,8],"end":[351,44],"bytes":[9805,9841]},"callee":null,"is_deferred":true},"353:21":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile@353:21","span":{"start":[353,21],"end":[353,32],"bytes":[9863,9874]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"358:14":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile@358:14","span":{"start":[358,14],"end":[358,69],"bytes":[9927,9982]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"359:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile@359:12","span":{"start":[359,12],"end":[359,54],"bytes":[9994,10036]},"callee":null},"365:16":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile@365:16","span":{"start":[365,16],"end":[365,44],"bytes":[10108,10136]},"callee":null},"370:2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile@370:2","span":{"start":[370,2],"end":[370,83],"bytes":[10179,10260]},"callee":null},"370:2/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile@370:2/2","span":{"start":[370,2],"end":[370,77],"bytes":[10179,10254]},"callee":null},"373:10":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile@373:10","span":{"start":[373,10],"end":[373,43],"bytes":[10286,10319]},"callee":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser"}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile.closure_1","kind":"function","span":{"start":[351,1],"end":[351,44],"bytes":[9798,9841]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile.closure_1","parameters":[],"body":{"351:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile.closure_1@351:17","span":{"start":[351,17],"end":[351,40],"bytes":[9814,9837]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError"}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.SetLogger","kind":"method","span":{"start":[69,1],"end":[71,2],"bytes":[1438,1544]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[69,1],"end":[69,57],"bytes":[1438,1494]}}],"metrics":{"cyclomatic":1},"body":{"70:13":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.SetLogger@70:13","span":{"start":[70,13],"end":[70,48],"bytes":[1507,1542]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.Type":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Type","kind":"method","span":{"start":[99,1],"end":[101,2],"bytes":[2341,2408]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[267,1],"end":[346,2],"bytes":[6999,9541]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}},{"name":"level","type":"int","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}},{"name":"minTXID","type":"invalid type","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}},{"name":"maxTXID","type":"invalid type","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}},{"name":"rd","type":"io.Reader","span":{"start":[267,1],"end":[267,144],"bytes":[6999,7142]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"268:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@268:8","span":{"start":[268,8],"end":[268,44],"bytes":[7150,7186]},"callee":null,"is_deferred":true},"270:21":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@270:21","span":{"start":[270,21],"end":[270,32],"bytes":[7208,7219]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init"},"275:14":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@275:14","span":{"start":[275,14],"end":[275,69],"bytes":[7272,7327]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"279:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@279:15","span":{"start":[279,15],"end":[279,37],"bytes":[7438,7460]},"callee":"can://litestream/litestream/@external/io/TeeReader"},"282:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@282:17","span":{"start":[282,17],"end":[282,42],"bytes":[7516,7541]},"callee":null},"284:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@284:15","span":{"start":[284,15],"end":[284,71],"bytes":[7573,7629]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"286:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@286:15","span":{"start":[286,15],"end":[286,50],"bytes":[7647,7682]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"286:15/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@286:15/2","span":{"start":[286,15],"end":[286,44],"bytes":[7647,7676]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"289:16":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@289:16","span":{"start":[289,16],"end":[289,40],"bytes":[7745,7769]},"callee":"can://litestream/litestream/@external/io/MultiReader"},"291:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@291:12","span":{"start":[291,12],"end":[291,51],"bytes":[7782,7821]},"callee":null},"291:32":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@291:32","span":{"start":[291,32],"end":[291,50],"bytes":[7802,7820]},"callee":"can://litestream/litestream/@external/path/Dir"},"292:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@292:15","span":{"start":[292,15],"end":[292,104],"bytes":[7850,7939]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"292:80":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@292:80","span":{"start":[292,80],"end":[292,98],"bytes":[7915,7933]},"callee":"can://litestream/litestream/@external/path/Dir"},"295:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@295:17","span":{"start":[295,17],"end":[295,90],"bytes":[7960,8033]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"},"295:55":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@295:55","span":{"start":[295,55],"end":[295,66],"bytes":[7998,8009]},"callee":"can://litestream/litestream/@external/os/Getpid"},"295:68":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@295:68","span":{"start":[295,68],"end":[295,89],"bytes":[8011,8032]},"callee":"can://litestream/litestream/@external/time/Time.UnixNano"},"295:68/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@295:68/2","span":{"start":[295,68],"end":[295,78],"bytes":[8011,8021]},"callee":"can://litestream/litestream/@external/time/Now"},"296:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@296:12","span":{"start":[296,12],"end":[296,80],"bytes":[8045,8113]},"callee":null},"298:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@298:15","span":{"start":[298,15],"end":[298,91],"bytes":[8145,8221]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"300:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@300:8","span":{"start":[300,8],"end":[307,5],"bytes":[8232,8342]},"callee":null,"is_deferred":true},"309:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@309:12","span":{"start":[309,12],"end":[309,34],"bytes":[8355,8377]},"callee":"can://litestream/litestream/@external/io/Copy"},"317:14":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@317:14","span":{"start":[317,14],"end":[317,58],"bytes":[8646,8690]},"callee":null},"318:13":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@318:13","span":{"start":[318,13],"end":[318,21],"bytes":[8709,8717]},"callee":null},"319:16":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@319:16","span":{"start":[319,16],"end":[319,91],"bytes":[8747,8822]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"323:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@323:12","span":{"start":[323,12],"end":[323,21],"bytes":[8842,8851]},"callee":null},"328:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@328:12","span":{"start":[328,12],"end":[328,65],"bytes":[8908,8961]},"callee":null},"329:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@329:15","span":{"start":[329,15],"end":[329,70],"bytes":[8990,9045]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"332:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@332:12","span":{"start":[332,12],"end":[332,52],"bytes":[9061,9101]},"callee":null},"333:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@333:15","span":{"start":[333,15],"end":[333,108],"bytes":[9130,9223]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"336:2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@336:2","span":{"start":[336,2],"end":[336,83],"bytes":[9229,9310]},"callee":null},"336:2/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@336:2/2","span":{"start":[336,2],"end":[336,77],"bytes":[9229,9304]},"callee":null},"337:2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@337:2","span":{"start":[337,2],"end":[337,93],"bytes":[9312,9403]},"callee":null},"337:2/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@337:2/2","span":{"start":[337,2],"end":[337,77],"bytes":[9312,9387]},"callee":null},"337:82":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile@337:82","span":{"start":[337,82],"end":[337,92],"bytes":[9392,9402]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_1","kind":"function","span":{"start":[268,1],"end":[268,44],"bytes":[7143,7186]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_1","parameters":[],"body":{"268:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_1@268:17","span":{"start":[268,17],"end":[268,40],"bytes":[7159,7182]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError"}}},"closure_2":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_2","kind":"function","span":{"start":[300,1],"end":[307,5],"bytes":[8225,8342]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_2","parameters":[],"body":{"302:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_2@302:8","span":{"start":[302,8],"end":[302,17],"bytes":[8264,8273]},"callee":null},"305:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_2@305:8","span":{"start":[305,8],"end":[305,38],"bytes":[8303,8333]},"callee":null}}}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.init":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","kind":"method","span":{"start":[110,1],"end":[181,2],"bytes":[2644,4499]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[110,1],"end":[110,80],"bytes":[2644,2723]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":13},"body":{"111:2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@111:2","span":{"start":[111,2],"end":[111,13],"bytes":[2725,2736]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"112:8":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@112:8","span":{"start":[112,8],"end":[112,21],"bytes":[2744,2757]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"119:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@119:15","span":{"start":[119,15],"end":[119,47],"bytes":[2849,2881]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"125:30":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@125:30","span":{"start":[125,30],"end":[125,71],"bytes":[3013,3054]},"callee":null},"125:53":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@125:53","span":{"start":[125,53],"end":[125,70],"bytes":[3036,3053]},"callee":null},"127:16":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@127:16","span":{"start":[127,16],"end":[127,65],"bytes":[3088,3137]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"129:13":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@129:13","span":{"start":[129,13],"end":[129,37],"bytes":[3154,3178]},"callee":null},"131:3":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@131:3","span":{"start":[131,3],"end":[131,58],"bytes":[3191,3246]},"callee":"can://litestream/litestream/@external/log/slog/Warn"},"132:13":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@132:13","span":{"start":[132,13],"end":[132,40],"bytes":[3259,3286]},"callee":null},"137:20":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@137:20","span":{"start":[137,20],"end":[137,45],"bytes":[3394,3419]},"callee":null},"140:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@140:17","span":{"start":[140,17],"end":[140,62],"bytes":[3463,3508]},"callee":null},"140:37":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@140:37","span":{"start":[140,37],"end":[140,61],"bytes":[3483,3507]},"callee":null},"144:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@144:15","span":{"start":[144,15],"end":[144,37],"bytes":[3549,3571]},"callee":"can://litestream/litestream/@external/os/ReadFile"},"146:16":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@146:16","span":{"start":[146,16],"end":[146,70],"bytes":[3605,3659]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"149:18":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@149:18","span":{"start":[149,18],"end":[149,42],"bytes":[3682,3706]},"callee":null},"151:16":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@151:16","span":{"start":[151,16],"end":[151,71],"bytes":[3740,3795]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"153:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@153:17","span":{"start":[153,17],"end":[153,60],"bytes":[3816,3859]},"callee":null},"153:37":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@153:37","span":{"start":[153,37],"end":[153,59],"bytes":[3836,3858]},"callee":null},"158:18":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@158:18","span":{"start":[158,18],"end":[158,43],"bytes":[3937,3962]},"callee":"can://litestream/litestream/@external/net/SplitHostPort"},"159:10":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@159:10","span":{"start":[159,10],"end":[159,40],"bytes":[3986,4016]},"callee":"can://litestream/litestream/@external/net/JoinHostPort"},"163:24":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@163:24","span":{"start":[163,24],"end":[163,53],"bytes":[4065,4094]},"callee":null},"171:10":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@171:10","span":{"start":[171,10],"end":[171,54],"bytes":[4284,4328]},"callee":null},"171:23":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@171:23","span":{"start":[171,23],"end":[171,53],"bytes":[4297,4327]},"callee":null},"174:25":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@174:25","span":{"start":[174,25],"end":[174,61],"bytes":[4357,4393]},"callee":null},"175:3":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init@175:3","span":{"start":[175,3],"end":[175,22],"bytes":[4410,4429]},"callee":null}}},"github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","kind":"method","span":{"start":[417,1],"end":[430,2],"bytes":[11581,11843]},"signature":"github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","parameters":[{"name":"err","type":"error","span":{"start":[417,1],"end":[417,54],"bytes":[11581,11634]}}],"metrics":{"cyclomatic":4},"body":{"418:6":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError@418:6","span":{"start":[418,6],"end":[418,49],"bytes":[11640,11683]},"callee":"can://litestream/litestream/@external/errors/Is"},"423:3":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError@423:3","span":{"start":[423,3],"end":[423,23],"bytes":[11727,11747]},"callee":null},"427:3":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError@427:3","span":{"start":[427,3],"end":[427,22],"bytes":[11799,11818]},"callee":null}}}},"fields":{"ConcurrentWrites":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/ConcurrentWrites","kind":"field","type":"bool","span":{"start":[57,1],"end":[57,23],"bytes":[1107,1129]}},"DialTimeout":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/DialTimeout","kind":"field","type":"time.Duration","span":{"start":[53,1],"end":[53,27],"bytes":[953,979]}},"Host":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/Host","kind":"field","type":"string","span":{"start":[47,1],"end":[47,20],"bytes":[833,852]}},"HostKey":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/HostKey","kind":"field","type":"string","span":{"start":[52,1],"end":[52,20],"bytes":[933,952]}},"KeyPath":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/KeyPath","kind":"field","type":"string","span":{"start":[51,1],"end":[51,20],"bytes":[913,932]}},"Password":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/Password","kind":"field","type":"string","span":{"start":[49,1],"end":[49,20],"bytes":[873,892]}},"Path":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[50,1],"end":[50,20],"bytes":[893,912]}},"User":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/User","kind":"field","type":"string","span":{"start":[48,1],"end":[48,20],"bytes":[853,872]}},"logger":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[44,1],"end":[44,25],"bytes":[782,806]}},"mu":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[41,1],"end":[41,23],"bytes":[710,732]}},"sftpClient":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/sftpClient","kind":"field","type":"invalid type","span":{"start":[43,1],"end":[43,25],"bytes":[757,781]}},"sshClient":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/sshClient","kind":"field","type":"invalid type","span":{"start":[42,1],"end":[42,24],"bytes":[733,756]}}}}},"functions":{"github.com/benbjohnson/litestream/sftp.NewReplicaClient":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","kind":"function","span":{"start":[61,1],"end":[67,2],"bytes":[1194,1436]},"signature":"github.com/benbjohnson/litestream/sftp.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/sftp.ReplicaClient","metrics":{"cyclomatic":1},"body":{"63:21":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient@63:21","span":{"start":[63,21],"end":[63,64],"bytes":[1279,1322]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"63:21/2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient@63:21/2","span":{"start":[63,21],"end":[63,35],"bytes":[1279,1293]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","kind":"function","span":{"start":[76,1],"end":[96,2],"bytes":[1739,2296]},"signature":"github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}},{"name":"host","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}},{"name":"urlPath","type":"string","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}},{"name":"query","type":"net/url.Values","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[76,1],"end":[76,137],"bytes":[1739,1875]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"77:12":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL@77:12","span":{"start":[77,12],"end":[77,30],"bytes":[1887,1905]},"callee":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient"},"81:17":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL@81:17","span":{"start":[81,17],"end":[81,36],"bytes":[1983,2002]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Username"},"82:24":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL@82:24","span":{"start":[82,24],"end":[82,43],"bytes":[2026,2045]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Password"},"89:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL@89:15","span":{"start":[89,15],"end":[89,63],"bytes":[2132,2180]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"92:15":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL@92:15","span":{"start":[92,15],"end":[92,63],"bytes":[2222,2270]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/sftp.init":{"id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.init","kind":"function","span":{"start":[25,1],"end":[27,2],"bytes":[291,380]},"signature":"github.com/benbjohnson/litestream/sftp.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"26:2":{"kind":"call","id":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.init@26:2","span":{"start":[26,2],"end":[26,74],"bytes":[306,378]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}}},"content_hash":"1070af36e0ce6ec261d4c0316e2632daf389405efc6ef1bff59537a1436ec4c5"},"store.go":{"id":"can://litestream/litestream/go/store.go","kind":"module","span":{"start":[1,1],"end":[959,1],"bytes":[0,26266]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/prometheus/client_golang/prometheus/promauto\"\n\t\"github.com/superfly/ltx\"\n\t\"golang.org/x/sync/errgroup\"\n)\n\nvar (\n\tvalidationChecksCounterVec = promauto.NewCounterVec(prometheus.CounterOpts{\n\t\tName: \"litestream_validation_checks_total\",\n\t\tHelp: \"Number of replica validation checks by result (success, invalid, or error).\",\n\t}, []string{\"db\", \"level\", \"result\"})\n\n\tlastValidationSuccessGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_last_validation_success\",\n\t\tHelp: \"Whether the last replica validation check succeeded (1) or failed (0). Zero before the first check completes.\",\n\t}, []string{\"db\", \"level\"})\n\n\tlastValidationSuccessTimestampGaugeVec = promauto.NewGaugeVec(prometheus.GaugeOpts{\n\t\tName: \"litestream_last_validation_success_timestamp_seconds\",\n\t\tHelp: \"Unix time of the last successful replica validation check. Zero until a check succeeds.\",\n\t}, []string{\"db\", \"level\"})\n)\n\nvar (\n\t// ErrNoCompaction is returned when no new files are available from the previous level.\n\tErrNoCompaction = errors.New(\"no compaction\")\n\n\t// ErrCompactionTooEarly is returned when a compaction is attempted too soon\n\t// since the last compaction time. This is used to prevent frequent\n\t// re-compaction when restarting the process.\n\tErrCompactionTooEarly = errors.New(\"compaction too early\")\n\n\t// ErrTxNotAvailable is returned when a transaction does not exist.\n\tErrTxNotAvailable = errors.New(\"transaction not available\")\n\n\t// ErrDBNotReady is a sentinel for errors.Is() compatibility.\n\tErrDBNotReady = \u0026DBNotReadyError{}\n\n\t// ErrShutdownInterrupted is returned when the shutdown sync retry loop\n\t// is interrupted by a done channel signal (e.g., second Ctrl+C).\n\tErrShutdownInterrupted = errors.New(\"shutdown sync interrupted\")\n\n\tErrDatabaseNotFound = errors.New(\"database not found\")\n\tErrDatabaseNotOpen = errors.New(\"database not open\")\n)\n\n// DBNotReadyError is returned when an operation is attempted before the\n// database has been initialized (e.g., page size not yet known).\ntype DBNotReadyError struct {\n\tReason string\n}\n\nfunc (e *DBNotReadyError) Error() string {\n\tif e.Reason != \"\" {\n\t\treturn \"db not ready: \" + e.Reason\n\t}\n\treturn \"db not ready\"\n}\n\nfunc (e *DBNotReadyError) Is(target error) bool {\n\t_, ok := target.(*DBNotReadyError)\n\treturn ok\n}\n\n// Store defaults\nconst (\n\tDefaultSnapshotInterval = 24 * time.Hour\n\tDefaultSnapshotRetention = 24 * time.Hour\n\n\tDefaultRetention = 24 * time.Hour\n\tDefaultRetentionCheckInterval = 1 * time.Hour\n\n\t// DefaultL0Retention is the default time that L0 files are kept around\n\t// after they have been compacted into L1 files.\n\tDefaultL0Retention = 5 * time.Minute\n\t// DefaultL0RetentionCheckInterval controls how frequently L0 retention is\n\t// enforced. This interval should be more frequent than the L1 compaction\n\t// interval so that VFS read replicas have time to observe new files.\n\tDefaultL0RetentionCheckInterval = 15 * time.Second\n\n\t// DefaultHeartbeatCheckInterval controls how frequently the heartbeat\n\t// monitor checks if heartbeat pings should be sent.\n\tDefaultHeartbeatCheckInterval = 15 * time.Second\n\n\t// DefaultDBInitTimeout is the maximum time to wait for a database to be\n\t// initialized (page size known) before logging a warning.\n\tDefaultDBInitTimeout = 30 * time.Second\n)\n\n// Store represents the top-level container for databases.\n//\n// It manages async background tasks like compactions so that the system\n// is not overloaded by too many concurrent tasks.\ntype Store struct {\n\tmu sync.Mutex\n\tdbs []*DB\n\tlevels CompactionLevels\n\n\twg sync.WaitGroup\n\tctx context.Context\n\tcancel func()\n\tdone \u003c-chan struct{}\n\n\t// The frequency of snapshots.\n\tSnapshotInterval time.Duration\n\t// The duration of time that snapshots are kept before being deleted.\n\tSnapshotRetention time.Duration\n\n\t// The duration that L0 files are kept after being compacted into L1.\n\tL0Retention time.Duration\n\t// How often to check for expired L0 files.\n\tL0RetentionCheckInterval time.Duration\n\n\t// If true, compaction is run in the background according to compaction levels.\n\tCompactionMonitorEnabled bool\n\n\t// If true, verify TXID consistency at destination level after each compaction.\n\tVerifyCompaction bool\n\n\t// RetentionEnabled controls whether Litestream actively deletes old files\n\t// during retention enforcement. When false, cloud provider lifecycle\n\t// policies handle retention instead. Local file cleanup still occurs.\n\tRetentionEnabled bool\n\n\t// Shutdown sync retry settings.\n\tShutdownSyncTimeout time.Duration\n\tShutdownSyncInterval time.Duration\n\n\t// How often to check if heartbeat pings should be sent.\n\tHeartbeatCheckInterval time.Duration\n\n\t// Heartbeat client for health check pings. Sends pings only when\n\t// all databases have synced successfully within the heartbeat interval.\n\tHeartbeat *HeartbeatClient\n\n\t// heartbeatMonitorRunning tracks whether the heartbeat monitor goroutine is running.\n\theartbeatMonitorRunning bool\n\n\t// How often to run validation checks. Zero disables periodic validation.\n\tValidationInterval time.Duration\n\n\tLogger *slog.Logger\n}\n\nfunc NewStore(dbs []*DB, levels CompactionLevels) *Store {\n\ts := \u0026Store{\n\t\tdbs: dbs,\n\t\tlevels: levels,\n\n\t\tSnapshotInterval: DefaultSnapshotInterval,\n\t\tSnapshotRetention: DefaultSnapshotRetention,\n\t\tL0Retention: DefaultL0Retention,\n\t\tL0RetentionCheckInterval: DefaultL0RetentionCheckInterval,\n\t\tCompactionMonitorEnabled: true,\n\t\tRetentionEnabled: true,\n\t\tShutdownSyncTimeout: DefaultShutdownSyncTimeout,\n\t\tShutdownSyncInterval: DefaultShutdownSyncInterval,\n\t\tHeartbeatCheckInterval: DefaultHeartbeatCheckInterval,\n\t\tLogger: slog.Default().With(LogKeySystem, LogSystemStore),\n\t}\n\n\tfor _, db := range dbs {\n\t\tdb.SetLogger(s.Logger.With(LogKeyDB, filepath.Base(db.Path())))\n\t\tdb.L0Retention = s.L0Retention\n\t\tdb.ShutdownSyncTimeout = s.ShutdownSyncTimeout\n\t\tdb.ShutdownSyncInterval = s.ShutdownSyncInterval\n\t\tdb.VerifyCompaction = s.VerifyCompaction\n\t\tdb.RetentionEnabled = s.RetentionEnabled\n\t}\n\ts.ctx, s.cancel = context.WithCancel(context.Background())\n\treturn s\n}\n\nfunc (s *Store) Open(ctx context.Context) error {\n\tif err := s.levels.Validate(); err != nil {\n\t\treturn err\n\t}\n\n\tinitGroup, initCtx := errgroup.WithContext(ctx)\n\tinitGroup.SetLimit(50)\n\tfor _, db := range s.dbs {\n\t\tdb := db\n\t\tinitGroup.Go(func() error {\n\t\t\tselect {\n\t\t\tcase \u003c-initCtx.Done():\n\t\t\t\treturn initCtx.Err()\n\t\t\tdefault:\n\t\t\t}\n\n\t\t\tif db.Replica != nil \u0026\u0026 db.Replica.Client != nil {\n\t\t\t\tif err := db.Replica.Client.Init(initCtx); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"initialize replica client for %q: %w\", db.Path(), err)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t}\n\tif err := initGroup.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\topenGroup, openCtx := errgroup.WithContext(ctx)\n\topenGroup.SetLimit(50)\n\tfor _, db := range s.dbs {\n\t\tdb := db\n\t\topenGroup.Go(func() error {\n\t\t\tselect {\n\t\t\tcase \u003c-openCtx.Done():\n\t\t\t\treturn openCtx.Err()\n\t\t\tdefault:\n\t\t\t}\n\t\t\treturn db.Open()\n\t\t})\n\t}\n\tif err := openGroup.Wait(); err != nil {\n\t\treturn err\n\t}\n\n\t// Start monitors for compactions \u0026 snapshots.\n\tif s.CompactionMonitorEnabled {\n\t\t// Start compaction monitors for all levels except L0.\n\t\tfor _, lvl := range s.levels {\n\t\t\tlvl := lvl\n\t\t\tif lvl.Level == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ts.wg.Add(1)\n\t\t\tgo func() {\n\t\t\t\tdefer s.wg.Done()\n\t\t\t\ts.monitorCompactionLevel(s.ctx, lvl)\n\t\t\t}()\n\t\t}\n\n\t\t// Start snapshot monitor for snapshots.\n\t\ts.wg.Add(1)\n\t\tgo func() {\n\t\t\tdefer s.wg.Done()\n\t\t\ts.monitorCompactionLevel(s.ctx, s.SnapshotLevel())\n\t\t}()\n\t}\n\n\tif s.L0Retention \u003e 0 \u0026\u0026 s.L0RetentionCheckInterval \u003e 0 {\n\t\ts.wg.Add(1)\n\t\tgo func() {\n\t\t\tdefer s.wg.Done()\n\t\t\ts.monitorL0Retention(s.ctx)\n\t\t}()\n\t}\n\n\t// Start heartbeat monitor if any database has heartbeat configured.\n\ts.startHeartbeatMonitorIfNeeded()\n\n\t// Start validation monitor if configured.\n\tif s.ValidationInterval \u003e 0 {\n\t\ts.wg.Add(1)\n\t\tgo func() {\n\t\t\tdefer s.wg.Done()\n\t\t\ts.monitorValidation(s.ctx)\n\t\t}()\n\t}\n\n\treturn nil\n}\n\nfunc (s *Store) Close(ctx context.Context) (err error) {\n\t// Stop the compaction, snapshot \u0026 retention monitors before closing the\n\t// databases so no snapshot is still reading a database's file handle.\n\ts.cancel()\n\ts.wg.Wait()\n\n\ts.mu.Lock()\n\tdbs := slices.Clone(s.dbs)\n\ts.mu.Unlock()\n\n\tfor _, db := range dbs {\n\t\tif e := db.Close(ctx); e != nil {\n\t\t\tif errors.Is(e, ErrShutdownInterrupted) {\n\t\t\t\tif err == nil {\n\t\t\t\t\terr = e\n\t\t\t\t}\n\t\t\t} else if err == nil || errors.Is(err, ErrShutdownInterrupted) {\n\t\t\t\terr = e\n\t\t\t}\n\t\t}\n\t}\n\n\treturn err\n}\n\nfunc (s *Store) DBs() []*DB {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\treturn slices.Clone(s.dbs)\n}\n\n// RegisterDB registers a new database with the store and starts monitoring it.\nfunc (s *Store) RegisterDB(db *DB) error {\n\tif db == nil {\n\t\treturn fmt.Errorf(\"db required\")\n\t}\n\n\t// First check: see if database already exists\n\ts.mu.Lock()\n\tfor _, existing := range s.dbs {\n\t\tif existing.Path() == db.Path() {\n\t\t\ts.mu.Unlock()\n\t\t\treturn nil\n\t\t}\n\t}\n\ts.mu.Unlock()\n\n\t// Apply store-wide settings before opening the database.\n\tdb.SetLogger(s.Logger.With(LogKeyDB, filepath.Base(db.Path())))\n\tdb.L0Retention = s.L0Retention\n\tdb.ShutdownSyncTimeout = s.ShutdownSyncTimeout\n\tdb.ShutdownSyncInterval = s.ShutdownSyncInterval\n\tdb.VerifyCompaction = s.VerifyCompaction\n\tdb.RetentionEnabled = s.RetentionEnabled\n\tdb.Done = s.done\n\n\t// Open the database without holding the lock to avoid blocking other operations.\n\t// The double-check pattern below handles the race condition.\n\tif err := db.Open(); err != nil {\n\t\treturn fmt.Errorf(\"open db: %w\", err)\n\t}\n\n\t// Second check: verify database wasn't added by another goroutine while we were opening.\n\t// If it was, close our instance and return without error.\n\ts.mu.Lock()\n\n\tfor _, existing := range s.dbs {\n\t\tif existing.Path() == db.Path() {\n\t\t\t// Another goroutine added this database while we were opening.\n\t\t\t// Release lock before closing to avoid potential deadlock.\n\t\t\ts.mu.Unlock()\n\t\t\tif err := db.Close(context.Background()); err != nil {\n\t\t\t\tdb.Logger.Error(\"close duplicate db\", \"path\", db.Path(), \"error\", err)\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\n\ts.dbs = append(s.dbs, db)\n\ts.mu.Unlock()\n\n\t// Start heartbeat monitor if heartbeat is configured and monitor isn't running.\n\ts.startHeartbeatMonitorIfNeeded()\n\n\treturn nil\n}\n\n// UnregisterDB stops monitoring the database at the provided path and closes it.\nfunc (s *Store) UnregisterDB(ctx context.Context, path string) error {\n\tif path == \"\" {\n\t\treturn fmt.Errorf(\"db path required\")\n\t}\n\n\ts.mu.Lock()\n\n\tidx := -1\n\tvar db *DB\n\tfor i, existing := range s.dbs {\n\t\tif existing.Path() == path {\n\t\t\tidx = i\n\t\t\tdb = existing\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif db == nil {\n\t\ts.mu.Unlock()\n\t\treturn nil\n\t}\n\n\ts.dbs = slices.Delete(s.dbs, idx, idx+1)\n\ts.mu.Unlock()\n\n\tif err := db.Close(ctx); err != nil {\n\t\treturn fmt.Errorf(\"close db: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// EnableDB starts replication for a registered database.\n// The context is checked for cancellation before opening.\n// Note: db.Open() itself does not support cancellation.\nfunc (s *Store) EnableDB(ctx context.Context, path string) error {\n\tdb := s.FindDB(path)\n\tif db == nil {\n\t\treturn fmt.Errorf(\"database not found: %s\", path)\n\t}\n\n\tif db.IsOpen() {\n\t\treturn fmt.Errorf(\"database already enabled: %s\", path)\n\t}\n\n\t// Check for cancellation before starting open\n\tif err := ctx.Err(); err != nil {\n\t\treturn fmt.Errorf(\"enable database: %w\", err)\n\t}\n\n\tif err := db.Open(); err != nil {\n\t\treturn fmt.Errorf(\"open database: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// DisableDB stops replication for a database.\nfunc (s *Store) DisableDB(ctx context.Context, path string) error {\n\tdb := s.FindDB(path)\n\tif db == nil {\n\t\treturn fmt.Errorf(\"database not found: %s\", path)\n\t}\n\n\tif !db.IsOpen() {\n\t\treturn fmt.Errorf(\"database already disabled: %s\", path)\n\t}\n\n\tif err := db.Close(ctx); err != nil {\n\t\treturn fmt.Errorf(\"close database: %w\", err)\n\t}\n\n\treturn nil\n}\n\n// SyncDBResult holds the result of a sync operation.\ntype SyncDBResult struct {\n\tTXID uint64\n\tReplicatedTXID uint64\n\tChanged bool\n}\n\n// SyncDB forces an immediate sync for a database. If wait is true, blocks\n// until both WAL-to-LTX and LTX-to-remote sync complete. If wait is false,\n// only performs the WAL-to-LTX sync and lets the replica monitor handle upload.\n// Lock waits are context-aware: the timeout is honored while waiting for\n// the database sync executor and the replica sync lock.\nfunc (s *Store) SyncDB(ctx context.Context, path string, wait bool) (SyncDBResult, error) {\n\tdb := s.FindDB(path)\n\tif db == nil {\n\t\treturn SyncDBResult{}, fmt.Errorf(\"%w: %s\", ErrDatabaseNotFound, path)\n\t}\n\n\tif !db.IsOpen() {\n\t\treturn SyncDBResult{}, fmt.Errorf(\"%w: %s\", ErrDatabaseNotOpen, path)\n\t}\n\n\t_, beforeTXID, err := db.MaxLTX()\n\tif err != nil {\n\t\treturn SyncDBResult{}, fmt.Errorf(\"read position before sync: %w\", err)\n\t}\n\n\tif wait {\n\t\tif err := db.SyncAndWait(ctx); err != nil {\n\t\t\treturn SyncDBResult{}, fmt.Errorf(\"sync database: %w\", err)\n\t\t}\n\t} else {\n\t\tif err := db.Sync(ctx); err != nil {\n\t\t\treturn SyncDBResult{}, fmt.Errorf(\"sync database: %w\", err)\n\t\t}\n\t}\n\n\t_, afterTXID, err := db.MaxLTX()\n\tif err != nil {\n\t\treturn SyncDBResult{}, fmt.Errorf(\"read position after sync: %w\", err)\n\t}\n\n\tvar replicatedTXID uint64\n\tif db.Replica != nil {\n\t\treplicatedTXID = uint64(db.Replica.Pos().TXID)\n\t}\n\n\treturn SyncDBResult{\n\t\tTXID: uint64(afterTXID),\n\t\tReplicatedTXID: replicatedTXID,\n\t\tChanged: afterTXID \u003e beforeTXID,\n\t}, nil\n}\n\n// FindDB returns the database with the given path.\nfunc (s *Store) FindDB(path string) *DB {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tfor _, db := range s.dbs {\n\t\tif db.Path() == path {\n\t\t\treturn db\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetL0Retention updates the retention window for L0 files and propagates it to\n// all managed databases.\nfunc (s *Store) SetL0Retention(d time.Duration) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.L0Retention = d\n\tfor _, db := range s.dbs {\n\t\tdb.L0Retention = d\n\t}\n}\n\n// SetDone sets the done channel used for interrupt handling during shutdown\n// and propagates it to all managed databases.\nfunc (s *Store) SetDone(done \u003c-chan struct{}) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.done = done\n\tfor _, db := range s.dbs {\n\t\tdb.Done = done\n\t}\n}\n\n// SetShutdownSyncTimeout updates the shutdown sync timeout and propagates it to\n// all managed databases.\nfunc (s *Store) SetShutdownSyncTimeout(d time.Duration) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.ShutdownSyncTimeout = d\n\tfor _, db := range s.dbs {\n\t\tdb.ShutdownSyncTimeout = d\n\t}\n}\n\n// SetShutdownSyncInterval updates the shutdown sync interval and propagates it to\n// all managed databases.\nfunc (s *Store) SetShutdownSyncInterval(d time.Duration) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.ShutdownSyncInterval = d\n\tfor _, db := range s.dbs {\n\t\tdb.ShutdownSyncInterval = d\n\t}\n}\n\n// SetVerifyCompaction updates the verify compaction flag and propagates it to\n// all managed databases.\nfunc (s *Store) SetVerifyCompaction(v bool) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.VerifyCompaction = v\n\tfor _, db := range s.dbs {\n\t\tdb.VerifyCompaction = v\n\t\tdb.compactor.VerifyCompaction = v\n\t}\n}\n\nfunc (s *Store) SetRetentionEnabled(v bool) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\ts.RetentionEnabled = v\n\tfor _, db := range s.dbs {\n\t\tdb.RetentionEnabled = v\n\t\tdb.compactor.RetentionEnabled = v\n\t}\n}\n\n// SnapshotLevel returns a pseudo compaction level based on snapshot settings.\nfunc (s *Store) SnapshotLevel() *CompactionLevel {\n\treturn \u0026CompactionLevel{\n\t\tLevel: SnapshotLevel,\n\t\tInterval: s.SnapshotInterval,\n\t}\n}\n\nfunc (s *Store) monitorCompactionLevel(ctx context.Context, lvl *CompactionLevel) {\n\ts.Logger.Info(\"starting compaction monitor\", \"level\", lvl.Level, \"interval\", lvl.Interval)\n\n\tretryDeadline := time.Time{}\n\ttimer := time.NewTimer(time.Nanosecond)\n\tdefer timer.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn\n\t\tcase \u003c-timer.C:\n\t\t\t// proceed\n\t\t}\n\n\t\tnow := time.Now()\n\t\tnextDelay := time.Until(lvl.NextCompactionAt(now))\n\n\t\tvar notReadyDBs []string\n\n\t\tfor _, db := range s.DBs() {\n\t\t\tif !db.IsOpen() {\n\t\t\t\tcontinue // skip disabled DBs\n\t\t\t}\n\t\t\t_, err := s.CompactDB(ctx, db, lvl)\n\t\t\tswitch {\n\t\t\tcase errors.Is(err, ErrNoCompaction), errors.Is(err, ErrCompactionTooEarly):\n\t\t\t\tdb.Logger.Debug(\"no compaction\", \"level\", lvl.Level, \"path\", db.Path())\n\t\t\tcase errors.Is(err, ErrDBNotReady):\n\t\t\t\tdb.Logger.Debug(\"db not ready, skipping\", \"level\", lvl.Level, \"path\", db.Path(), \"error\", err)\n\t\t\t\tnotReadyDBs = append(notReadyDBs, db.Path())\n\t\t\tcase err != nil \u0026\u0026 !isShutdownError(ctx, err):\n\t\t\t\tdb.Logger.Error(\"compaction failed\", \"level\", lvl.Level, \"error\", err)\n\t\t\t}\n\n\t\t\tif lvl.Level == SnapshotLevel {\n\t\t\t\tif err := s.EnforceSnapshotRetention(ctx, db); err != nil \u0026\u0026 !isShutdownError(ctx, err) {\n\t\t\t\t\tdb.Logger.Error(\"retention enforcement failed\", \"error\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttimedOut := !retryDeadline.IsZero() \u0026\u0026 now.After(retryDeadline)\n\t\tif len(notReadyDBs) \u003e 0 \u0026\u0026 !timedOut {\n\t\t\tif retryDeadline.IsZero() {\n\t\t\t\tretryDeadline = now.Add(DefaultDBInitTimeout)\n\t\t\t}\n\t\t\tnextDelay = time.Second\n\t\t\ts.Logger.Debug(\"scheduling retry for unready dbs\", \"level\", lvl.Level)\n\t\t} else {\n\t\t\tif timedOut {\n\t\t\t\ts.Logger.Warn(\"timeout waiting for db initialization\",\n\t\t\t\t\t\"level\", lvl.Level,\n\t\t\t\t\t\"dbs\", notReadyDBs,\n\t\t\t\t\t\"timeout\", DefaultDBInitTimeout,\n\t\t\t\t\t\"hint\", \"database may have corrupted local state or blocked transactions; try removing -litestream directory and restarting\")\n\t\t\t}\n\t\t\tretryDeadline = time.Time{}\n\t\t}\n\n\t\tif nextDelay \u003c 0 {\n\t\t\tnextDelay = 0\n\t\t}\n\t\ttimer.Reset(nextDelay)\n\t}\n}\n\nfunc (s *Store) monitorL0Retention(ctx context.Context) {\n\ts.Logger.Info(\"starting L0 retention monitor\", \"interval\", s.L0RetentionCheckInterval, \"retention\", s.L0Retention)\n\n\tticker := time.NewTicker(s.L0RetentionCheckInterval)\n\tdefer ticker.Stop()\n\nLOOP:\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\tbreak LOOP\n\t\tcase \u003c-ticker.C:\n\t\t}\n\n\t\tfor _, db := range s.DBs() {\n\t\t\tif !db.IsOpen() {\n\t\t\t\tcontinue // skip disabled DBs\n\t\t\t}\n\t\t\tif err := db.EnforceL0RetentionByTime(ctx); err != nil {\n\t\t\t\tif isShutdownError(ctx, err) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tdb.Logger.Error(\"l0 retention enforcement failed\", \"path\", db.Path(), \"error\", err)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// startHeartbeatMonitorIfNeeded starts the heartbeat monitor goroutine if:\n// - HeartbeatCheckInterval is configured\n// - Heartbeat is configured on the Store\n// - The monitor is not already running\nfunc (s *Store) startHeartbeatMonitorIfNeeded() {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\tif s.heartbeatMonitorRunning {\n\t\treturn\n\t}\n\tif s.HeartbeatCheckInterval \u003c= 0 {\n\t\treturn\n\t}\n\tif !s.hasHeartbeatConfigLocked() {\n\t\treturn\n\t}\n\n\ts.heartbeatMonitorRunning = true\n\ts.wg.Add(1)\n\tgo func() {\n\t\tdefer s.wg.Done()\n\t\ts.monitorHeartbeats(s.ctx)\n\t}()\n}\n\n// hasHeartbeatConfigLocked returns true if heartbeat is configured on the Store.\n// Must be called with s.mu held.\nfunc (s *Store) hasHeartbeatConfigLocked() bool {\n\treturn s.Heartbeat != nil \u0026\u0026 s.Heartbeat.URL != \"\"\n}\n\n// monitorHeartbeats periodically checks if heartbeat pings should be sent.\n// Heartbeat pings are only sent when ALL databases have synced successfully\n// within the heartbeat interval.\nfunc (s *Store) monitorHeartbeats(ctx context.Context) {\n\ts.Logger.Info(\"starting heartbeat monitor\", \"interval\", s.HeartbeatCheckInterval)\n\n\tticker := time.NewTicker(s.HeartbeatCheckInterval)\n\tdefer ticker.Stop()\n\nLOOP:\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\tbreak LOOP\n\t\tcase \u003c-ticker.C:\n\t\t}\n\n\t\ts.sendHeartbeatIfNeeded(ctx)\n\t}\n}\n\n// sendHeartbeatIfNeeded sends a heartbeat ping if:\n// - Heartbeat is configured on the Store\n// - Enough time has passed since the last ping attempt\n// - ALL databases have synced successfully within the heartbeat interval\nfunc (s *Store) sendHeartbeatIfNeeded(ctx context.Context) {\n\thb := s.Heartbeat\n\tif hb == nil || hb.URL == \"\" {\n\t\treturn\n\t}\n\n\tif !hb.ShouldPing() {\n\t\treturn\n\t}\n\n\t// Check if all databases are healthy (synced within the heartbeat interval).\n\t// A database is healthy if it synced within the heartbeat interval.\n\thealthySince := time.Now().Add(-hb.Interval)\n\tif !s.allDatabasesHealthy(healthySince) {\n\t\treturn\n\t}\n\n\t// Record ping attempt time before making the request to ensure we respect\n\t// the configured interval even if the ping fails. This prevents rapid\n\t// retries that could overwhelm the endpoint.\n\thb.RecordPing()\n\n\tif err := hb.Ping(ctx); err != nil {\n\t\ts.Logger.Error(\"heartbeat ping failed\", \"url\", hb.URL, \"error\", err)\n\t\treturn\n\t}\n\n\ts.Logger.Debug(\"heartbeat ping sent\", \"url\", hb.URL)\n}\n\n// allDatabasesHealthy returns true if all databases have synced successfully\n// since the given time. Returns false if there are no databases or no enabled databases.\nfunc (s *Store) allDatabasesHealthy(since time.Time) bool {\n\tdbs := s.DBs()\n\tif len(dbs) == 0 {\n\t\treturn false\n\t}\n\n\tenabledCount := 0\n\tfor _, db := range dbs {\n\t\tif !db.IsOpen() {\n\t\t\tcontinue // skip disabled DBs\n\t\t}\n\t\tenabledCount++\n\t\tlastSync := db.LastSuccessfulSyncAt()\n\t\tif lastSync.IsZero() || lastSync.Before(since) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn enabledCount \u003e 0\n}\n\n// CompactDB performs a compaction or snapshot for a given database on a single destination level.\n// This function will only proceed if a compaction has not occurred before the last compaction time.\nfunc (s *Store) CompactDB(ctx context.Context, db *DB, lvl *CompactionLevel) (*ltx.FileInfo, error) {\n\t// Skip if database is not yet initialized (page size unknown).\n\tif db.PageSize() == 0 {\n\t\treturn nil, \u0026DBNotReadyError{Reason: \"page size not initialized\"}\n\t}\n\n\tdstLevel := lvl.Level\n\n\t// Ensure we are not re-compacting before the most recent compaction time.\n\tprevCompactionAt := lvl.PrevCompactionAt(time.Now())\n\tdstInfo, err := db.MaxLTXFileInfo(ctx, dstLevel)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fetch dst level info: %w\", err)\n\t} else if dstInfo.CreatedAt.After(prevCompactionAt) {\n\t\treturn nil, ErrCompactionTooEarly\n\t}\n\n\t// Shortcut if this is a snapshot since we are not pulling from a previous level.\n\tif dstLevel == SnapshotLevel {\n\t\tpos, err := db.Pos()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"fetch db position: %w\", err)\n\t\t}\n\t\tif dstInfo.MaxTXID != 0 \u0026\u0026 dstInfo.MaxTXID \u003e= pos.TXID {\n\t\t\treturn nil, ErrNoCompaction\n\t\t}\n\n\t\tinfo, err := db.Snapshot(ctx)\n\t\tif err != nil {\n\t\t\treturn info, err\n\t\t}\n\t\tdb.Logger.InfoContext(ctx, \"snapshot complete\", \"txid\", info.MaxTXID.String(), \"size\", info.Size)\n\t\treturn info, nil\n\t}\n\n\t// Fetch latest LTX files for both the source \u0026 destination so we can see if we need to make progress.\n\tsrcLevel := s.levels.PrevLevel(dstLevel)\n\tsrcInfo, err := db.MaxLTXFileInfo(ctx, srcLevel)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fetch src level info: %w\", err)\n\t}\n\n\t// Skip if there are no new files to compact.\n\tif srcInfo.MaxTXID \u003c= dstInfo.MaxTXID {\n\t\treturn nil, ErrNoCompaction\n\t}\n\n\tinfo, err := db.Compact(ctx, dstLevel)\n\tif err != nil {\n\t\treturn info, err\n\t}\n\n\tdb.Logger.InfoContext(ctx, \"compaction complete\",\n\t\t\"level\", dstLevel,\n\t\tslog.Group(\"txid\",\n\t\t\t\"min\", info.MinTXID.String(),\n\t\t\t\"max\", info.MaxTXID.String(),\n\t\t),\n\t\t\"size\", info.Size,\n\t)\n\n\treturn info, nil\n}\n\n// EnforceSnapshotRetention removes old snapshots by timestamp and then\n// cleans up all lower levels based on minimum snapshot TXID.\nfunc (s *Store) EnforceSnapshotRetention(ctx context.Context, db *DB) error {\n\t// Enforce retention for the snapshot level.\n\tminSnapshotTXID, err := db.EnforceSnapshotRetention(ctx, time.Now().Add(-s.SnapshotRetention))\n\tif err != nil {\n\t\treturn fmt.Errorf(\"enforce snapshot retention: %w\", err)\n\t}\n\n\t// We should also enforce retention for L0 on the same schedule as L1.\n\tfor _, lvl := range s.levels {\n\t\t// Skip L0 since it is enforced on a more frequent basis.\n\t\tif lvl.Level == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := db.EnforceRetentionByTXID(ctx, lvl.Level, minSnapshotTXID); err != nil {\n\t\t\treturn fmt.Errorf(\"enforce L%d retention: %w\", lvl.Level, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// ValidationResult holds the result of validating a replica's LTX files.\ntype ValidationResult struct {\n\tValid bool // true if no errors found\n\tErrors []ValidationError // all errors found\n}\n\n// Validate checks LTX file consistency across all databases and levels.\n// SnapshotLevel (9) is excluded since snapshots are not contiguous.\nfunc (s *Store) Validate(ctx context.Context) (*ValidationResult, error) {\n\tresult := \u0026ValidationResult{Valid: true}\n\n\ts.mu.Lock()\n\tdbs := s.dbs\n\tlevels := s.levels\n\ts.mu.Unlock()\n\n\tfor _, db := range dbs {\n\t\tif db.Replica == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, lvl := range levels {\n\t\t\tlevel := strconv.Itoa(lvl.Level)\n\t\t\tlastSuccess := lastValidationSuccessTimestampGaugeVec.WithLabelValues(db.Path(), level)\n\t\t\tsuccess := lastValidationSuccessGaugeVec.WithLabelValues(db.Path(), level)\n\t\t\terrs, err := db.Replica.ValidateLevel(ctx, lvl.Level)\n\t\t\tif err != nil {\n\t\t\t\tvalidationChecksCounterVec.WithLabelValues(db.Path(), level, \"error\").Inc()\n\t\t\t\tsuccess.Set(0)\n\t\t\t\treturn nil, fmt.Errorf(\"validate level %d for %s: %w\", lvl.Level, db.Path(), err)\n\t\t\t}\n\t\t\tif len(errs) \u003e 0 {\n\t\t\t\tvalidationChecksCounterVec.WithLabelValues(db.Path(), level, \"invalid\").Inc()\n\t\t\t\tsuccess.Set(0)\n\t\t\t\tresult.Valid = false\n\t\t\t\tresult.Errors = append(result.Errors, errs...)\n\t\t\t} else {\n\t\t\t\tvalidationChecksCounterVec.WithLabelValues(db.Path(), level, \"success\").Inc()\n\t\t\t\tsuccess.Set(1)\n\t\t\t\tlastSuccess.SetToCurrentTime()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result, nil\n}\n\n// monitorValidation periodically runs validation checks on all databases.\nfunc (s *Store) monitorValidation(ctx context.Context) {\n\ts.Logger.Info(\"starting validation monitor\", \"interval\", s.ValidationInterval)\n\n\tticker := time.NewTicker(s.ValidationInterval)\n\tdefer ticker.Stop()\n\nLOOP:\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\tbreak LOOP\n\t\tcase \u003c-ticker.C:\n\t\t}\n\n\t\tresult, err := s.Validate(ctx)\n\t\tif err != nil {\n\t\t\tif isShutdownError(ctx, err) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts.Logger.Error(\"validation check failed\", \"error\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\tif !result.Valid {\n\t\t\tfor _, verr := range result.Errors {\n\t\t\t\ts.Logger.Warn(\"validation error detected\",\n\t\t\t\t\t\"level\", verr.Level,\n\t\t\t\t\t\"type\", verr.Type,\n\t\t\t\t\t\"message\", verr.Message,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"errors","path":"errors","span":{"start":[5,1],"end":[5,10],"bytes":[40,49]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[50,56]}},{"name":"slog","path":"log/slog","span":{"start":[7,1],"end":[7,12],"bytes":[57,68]}},{"name":"filepath","path":"path/filepath","span":{"start":[8,1],"end":[8,17],"bytes":[69,85]}},{"name":"slices","path":"slices","span":{"start":[9,1],"end":[9,10],"bytes":[86,95]}},{"name":"strconv","path":"strconv","span":{"start":[10,1],"end":[10,11],"bytes":[96,106]}},{"name":"sync","path":"sync","span":{"start":[11,1],"end":[11,8],"bytes":[107,114]}},{"name":"time","path":"time","span":{"start":[12,1],"end":[12,8],"bytes":[115,122]}},{"name":"prometheus","path":"github.com/prometheus/client_golang/prometheus","span":{"start":[14,1],"end":[14,50],"bytes":[124,173]}},{"name":"promauto","path":"github.com/prometheus/client_golang/prometheus/promauto","span":{"start":[15,1],"end":[15,59],"bytes":[174,232]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[16,1],"end":[16,27],"bytes":[233,259]}},{"name":"errgroup","path":"golang.org/x/sync/errgroup","span":{"start":[17,1],"end":[17,30],"bytes":[260,289]}}],"types":{"DBNotReadyError":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.DBNotReadyError","kind":"struct","span":{"start":[62,1],"end":[64,2],"bytes":[2191,2237]},"callables":{"github.com/benbjohnson/litestream.DBNotReadyError.Error":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.DBNotReadyError/github.com/benbjohnson/litestream.DBNotReadyError.Error","kind":"method","span":{"start":[66,1],"end":[71,2],"bytes":[2239,2367]},"signature":"github.com/benbjohnson/litestream.DBNotReadyError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{}},"github.com/benbjohnson/litestream.DBNotReadyError.Is":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.DBNotReadyError/github.com/benbjohnson/litestream.DBNotReadyError.Is","kind":"method","span":{"start":[73,1],"end":[76,2],"bytes":[2369,2467]},"signature":"github.com/benbjohnson/litestream.DBNotReadyError.Is","parameters":[{"name":"target","type":"error","span":{"start":[73,1],"end":[73,50],"bytes":[2369,2418]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{}}},"fields":{"Reason":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.DBNotReadyError/Reason","kind":"field","type":"string","span":{"start":[63,1],"end":[63,15],"bytes":[2221,2235]}}}},"Store":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store","kind":"struct","span":{"start":[107,1],"end":[156,2],"bytes":[3655,5259]},"callables":{"github.com/benbjohnson/litestream.Store.Close":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","kind":"method","span":{"start":[279,1],"end":[302,2],"bytes":[8144,8682]},"signature":"github.com/benbjohnson/litestream.Store.Close","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[279,1],"end":[279,57],"bytes":[8144,8200]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"282:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close@282:2","span":{"start":[282,2],"end":[282,12],"bytes":[8348,8358]},"callee":null},"283:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close@283:2","span":{"start":[283,2],"end":[283,13],"bytes":[8360,8371]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Wait"},"285:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close@285:2","span":{"start":[285,2],"end":[285,13],"bytes":[8374,8385]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"286:9":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close@286:9","span":{"start":[286,9],"end":[286,28],"bytes":[8394,8413]},"callee":"can://litestream/litestream/@external/slices/Clone"},"287:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close@287:2","span":{"start":[287,2],"end":[287,15],"bytes":[8415,8428]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"290:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close@290:11","span":{"start":[290,11],"end":[290,24],"bytes":[8466,8479]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"291:7":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close@291:7","span":{"start":[291,7],"end":[291,43],"bytes":[8498,8534]},"callee":"can://litestream/litestream/@external/errors/Is"},"295:28":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close@295:28","span":{"start":[295,28],"end":[295,66],"bytes":[8603,8641]},"callee":"can://litestream/litestream/@external/errors/Is"}}},"github.com/benbjohnson/litestream.Store.CompactDB":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","kind":"method","span":{"start":[789,1],"end":[851,2],"bytes":[21386,23217]},"signature":"github.com/benbjohnson/litestream.Store.CompactDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[789,1],"end":[789,102],"bytes":[21386,21487]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[789,1],"end":[789,102],"bytes":[21386,21487]}},{"name":"lvl","type":"*github.com/benbjohnson/litestream.CompactionLevel","span":{"start":[789,1],"end":[789,102],"bytes":[21386,21487]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":11},"body":{"791:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@791:5","span":{"start":[791,5],"end":[791,18],"bytes":[21557,21570]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize"},"798:22":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@798:22","span":{"start":[798,22],"end":[798,54],"bytes":[21771,21803]},"callee":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt"},"798:43":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@798:43","span":{"start":[798,43],"end":[798,53],"bytes":[21792,21802]},"callee":"can://litestream/litestream/@external/time/Now"},"799:18":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@799:18","span":{"start":[799,18],"end":[799,50],"bytes":[21821,21853]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo"},"801:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@801:15","span":{"start":[801,15],"end":[801,58],"bytes":[21885,21928]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"802:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@802:12","span":{"start":[802,12],"end":[802,53],"bytes":[21940,21981]},"callee":null},"808:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@808:15","span":{"start":[808,15],"end":[808,23],"bytes":[22153,22161]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos"},"810:16":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@810:16","span":{"start":[810,16],"end":[810,56],"bytes":[22195,22235]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"816:16":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@816:16","span":{"start":[816,16],"end":[816,32],"bytes":[22350,22366]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot"},"820:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@820:3","span":{"start":[820,3],"end":[820,100],"bytes":[22411,22508]},"callee":"can://litestream/litestream/@external/log/slog/Logger.InfoContext"},"820:59":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@820:59","span":{"start":[820,59],"end":[820,80],"bytes":[22467,22488]},"callee":null},"825:14":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@825:14","span":{"start":[825,14],"end":[825,42],"bytes":[22649,22677]},"callee":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel"},"826:18":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@826:18","span":{"start":[826,18],"end":[826,50],"bytes":[22695,22727]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo"},"828:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@828:15","span":{"start":[828,15],"end":[828,58],"bytes":[22759,22802]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"836:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@836:15","span":{"start":[836,15],"end":[836,40],"bytes":[22943,22968]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact"},"841:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@841:2","span":{"start":[841,2],"end":[848,3],"bytes":[23010,23196]},"callee":"can://litestream/litestream/@external/log/slog/Logger.InfoContext"},"843:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@843:3","span":{"start":[843,3],"end":[846,4],"bytes":[23083,23171]},"callee":"can://litestream/litestream/@external/log/slog/Group"},"844:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@844:11","span":{"start":[844,11],"end":[844,32],"bytes":[23112,23133]},"callee":null},"845:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB@845:11","span":{"start":[845,11],"end":[845,32],"bytes":[23145,23166]},"callee":null}}},"github.com/benbjohnson/litestream.Store.DBs":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","kind":"method","span":{"start":[304,1],"end":[308,2],"bytes":[8684,8777]},"signature":"github.com/benbjohnson/litestream.Store.DBs","parameters":[],"return_type":"[]*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":1},"body":{"305:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs@305:2","span":{"start":[305,2],"end":[305,13],"bytes":[8715,8726]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"306:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs@306:8","span":{"start":[306,8],"end":[306,21],"bytes":[8734,8747]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"307:9":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs@307:9","span":{"start":[307,9],"end":[307,28],"bytes":[8756,8775]},"callee":"can://litestream/litestream/@external/slices/Clone"}}},"github.com/benbjohnson/litestream.Store.DisableDB":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","kind":"method","span":{"start":[425,1],"end":[440,2],"bytes":[11706,12053]},"signature":"github.com/benbjohnson/litestream.Store.DisableDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[425,1],"end":[425,68],"bytes":[11706,11773]}},{"name":"path","type":"string","span":{"start":[425,1],"end":[425,68],"bytes":[11706,11773]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"426:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB@426:8","span":{"start":[426,8],"end":[426,22],"bytes":[11781,11795]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"428:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB@428:10","span":{"start":[428,10],"end":[428,52],"bytes":[11821,11863]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"431:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB@431:6","span":{"start":[431,6],"end":[431,17],"bytes":[11873,11884]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"432:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB@432:10","span":{"start":[432,10],"end":[432,59],"bytes":[11896,11945]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"435:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB@435:12","span":{"start":[435,12],"end":[435,25],"bytes":[11961,11974]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"436:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB@436:10","span":{"start":[436,10],"end":[436,47],"bytes":[11998,12035]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.Store.EnableDB":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","kind":"method","span":{"start":[402,1],"end":[422,2],"bytes":[11183,11657]},"signature":"github.com/benbjohnson/litestream.Store.EnableDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[402,1],"end":[402,67],"bytes":[11183,11249]}},{"name":"path","type":"string","span":{"start":[402,1],"end":[402,67],"bytes":[11183,11249]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"403:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB@403:8","span":{"start":[403,8],"end":[403,22],"bytes":[11257,11271]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"405:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB@405:10","span":{"start":[405,10],"end":[405,52],"bytes":[11297,11339]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"408:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB@408:5","span":{"start":[408,5],"end":[408,16],"bytes":[11348,11359]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"409:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB@409:10","span":{"start":[409,10],"end":[409,58],"bytes":[11371,11419]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"413:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB@413:12","span":{"start":[413,12],"end":[413,21],"bytes":[11483,11492]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"414:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB@414:10","span":{"start":[414,10],"end":[414,48],"bytes":[11516,11554]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"417:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB@417:12","span":{"start":[417,12],"end":[417,21],"bytes":[11570,11579]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open"},"418:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB@418:10","span":{"start":[418,10],"end":[418,46],"bytes":[11603,11639]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","kind":"method","span":{"start":[855,1],"end":[875,2],"bytes":[23353,24028]},"signature":"github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[855,1],"end":[855,78],"bytes":[23353,23430]}},{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[855,1],"end":[855,78],"bytes":[23353,23430]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"857:26":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention@857:26","span":{"start":[857,26],"end":[857,96],"bytes":[23502,23572]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention"},"857:59":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention@857:59","span":{"start":[857,59],"end":[857,95],"bytes":[23535,23571]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"857:59/2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention@857:59/2","span":{"start":[857,59],"end":[857,69],"bytes":[23535,23545]},"callee":"can://litestream/litestream/@external/time/Now"},"859:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention@859:10","span":{"start":[859,10],"end":[859,59],"bytes":[23599,23648]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"869:13":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention@869:13","span":{"start":[869,13],"end":[869,71],"bytes":[23868,23926]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID"},"870:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention@870:11","span":{"start":[870,11],"end":[870,66],"bytes":[23951,24006]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.Store.FindDB":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","kind":"method","span":{"start":[497,1],"end":[507,2],"bytes":[13675,13838]},"signature":"github.com/benbjohnson/litestream.Store.FindDB","parameters":[{"name":"path","type":"string","span":{"start":[497,1],"end":[497,42],"bytes":[13675,13716]}}],"return_type":"*github.com/benbjohnson/litestream.DB","metrics":{"cyclomatic":3},"body":{"498:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB@498:2","span":{"start":[498,2],"end":[498,13],"bytes":[13718,13729]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"499:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB@499:8","span":{"start":[499,8],"end":[499,21],"bytes":[13737,13750]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"502:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB@502:6","span":{"start":[502,6],"end":[502,15],"bytes":[13785,13794]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream.Store.Open":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","kind":"method","span":{"start":[187,1],"end":[277,2],"bytes":[6294,8142]},"signature":"github.com/benbjohnson/litestream.Store.Open","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[187,1],"end":[187,50],"bytes":[6294,6343]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":19},"body":{"188:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@188:12","span":{"start":[188,12],"end":[188,31],"bytes":[6355,6374]},"callee":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate"},"192:24":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@192:24","span":{"start":[192,24],"end":[192,49],"bytes":[6429,6454]},"callee":null},"193:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@193:2","span":{"start":[193,2],"end":[193,24],"bytes":[6456,6478]},"callee":null},"196:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@196:3","span":{"start":[196,3],"end":[209,5],"bytes":[6520,6851]},"callee":null},"211:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@211:12","span":{"start":[211,12],"end":[211,28],"bytes":[6866,6882]},"callee":null},"215:24":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@215:24","span":{"start":[215,24],"end":[215,49],"bytes":[6937,6962]},"callee":null},"216:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@216:2","span":{"start":[216,2],"end":[216,24],"bytes":[6964,6986]},"callee":null},"219:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@219:3","span":{"start":[219,3],"end":[226,5],"bytes":[7028,7160]},"callee":null},"228:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@228:12","span":{"start":[228,12],"end":[228,28],"bytes":[7175,7191]},"callee":null},"241:4":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@241:4","span":{"start":[241,4],"end":[241,15],"bytes":[7453,7464]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"242:7":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@242:7","span":{"start":[242,7],"end":[245,7],"bytes":[7471,7549]},"callee":null,"is_goroutine":true},"249:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@249:3","span":{"start":[249,3],"end":[249,14],"bytes":[7600,7611]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"250:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@250:6","span":{"start":[250,6],"end":[253,6],"bytes":[7617,7706]},"callee":null,"is_goroutine":true},"257:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@257:3","span":{"start":[257,3],"end":[257,14],"bytes":[7771,7782]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"258:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@258:6","span":{"start":[258,6],"end":[261,6],"bytes":[7788,7854]},"callee":null,"is_goroutine":true},"265:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@265:2","span":{"start":[265,2],"end":[265,35],"bytes":[7930,7963]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded"},"269:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@269:3","span":{"start":[269,3],"end":[269,14],"bytes":[8042,8053]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"270:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open@270:6","span":{"start":[270,6],"end":[273,6],"bytes":[8059,8124]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1","kind":"function","span":{"start":[196,1],"end":[209,5],"bytes":[6518,6851]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_1","parameters":[],"return_type":"error","error_channel":["error"],"body":{"198:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1@198:11","span":{"start":[198,11],"end":[198,25],"bytes":[6570,6584]},"callee":null},"199:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1@199:12","span":{"start":[199,12],"end":[199,25],"bytes":[6597,6610]},"callee":null},"204:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1@204:15","span":{"start":[204,15],"end":[204,46],"bytes":[6697,6728]},"callee":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Init"},"205:13":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1@205:13","span":{"start":[205,13],"end":[205,79],"bytes":[6755,6821]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"205:64":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1@205:64","span":{"start":[205,64],"end":[205,73],"bytes":[6806,6815]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"closure_2":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_2","kind":"function","span":{"start":[219,1],"end":[226,5],"bytes":[7026,7160]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_2","parameters":[],"return_type":"error","error_channel":["error"],"body":{"221:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_2@221:11","span":{"start":[221,11],"end":[221,25],"bytes":[7078,7092]},"callee":null},"222:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_2@222:12","span":{"start":[222,12],"end":[222,25],"bytes":[7105,7118]},"callee":null},"225:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_2@225:11","span":{"start":[225,11],"end":[225,20],"bytes":[7146,7155]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open"}}},"closure_3":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_3","kind":"function","span":{"start":[242,1],"end":[245,7],"bytes":[7465,7549]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_3","parameters":[],"body":{"243:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_3@243:11","span":{"start":[243,11],"end":[243,22],"bytes":[7490,7501]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"244:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_3@244:5","span":{"start":[244,5],"end":[244,41],"bytes":[7506,7542]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel"}}},"closure_4":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_4","kind":"function","span":{"start":[250,1],"end":[253,6],"bytes":[7612,7706]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_4","parameters":[],"body":{"251:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_4@251:10","span":{"start":[251,10],"end":[251,21],"bytes":[7635,7646]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"252:36":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_4@252:36","span":{"start":[252,36],"end":[252,53],"bytes":[7682,7699]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SnapshotLevel"},"252:4":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_4@252:4","span":{"start":[252,4],"end":[252,54],"bytes":[7650,7700]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel"}}},"closure_5":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_5","kind":"function","span":{"start":[258,1],"end":[261,6],"bytes":[7783,7854]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_5","parameters":[],"body":{"259:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_5@259:10","span":{"start":[259,10],"end":[259,21],"bytes":[7806,7817]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"260:4":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_5@260:4","span":{"start":[260,4],"end":[260,31],"bytes":[7821,7848]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention"}}},"closure_6":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_6","kind":"function","span":{"start":[270,1],"end":[273,6],"bytes":[8054,8124]},"signature":"github.com/benbjohnson/litestream.Store.Open.closure_6","parameters":[],"body":{"271:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_6@271:10","span":{"start":[271,10],"end":[271,21],"bytes":[8077,8088]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"272:4":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_6@272:4","span":{"start":[272,4],"end":[272,30],"bytes":[8092,8118]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation"}}}}},"github.com/benbjohnson/litestream.Store.RegisterDB":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","kind":"method","span":{"start":[311,1],"end":[364,2],"bytes":[8859,10440]},"signature":"github.com/benbjohnson/litestream.Store.RegisterDB","parameters":[{"name":"db","type":"*github.com/benbjohnson/litestream.DB","span":{"start":[311,1],"end":[311,43],"bytes":[8859,8901]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"313:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@313:10","span":{"start":[313,10],"end":[313,35],"bytes":[8927,8952]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"317:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@317:2","span":{"start":[317,2],"end":[317,13],"bytes":[9006,9017]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"319:25":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@319:25","span":{"start":[319,25],"end":[319,34],"bytes":[9076,9085]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"319:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@319:6","span":{"start":[319,6],"end":[319,21],"bytes":[9057,9072]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"320:4":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@320:4","span":{"start":[320,4],"end":[320,17],"bytes":[9091,9104]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"324:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@324:2","span":{"start":[324,2],"end":[324,15],"bytes":[9127,9140]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"327:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@327:15","span":{"start":[327,15],"end":[327,64],"bytes":[9215,9264]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"327:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@327:2","span":{"start":[327,2],"end":[327,65],"bytes":[9202,9265]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger"},"327:39":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@327:39","span":{"start":[327,39],"end":[327,63],"bytes":[9239,9263]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"327:53":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@327:53","span":{"start":[327,53],"end":[327,62],"bytes":[9253,9262]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"337:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@337:12","span":{"start":[337,12],"end":[337,21],"bytes":[9656,9665]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open"},"338:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@338:10","span":{"start":[338,10],"end":[338,40],"bytes":[9689,9719]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"343:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@343:2","span":{"start":[343,2],"end":[343,13],"bytes":[9876,9887]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"346:25":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@346:25","span":{"start":[346,25],"end":[346,34],"bytes":[9947,9956]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"346:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@346:6","span":{"start":[346,6],"end":[346,21],"bytes":[9928,9943]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"349:4":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@349:4","span":{"start":[349,4],"end":[349,17],"bytes":[10092,10105]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"350:14":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@350:14","span":{"start":[350,14],"end":[350,44],"bytes":[10119,10149]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"350:23":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@350:23","span":{"start":[350,23],"end":[350,43],"bytes":[10128,10148]},"callee":"can://litestream/litestream/@external/context/Background"},"351:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@351:5","span":{"start":[351,5],"end":[351,75],"bytes":[10168,10238]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"351:51":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@351:51","span":{"start":[351,51],"end":[351,60],"bytes":[10214,10223]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"357:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@357:10","span":{"start":[357,10],"end":[357,27],"bytes":[10275,10292]},"callee":null},"358:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@358:2","span":{"start":[358,2],"end":[358,15],"bytes":[10294,10307]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"361:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB@361:2","span":{"start":[361,2],"end":[361,35],"bytes":[10392,10425]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded"}}},"github.com/benbjohnson/litestream.Store.SetDone":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone","kind":"method","span":{"start":[522,1],"end":[529,2],"bytes":[14229,14375]},"signature":"github.com/benbjohnson/litestream.Store.SetDone","parameters":[{"name":"done","type":"\u003c-chan struct{}","span":{"start":[522,1],"end":[522,48],"bytes":[14229,14276]}}],"metrics":{"cyclomatic":2},"body":{"523:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone@523:2","span":{"start":[523,2],"end":[523,13],"bytes":[14278,14289]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"524:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone@524:8","span":{"start":[524,8],"end":[524,21],"bytes":[14297,14310]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.Store.SetL0Retention":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention","kind":"method","span":{"start":[511,1],"end":[518,2],"bytes":[13947,14103]},"signature":"github.com/benbjohnson/litestream.Store.SetL0Retention","parameters":[{"name":"d","type":"time.Duration","span":{"start":[511,1],"end":[511,50],"bytes":[13947,13996]}}],"metrics":{"cyclomatic":2},"body":{"512:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention@512:2","span":{"start":[512,2],"end":[512,13],"bytes":[13998,14009]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"513:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention@513:8","span":{"start":[513,8],"end":[513,21],"bytes":[14017,14030]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.Store.SetRetentionEnabled":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetRetentionEnabled","kind":"method","span":{"start":[565,1],"end":[573,2],"bytes":[15265,15463]},"signature":"github.com/benbjohnson/litestream.Store.SetRetentionEnabled","parameters":[{"name":"v","type":"bool","span":{"start":[565,1],"end":[565,46],"bytes":[15265,15310]}}],"metrics":{"cyclomatic":2},"body":{"566:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetRetentionEnabled@566:2","span":{"start":[566,2],"end":[566,13],"bytes":[15312,15323]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"567:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetRetentionEnabled@567:8","span":{"start":[567,8],"end":[567,21],"bytes":[15331,15344]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval","kind":"method","span":{"start":[544,1],"end":[551,2],"bytes":[14775,14958]},"signature":"github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval","parameters":[{"name":"d","type":"time.Duration","span":{"start":[544,1],"end":[544,59],"bytes":[14775,14833]}}],"metrics":{"cyclomatic":2},"body":{"545:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval@545:2","span":{"start":[545,2],"end":[545,13],"bytes":[14835,14846]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"546:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval@546:8","span":{"start":[546,8],"end":[546,21],"bytes":[14854,14867]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout","kind":"method","span":{"start":[533,1],"end":[540,2],"bytes":[14484,14664]},"signature":"github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout","parameters":[{"name":"d","type":"time.Duration","span":{"start":[533,1],"end":[533,58],"bytes":[14484,14541]}}],"metrics":{"cyclomatic":2},"body":{"534:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout@534:2","span":{"start":[534,2],"end":[534,13],"bytes":[14543,14554]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"535:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout@535:8","span":{"start":[535,8],"end":[535,21],"bytes":[14562,14575]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.Store.SetVerifyCompaction":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction","kind":"method","span":{"start":[555,1],"end":[563,2],"bytes":[15065,15263]},"signature":"github.com/benbjohnson/litestream.Store.SetVerifyCompaction","parameters":[{"name":"v","type":"bool","span":{"start":[555,1],"end":[555,46],"bytes":[15065,15110]}}],"metrics":{"cyclomatic":2},"body":{"556:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction@556:2","span":{"start":[556,2],"end":[556,13],"bytes":[15112,15123]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"557:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction@557:8","span":{"start":[557,8],"end":[557,21],"bytes":[15131,15144]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}},"github.com/benbjohnson/litestream.Store.SnapshotLevel":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SnapshotLevel","kind":"method","span":{"start":[576,1],"end":[581,2],"bytes":[15544,15684]},"signature":"github.com/benbjohnson/litestream.Store.SnapshotLevel","parameters":[],"return_type":"*github.com/benbjohnson/litestream.CompactionLevel","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.Store.SyncDB":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","kind":"method","span":{"start":[454,1],"end":[494,2],"bytes":[12569,13621]},"signature":"github.com/benbjohnson/litestream.Store.SyncDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[454,1],"end":[454,92],"bytes":[12569,12660]}},{"name":"path","type":"string","span":{"start":[454,1],"end":[454,92],"bytes":[12569,12660]}},{"name":"wait","type":"bool","span":{"start":[454,1],"end":[454,92],"bytes":[12569,12660]}}],"return_type":"(github.com/benbjohnson/litestream.SyncDBResult, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"455:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@455:8","span":{"start":[455,8],"end":[455,22],"bytes":[12668,12682]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB"},"457:26":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@457:26","span":{"start":[457,26],"end":[457,73],"bytes":[12724,12771]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"460:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@460:6","span":{"start":[460,6],"end":[460,17],"bytes":[12781,12792]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"461:26":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@461:26","span":{"start":[461,26],"end":[461,72],"bytes":[12820,12866]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"464:24":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@464:24","span":{"start":[464,24],"end":[464,35],"bytes":[12894,12905]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"466:26":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@466:26","span":{"start":[466,26],"end":[466,74],"bytes":[12948,12996]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"470:13":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@470:13","span":{"start":[470,13],"end":[470,32],"bytes":[13024,13043]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait"},"471:27":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@471:27","span":{"start":[471,27],"end":[471,63],"bytes":[13084,13120]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"474:13":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@474:13","span":{"start":[474,13],"end":[474,25],"bytes":[13147,13159]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync"},"475:27":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@475:27","span":{"start":[475,27],"end":[475,63],"bytes":[13200,13236]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"479:23":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@479:23","span":{"start":[479,23],"end":[479,34],"bytes":[13267,13278]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX"},"481:26":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@481:26","span":{"start":[481,26],"end":[481,73],"bytes":[13321,13368]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"486:20":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@486:20","span":{"start":[486,20],"end":[486,49],"bytes":[13443,13472]},"callee":null},"486:27":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@486:27","span":{"start":[486,27],"end":[486,43],"bytes":[13450,13466]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos"},"490:19":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB@490:19","span":{"start":[490,19],"end":[490,36],"bytes":[13517,13534]},"callee":null}}},"github.com/benbjohnson/litestream.Store.UnregisterDB":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","kind":"method","span":{"start":[367,1],"end":[397,2],"bytes":[10524,11007]},"signature":"github.com/benbjohnson/litestream.Store.UnregisterDB","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[367,1],"end":[367,71],"bytes":[10524,10594]}},{"name":"path","type":"string","span":{"start":[367,1],"end":[367,71],"bytes":[10524,10594]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"369:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB@369:10","span":{"start":[369,10],"end":[369,40],"bytes":[10621,10651]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"372:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB@372:2","span":{"start":[372,2],"end":[372,13],"bytes":[10657,10668]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"377:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB@377:6","span":{"start":[377,6],"end":[377,21],"bytes":[10732,10747]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"385:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB@385:3","span":{"start":[385,3],"end":[385,16],"bytes":[10821,10834]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"389:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB@389:10","span":{"start":[389,10],"end":[389,42],"bytes":[10861,10893]},"callee":"can://litestream/litestream/@external/slices/Delete"},"390:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB@390:2","span":{"start":[390,2],"end":[390,15],"bytes":[10895,10908]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"392:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB@392:12","span":{"start":[392,12],"end":[392,25],"bytes":[10921,10934]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close"},"393:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB@393:10","span":{"start":[393,10],"end":[393,41],"bytes":[10958,10989]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream.Store.Validate":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","kind":"method","span":{"start":[885,1],"end":[922,2],"bytes":[24379,25511]},"signature":"github.com/benbjohnson/litestream.Store.Validate","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[885,1],"end":[885,75],"bytes":[24379,24453]}}],"return_type":"(*github.com/benbjohnson/litestream.ValidationResult, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"888:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@888:2","span":{"start":[888,2],"end":[888,13],"bytes":[24498,24509]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"891:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@891:2","span":{"start":[891,2],"end":[891,15],"bytes":[24545,24558]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock"},"899:13":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@899:13","span":{"start":[899,13],"end":[899,36],"bytes":[24671,24694]},"callee":"can://litestream/litestream/@external/strconv/Itoa"},"900:19":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@900:19","span":{"start":[900,19],"end":[900,91],"bytes":[24713,24785]},"callee":null},"900:74":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@900:74","span":{"start":[900,74],"end":[900,83],"bytes":[24768,24777]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"901:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@901:15","span":{"start":[901,15],"end":[901,78],"bytes":[24800,24863]},"callee":null},"901:61":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@901:61","span":{"start":[901,61],"end":[901,70],"bytes":[24846,24855]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"902:17":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@902:17","span":{"start":[902,17],"end":[902,57],"bytes":[24880,24920]},"callee":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel"},"904:48":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@904:48","span":{"start":[904,48],"end":[904,57],"bytes":[24987,24996]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"904:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@904:5","span":{"start":[904,5],"end":[904,80],"bytes":[24944,25019]},"callee":null},"904:5/2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@904:5/2","span":{"start":[904,5],"end":[904,74],"bytes":[24944,25013]},"callee":null},"905:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@905:5","span":{"start":[905,5],"end":[905,19],"bytes":[25024,25038]},"callee":null},"906:17":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@906:17","span":{"start":[906,17],"end":[906,86],"bytes":[25055,25124]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"906:71":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@906:71","span":{"start":[906,71],"end":[906,80],"bytes":[25109,25118]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"908:7":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@908:7","span":{"start":[908,7],"end":[908,16],"bytes":[25136,25145]},"callee":null},"909:48":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@909:48","span":{"start":[909,48],"end":[909,57],"bytes":[25199,25208]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"909:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@909:5","span":{"start":[909,5],"end":[909,82],"bytes":[25156,25233]},"callee":null},"909:5/2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@909:5/2","span":{"start":[909,5],"end":[909,76],"bytes":[25156,25227]},"callee":null},"910:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@910:5","span":{"start":[910,5],"end":[910,19],"bytes":[25238,25252]},"callee":null},"912:21":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@912:21","span":{"start":[912,21],"end":[912,51],"bytes":[25298,25328]},"callee":null},"914:48":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@914:48","span":{"start":[914,48],"end":[914,57],"bytes":[25388,25397]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"914:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@914:5","span":{"start":[914,5],"end":[914,82],"bytes":[25345,25422]},"callee":null},"914:5/2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@914:5/2","span":{"start":[914,5],"end":[914,76],"bytes":[25345,25416]},"callee":null},"915:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@915:5","span":{"start":[915,5],"end":[915,19],"bytes":[25427,25441]},"callee":null},"916:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate@916:5","span":{"start":[916,5],"end":[916,35],"bytes":[25446,25476]},"callee":null}}},"github.com/benbjohnson/litestream.Store.allDatabasesHealthy":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","kind":"method","span":{"start":[767,1],"end":[785,2],"bytes":[20810,21184]},"signature":"github.com/benbjohnson/litestream.Store.allDatabasesHealthy","parameters":[{"name":"since","type":"time.Time","span":{"start":[767,1],"end":[767,60],"bytes":[20810,20869]}}],"return_type":"bool","metrics":{"cyclomatic":5},"body":{"768:9":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy@768:9","span":{"start":[768,9],"end":[768,16],"bytes":[20878,20885]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"769:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy@769:5","span":{"start":[769,5],"end":[769,13],"bytes":[20890,20898]},"callee":null},"775:7":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy@775:7","span":{"start":[775,7],"end":[775,18],"bytes":[20976,20987]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"779:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy@779:15","span":{"start":[779,15],"end":[779,40],"bytes":[21058,21083]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt"},"780:27":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy@780:27","span":{"start":[780,27],"end":[780,49],"bytes":[21110,21132]},"callee":"can://litestream/litestream/@external/time/Time.Before"},"780:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy@780:6","span":{"start":[780,6],"end":[780,23],"bytes":[21089,21106]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"}}},"github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked","kind":"method","span":{"start":[706,1],"end":[708,2],"bytes":[18987,19090]},"signature":"github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.Store.monitorCompactionLevel":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","kind":"method","span":{"start":[583,1],"end":[648,2],"bytes":[15686,17683]},"signature":"github.com/benbjohnson/litestream.Store.monitorCompactionLevel","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[583,1],"end":[583,84],"bytes":[15686,15769]}},{"name":"lvl","type":"*github.com/benbjohnson/litestream.CompactionLevel","span":{"start":[583,1],"end":[583,84],"bytes":[15686,15769]}}],"metrics":{"cyclomatic":17},"body":{"584:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@584:2","span":{"start":[584,2],"end":[584,92],"bytes":[15771,15861]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"587:11":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@587:11","span":{"start":[587,11],"end":[587,41],"bytes":[15903,15933]},"callee":"can://litestream/litestream/@external/time/NewTimer"},"588:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@588:8","span":{"start":[588,8],"end":[588,20],"bytes":[15941,15953]},"callee":"can://litestream/litestream/@external/time/Timer.Stop","is_deferred":true},"592:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@592:10","span":{"start":[592,10],"end":[592,20],"bytes":[15982,15992]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"598:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@598:10","span":{"start":[598,10],"end":[598,20],"bytes":[16050,16060]},"callee":"can://litestream/litestream/@external/time/Now"},"599:16":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@599:16","span":{"start":[599,16],"end":[599,53],"bytes":[16076,16113]},"callee":"can://litestream/litestream/@external/time/Until"},"599:27":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@599:27","span":{"start":[599,27],"end":[599,52],"bytes":[16087,16112]},"callee":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt"},"603:22":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@603:22","span":{"start":[603,22],"end":[603,29],"bytes":[16164,16171]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"604:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@604:8","span":{"start":[604,8],"end":[604,19],"bytes":[16181,16192]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"607:14":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@607:14","span":{"start":[607,14],"end":[607,39],"bytes":[16247,16272]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB"},"609:42":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@609:42","span":{"start":[609,42],"end":[609,79],"bytes":[16326,16363]},"callee":"can://litestream/litestream/@external/errors/Is"},"609:9":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@609:9","span":{"start":[609,9],"end":[609,40],"bytes":[16293,16324]},"callee":"can://litestream/litestream/@external/errors/Is"},"610:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@610:5","span":{"start":[610,5],"end":[610,76],"bytes":[16369,16440]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"610:66":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@610:66","span":{"start":[610,66],"end":[610,75],"bytes":[16430,16439]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"611:9":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@611:9","span":{"start":[611,9],"end":[611,38],"bytes":[16449,16478]},"callee":"can://litestream/litestream/@external/errors/Is"},"612:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@612:5","span":{"start":[612,5],"end":[612,99],"bytes":[16484,16578]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"612:75":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@612:75","span":{"start":[612,75],"end":[612,84],"bytes":[16554,16563]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"613:19":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@613:19","span":{"start":[613,19],"end":[613,49],"bytes":[16597,16627]},"callee":null},"613:39":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@613:39","span":{"start":[613,39],"end":[613,48],"bytes":[16617,16626]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"614:24":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@614:24","span":{"start":[614,24],"end":[614,49],"bytes":[16651,16676]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"615:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@615:5","span":{"start":[615,5],"end":[615,75],"bytes":[16682,16752]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"619:15":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@619:15","span":{"start":[619,15],"end":[619,50],"bytes":[16808,16843]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention"},"619:67":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@619:67","span":{"start":[619,67],"end":[619,92],"bytes":[16860,16885]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"620:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@620:6","span":{"start":[620,6],"end":[620,67],"bytes":[16893,16954]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"625:16":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@625:16","span":{"start":[625,16],"end":[625,38],"bytes":[16986,17008]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"625:42":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@625:42","span":{"start":[625,42],"end":[625,66],"bytes":[17012,17036]},"callee":"can://litestream/litestream/@external/time/Time.After"},"626:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@626:6","span":{"start":[626,6],"end":[626,22],"bytes":[17042,17058]},"callee":null},"627:7":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@627:7","span":{"start":[627,7],"end":[627,29],"bytes":[17084,17106]},"callee":"can://litestream/litestream/@external/time/Time.IsZero"},"628:21":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@628:21","span":{"start":[628,21],"end":[628,50],"bytes":[17129,17158]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"631:4":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@631:4","span":{"start":[631,4],"end":[631,74],"bytes":[17194,17264]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"634:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@634:5","span":{"start":[634,5],"end":[638,131],"bytes":[17297,17570]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"},"646:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel@646:3","span":{"start":[646,3],"end":[646,25],"bytes":[17656,17678]},"callee":"can://litestream/litestream/@external/time/Timer.Reset"}}},"github.com/benbjohnson/litestream.Store.monitorHeartbeats":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","kind":"method","span":{"start":[713,1],"end":[729,2],"bytes":[19279,19612]},"signature":"github.com/benbjohnson/litestream.Store.monitorHeartbeats","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[713,1],"end":[713,57],"bytes":[19279,19335]}}],"metrics":{"cyclomatic":5},"body":{"714:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats@714:2","span":{"start":[714,2],"end":[714,83],"bytes":[19337,19418]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"716:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats@716:12","span":{"start":[716,12],"end":[716,52],"bytes":[19431,19471]},"callee":"can://litestream/litestream/@external/time/NewTicker"},"717:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats@717:8","span":{"start":[717,8],"end":[717,21],"bytes":[19479,19492]},"callee":"can://litestream/litestream/@external/time/Ticker.Stop","is_deferred":true},"722:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats@722:10","span":{"start":[722,10],"end":[722,20],"bytes":[19527,19537]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"727:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats@727:3","span":{"start":[727,3],"end":[727,31],"bytes":[19579,19607]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded"}}},"github.com/benbjohnson/litestream.Store.monitorL0Retention":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","kind":"method","span":{"start":[650,1],"end":[676,2],"bytes":[17685,18326]},"signature":"github.com/benbjohnson/litestream.Store.monitorL0Retention","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[650,1],"end":[650,58],"bytes":[17685,17742]}}],"metrics":{"cyclomatic":9},"body":{"651:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@651:2","span":{"start":[651,2],"end":[651,116],"bytes":[17744,17858]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"653:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@653:12","span":{"start":[653,12],"end":[653,54],"bytes":[17871,17913]},"callee":"can://litestream/litestream/@external/time/NewTicker"},"654:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@654:8","span":{"start":[654,8],"end":[654,21],"bytes":[17921,17934]},"callee":"can://litestream/litestream/@external/time/Ticker.Stop","is_deferred":true},"659:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@659:10","span":{"start":[659,10],"end":[659,20],"bytes":[17969,17979]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"664:22":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@664:22","span":{"start":[664,22],"end":[664,29],"bytes":[18040,18047]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs"},"665:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@665:8","span":{"start":[665,8],"end":[665,19],"bytes":[18057,18068]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen"},"668:14":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@668:14","span":{"start":[668,14],"end":[668,46],"bytes":[18123,18155]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime"},"669:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@669:8","span":{"start":[669,8],"end":[669,33],"bytes":[18177,18202]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"672:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@672:5","span":{"start":[672,5],"end":[672,88],"bytes":[18229,18312]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"672:64":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention@672:64","span":{"start":[672,64],"end":[672,73],"bytes":[18288,18297]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"}}},"github.com/benbjohnson/litestream.Store.monitorValidation":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","kind":"method","span":{"start":[925,1],"end":[958,2],"bytes":[25588,26265]},"signature":"github.com/benbjohnson/litestream.Store.monitorValidation","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[925,1],"end":[925,57],"bytes":[25588,25644]}}],"metrics":{"cyclomatic":9},"body":{"926:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation@926:2","span":{"start":[926,2],"end":[926,80],"bytes":[25646,25724]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Info"},"928:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation@928:12","span":{"start":[928,12],"end":[928,48],"bytes":[25737,25773]},"callee":"can://litestream/litestream/@external/time/NewTicker"},"929:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation@929:8","span":{"start":[929,8],"end":[929,21],"bytes":[25781,25794]},"callee":"can://litestream/litestream/@external/time/Ticker.Stop","is_deferred":true},"934:10":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation@934:10","span":{"start":[934,10],"end":[934,20],"bytes":[25829,25839]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"939:18":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation@939:18","span":{"start":[939,18],"end":[939,33],"bytes":[25896,25911]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate"},"941:7":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation@941:7","span":{"start":[941,7],"end":[941,32],"bytes":[25936,25961]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError"},"944:4":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation@944:4","span":{"start":[944,4],"end":[944,59],"bytes":[25985,26040]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"950:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation@950:5","span":{"start":[950,5],"end":[954,6],"bytes":[26123,26251]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Warn"}}},"github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","kind":"method","span":{"start":[735,1],"end":[763,2],"bytes":[19838,20640]},"signature":"github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[735,1],"end":[735,61],"bytes":[19838,19898]}}],"metrics":{"cyclomatic":5},"body":{"741:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded@741:6","span":{"start":[741,6],"end":[741,21],"bytes":[19968,19983]},"callee":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing"},"747:18":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded@747:18","span":{"start":[747,18],"end":[747,46],"bytes":[20165,20193]},"callee":"can://litestream/litestream/@external/time/Time.Add"},"747:18/2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded@747:18/2","span":{"start":[747,18],"end":[747,28],"bytes":[20165,20175]},"callee":"can://litestream/litestream/@external/time/Now"},"748:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded@748:6","span":{"start":[748,6],"end":[748,41],"bytes":[20199,20234]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy"},"755:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded@755:2","span":{"start":[755,2],"end":[755,17],"bytes":[20446,20461]},"callee":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing"},"757:12":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded@757:12","span":{"start":[757,12],"end":[757,24],"bytes":[20474,20486]},"callee":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping"},"758:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded@758:3","span":{"start":[758,3],"end":[758,71],"bytes":[20503,20571]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Error"},"762:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded@762:2","span":{"start":[762,2],"end":[762,54],"bytes":[20586,20638]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"}}},"github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","kind":"method","span":{"start":[682,1],"end":[702,2],"bytes":[18528,18869]},"signature":"github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","parameters":[],"metrics":{"cyclomatic":4},"body":{"683:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded@683:2","span":{"start":[683,2],"end":[683,13],"bytes":[18579,18590]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"684:8":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded@684:8","span":{"start":[684,8],"end":[684,21],"bytes":[18598,18611]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true},"692:6":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded@692:6","span":{"start":[692,6],"end":[692,34],"bytes":[18710,18738]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked"},"697:2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded@697:2","span":{"start":[697,2],"end":[697,13],"bytes":[18789,18800]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Add"},"698:5":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded@698:5","span":{"start":[698,5],"end":[701,5],"bytes":[18805,18867]},"callee":null,"is_goroutine":true}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded.closure_1","kind":"function","span":{"start":[698,1],"end":[701,5],"bytes":[18801,18867]},"signature":"github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded.closure_1","parameters":[],"body":{"699:9":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded.closure_1@699:9","span":{"start":[699,9],"end":[699,20],"bytes":[18822,18833]},"callee":"can://litestream/litestream/@external/sync/WaitGroup.Done","is_deferred":true},"700:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded.closure_1@700:3","span":{"start":[700,3],"end":[700,29],"bytes":[18836,18862]},"callee":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats"}}}}}},"fields":{"CompactionMonitorEnabled":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/CompactionMonitorEnabled","kind":"field","type":"bool","span":{"start":[128,1],"end":[128,31],"bytes":[4255,4285]}},"Heartbeat":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/Heartbeat","kind":"field","type":"*github.com/benbjohnson/litestream.HeartbeatClient","span":{"start":[147,1],"end":[147,28],"bytes":[4980,5007]}},"HeartbeatCheckInterval":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/HeartbeatCheckInterval","kind":"field","type":"time.Duration","span":{"start":[143,1],"end":[143,38],"bytes":[4800,4837]}},"L0Retention":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/L0Retention","kind":"field","type":"time.Duration","span":{"start":[123,1],"end":[123,27],"bytes":[4061,4087]}},"L0RetentionCheckInterval":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/L0RetentionCheckInterval","kind":"field","type":"time.Duration","span":{"start":[125,1],"end":[125,40],"bytes":[4133,4172]}},"Logger":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/Logger","kind":"field","type":"*log/slog.Logger","span":{"start":[155,1],"end":[155,21],"bytes":[5237,5257]}},"RetentionEnabled":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/RetentionEnabled","kind":"field","type":"bool","span":{"start":[136,1],"end":[136,23],"bytes":[4611,4633]}},"ShutdownSyncInterval":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/ShutdownSyncInterval","kind":"field","type":"time.Duration","span":{"start":[140,1],"end":[140,36],"bytes":[4705,4740]}},"ShutdownSyncTimeout":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/ShutdownSyncTimeout","kind":"field","type":"time.Duration","span":{"start":[139,1],"end":[139,36],"bytes":[4669,4704]}},"SnapshotInterval":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/SnapshotInterval","kind":"field","type":"time.Duration","span":{"start":[118,1],"end":[118,32],"bytes":[3853,3884]}},"SnapshotRetention":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/SnapshotRetention","kind":"field","type":"time.Duration","span":{"start":[120,1],"end":[120,33],"bytes":[3956,3988]}},"ValidationInterval":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/ValidationInterval","kind":"field","type":"time.Duration","span":{"start":[153,1],"end":[153,34],"bytes":[5202,5235]}},"VerifyCompaction":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/VerifyCompaction","kind":"field","type":"bool","span":{"start":[131,1],"end":[131,23],"bytes":[4368,4390]}},"cancel":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/cancel","kind":"field","type":"func()","span":{"start":[114,1],"end":[114,15],"bytes":[3781,3795]}},"ctx":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/ctx","kind":"field","type":"context.Context","span":{"start":[113,1],"end":[113,24],"bytes":[3757,3780]}},"dbs":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/dbs","kind":"field","type":"[]*github.com/benbjohnson/litestream.DB","span":{"start":[109,1],"end":[109,14],"bytes":[3694,3707]}},"done":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/done","kind":"field","type":"\u003c-chan struct{}","span":{"start":[115,1],"end":[115,24],"bytes":[3796,3819]}},"heartbeatMonitorRunning":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/heartbeatMonitorRunning","kind":"field","type":"bool","span":{"start":[150,1],"end":[150,30],"bytes":[5096,5125]}},"levels":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/levels","kind":"field","type":"github.com/benbjohnson/litestream.CompactionLevels","span":{"start":[110,1],"end":[110,25],"bytes":[3708,3732]}},"mu":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/mu","kind":"field","type":"sync.Mutex","span":{"start":[108,1],"end":[108,19],"bytes":[3675,3693]}},"wg":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/wg","kind":"field","type":"sync.WaitGroup","span":{"start":[112,1],"end":[112,23],"bytes":[3734,3756]}}}},"SyncDBResult":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.SyncDBResult","kind":"struct","span":{"start":[443,1],"end":[447,2],"bytes":[12109,12204]},"callables":{},"fields":{"Changed":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.SyncDBResult/Changed","kind":"field","type":"bool","span":{"start":[446,1],"end":[446,21],"bytes":[12182,12202]}},"ReplicatedTXID":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.SyncDBResult/ReplicatedTXID","kind":"field","type":"uint64","span":{"start":[445,1],"end":[445,23],"bytes":[12159,12181]}},"TXID":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.SyncDBResult/TXID","kind":"field","type":"uint64","span":{"start":[444,1],"end":[444,23],"bytes":[12136,12158]}}}},"ValidationResult":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.ValidationResult","kind":"struct","span":{"start":[878,1],"end":[881,2],"bytes":[24104,24235]},"callables":{},"fields":{"Errors":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.ValidationResult/Errors","kind":"field","type":"[]github.com/benbjohnson/litestream.ValidationError","span":{"start":[880,1],"end":[880,46],"bytes":[24188,24233]}},"Valid":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.ValidationResult/Valid","kind":"field","type":"bool","span":{"start":[879,1],"end":[879,53],"bytes":[24135,24187]}}}}},"functions":{"github.com/benbjohnson/litestream.NewStore":{"id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","kind":"function","span":{"start":[158,1],"end":[185,2],"bytes":[5261,6292]},"signature":"github.com/benbjohnson/litestream.NewStore","parameters":[{"name":"dbs","type":"[]*github.com/benbjohnson/litestream.DB","span":{"start":[158,1],"end":[158,59],"bytes":[5261,5319]}},{"name":"levels","type":"github.com/benbjohnson/litestream.CompactionLevels","span":{"start":[158,1],"end":[158,59],"bytes":[5261,5319]}}],"return_type":"*github.com/benbjohnson/litestream.Store","metrics":{"cyclomatic":2},"body":{"172:29":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore@172:29","span":{"start":[172,29],"end":[172,78],"bytes":[5852,5901]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"172:29/2":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore@172:29/2","span":{"start":[172,29],"end":[172,43],"bytes":[5852,5866]},"callee":"can://litestream/litestream/@external/log/slog/Default"},"176:16":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore@176:16","span":{"start":[176,16],"end":[176,65],"bytes":[5948,5997]},"callee":"can://litestream/litestream/@external/log/slog/Logger.With"},"176:3":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore@176:3","span":{"start":[176,3],"end":[176,66],"bytes":[5935,5998]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger"},"176:40":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore@176:40","span":{"start":[176,40],"end":[176,64],"bytes":[5972,5996]},"callee":"can://litestream/litestream/@external/path/filepath/Base"},"176:54":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore@176:54","span":{"start":[176,54],"end":[176,63],"bytes":[5986,5995]},"callee":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path"},"183:20":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore@183:20","span":{"start":[183,20],"end":[183,60],"bytes":[6240,6280]},"callee":"can://litestream/litestream/@external/context/WithCancel"},"183:39":{"kind":"call","id":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore@183:39","span":{"start":[183,39],"end":[183,59],"bytes":[6259,6279]},"callee":"can://litestream/litestream/@external/context/Background"}}}},"content_hash":"ebb3c05192c82c74a49e88667d7b47c61959023edf56d51b1d552976bc44341e"},"v3.go":{"id":"can://litestream/litestream/go/v3.go","kind":"module","span":{"start":[1,1],"end":[176,1],"bytes":[0,5940]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// PosV3 represents a position in a v0.3.x backup.\ntype PosV3 struct {\n\tGeneration string // 16-char hex string\n\tIndex int // WAL index\n\tOffset int64 // Offset within WAL segment\n}\n\n// IsZero returns true if the position is the zero value.\nfunc (p PosV3) IsZero() bool {\n\treturn p == (PosV3{})\n}\n\n// String returns a string representation of the position.\nfunc (p PosV3) String() string {\n\tif p.IsZero() {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s/%08x:%016x\", p.Generation, p.Index, p.Offset)\n}\n\n// SnapshotInfoV3 contains metadata about a v0.3.x snapshot.\ntype SnapshotInfoV3 struct {\n\tGeneration string\n\tIndex int\n\tSize int64\n\tCreatedAt time.Time\n}\n\n// Pos returns the position of this snapshot.\nfunc (info SnapshotInfoV3) Pos() PosV3 {\n\treturn PosV3{Generation: info.Generation, Index: info.Index, Offset: 0}\n}\n\n// WALSegmentInfoV3 contains metadata about a v0.3.x WAL segment.\ntype WALSegmentInfoV3 struct {\n\tGeneration string\n\tIndex int\n\tOffset int64\n\tSize int64\n\tCreatedAt time.Time\n}\n\n// Pos returns the position of this WAL segment.\nfunc (info WALSegmentInfoV3) Pos() PosV3 {\n\treturn PosV3{Generation: info.Generation, Index: info.Index, Offset: info.Offset}\n}\n\n// v0.3.x path constants.\nconst (\n\tGenerationsDirV3 = \"generations\"\n\tSnapshotsDirV3 = \"snapshots\"\n\tWALDirV3 = \"wal\"\n)\n\n// GenerationsPathV3 returns the path to the generations directory.\nfunc GenerationsPathV3(root string) string {\n\treturn path.Join(root, GenerationsDirV3)\n}\n\n// GenerationPathV3 returns the path to a specific generation.\nfunc GenerationPathV3(root, generation string) string {\n\treturn path.Join(root, GenerationsDirV3, generation)\n}\n\n// SnapshotsPathV3 returns the path to snapshots within a generation.\nfunc SnapshotsPathV3(root, generation string) string {\n\treturn path.Join(root, GenerationsDirV3, generation, SnapshotsDirV3)\n}\n\n// WALPathV3 returns the path to WAL segments within a generation.\nfunc WALPathV3(root, generation string) string {\n\treturn path.Join(root, GenerationsDirV3, generation, WALDirV3)\n}\n\n// SnapshotPathV3 returns the full path to a v0.3.x snapshot file.\nfunc SnapshotPathV3(root, generation string, index int) string {\n\treturn path.Join(SnapshotsPathV3(root, generation), FormatSnapshotFilenameV3(index))\n}\n\n// WALSegmentPathV3 returns the full path to a v0.3.x WAL segment file.\nfunc WALSegmentPathV3(root, generation string, index int, offset int64) string {\n\treturn path.Join(WALPathV3(root, generation), FormatWALSegmentFilenameV3(index, offset))\n}\n\n// FormatSnapshotFilenameV3 returns the filename for a v0.3.x snapshot.\n// Format: {index:08x}.snapshot.lz4\nfunc FormatSnapshotFilenameV3(index int) string {\n\treturn fmt.Sprintf(\"%08x.snapshot.lz4\", index)\n}\n\n// FormatWALSegmentFilenameV3 returns the filename for a v0.3.x WAL segment.\n// Format: {index:08x}_{offset:08x}.wal.lz4\nfunc FormatWALSegmentFilenameV3(index int, offset int64) string {\n\treturn fmt.Sprintf(\"%08x_%08x.wal.lz4\", index, offset)\n}\n\nvar (\n\tsnapshotRegexV3 = regexp.MustCompile(`^([0-9a-f]{8})\\.snapshot\\.lz4$`)\n\twalSegmentRegexV3 = regexp.MustCompile(`^([0-9a-f]{8})_([0-9a-f]{8,16})\\.wal\\.lz4$`)\n\tgenerationRegexV3 = regexp.MustCompile(`^[0-9a-f]{16}$`)\n)\n\n// ParseSnapshotFilenameV3 parses a v0.3.x snapshot filename and returns the index.\n// Returns an error if the filename does not match the expected format.\nfunc ParseSnapshotFilenameV3(filename string) (index int, err error) {\n\tm := snapshotRegexV3.FindStringSubmatch(filename)\n\tif m == nil {\n\t\treturn 0, fmt.Errorf(\"invalid v0.3.x snapshot filename: %q\", filename)\n\t}\n\tidx, err := strconv.ParseInt(m[1], 16, 32)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"invalid snapshot path: %s: %w\", filename, err)\n\t}\n\treturn int(idx), nil\n}\n\n// ParseWALSegmentFilenameV3 parses a v0.3.x WAL segment filename.\n// Returns the WAL index and byte offset, or an error if the filename is invalid.\nfunc ParseWALSegmentFilenameV3(filename string) (index int, offset int64, err error) {\n\tm := walSegmentRegexV3.FindStringSubmatch(filename)\n\tif m == nil {\n\t\treturn 0, 0, fmt.Errorf(\"invalid v0.3.x WAL segment filename: %q\", filename)\n\t}\n\tidx, err := strconv.ParseInt(m[1], 16, 32)\n\tif err != nil {\n\t\treturn 0, 0, fmt.Errorf(\"invalid wal segment path: %s: %w\", filename, err)\n\t}\n\toff, err := strconv.ParseInt(m[2], 16, 64)\n\tif err != nil {\n\t\treturn 0, 0, fmt.Errorf(\"invalid wal segment path: %s: %w\", filename, err)\n\t}\n\treturn int(idx), off, nil\n}\n\n// IsGenerationIDV3 returns true if s is a valid v0.3.x generation ID (16 hex chars).\nfunc IsGenerationIDV3(s string) bool {\n\treturn generationRegexV3.MatchString(s)\n}\n\n// ReplicaClientV3 reads v0.3.x backup data.\n// ReplicaClient implementations that support v0.3.x restore should implement this interface.\ntype ReplicaClientV3 interface {\n\t// GenerationsV3 returns a list of generation IDs in the replica.\n\t// Returns an empty slice if no v0.3.x backups exist.\n\t// Generation IDs are sorted in ascending order.\n\tGenerationsV3(ctx context.Context) ([]string, error)\n\n\t// SnapshotsV3 returns snapshots for a generation, sorted by index.\n\t// Returns an empty slice if no snapshots exist.\n\tSnapshotsV3(ctx context.Context, generation string) ([]SnapshotInfoV3, error)\n\n\t// WALSegmentsV3 returns WAL segments for a generation, sorted by index then offset.\n\t// Returns an empty slice if no WAL segments exist.\n\tWALSegmentsV3(ctx context.Context, generation string) ([]WALSegmentInfoV3, error)\n\n\t// OpenSnapshotV3 opens a v0.3.x snapshot for reading.\n\t// The returned reader provides LZ4-decompressed data.\n\tOpenSnapshotV3(ctx context.Context, generation string, index int) (io.ReadCloser, error)\n\n\t// OpenWALSegmentV3 opens a v0.3.x WAL segment for reading.\n\t// The returned reader provides LZ4-decompressed data.\n\tOpenWALSegmentV3(ctx context.Context, generation string, index int, offset int64) (io.ReadCloser, error)\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"fmt","path":"fmt","span":{"start":[5,1],"end":[5,7],"bytes":[40,46]}},{"name":"io","path":"io","span":{"start":[6,1],"end":[6,6],"bytes":[47,52]}},{"name":"path","path":"path","span":{"start":[7,1],"end":[7,8],"bytes":[53,60]}},{"name":"regexp","path":"regexp","span":{"start":[8,1],"end":[8,10],"bytes":[61,70]}},{"name":"strconv","path":"strconv","span":{"start":[9,1],"end":[9,11],"bytes":[71,81]}},{"name":"time","path":"time","span":{"start":[10,1],"end":[10,8],"bytes":[82,89]}}],"types":{"PosV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3","kind":"struct","span":{"start":[14,1],"end":[18,2],"bytes":[144,286]},"callables":{"github.com/benbjohnson/litestream.PosV3.IsZero":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.IsZero","kind":"method","span":{"start":[21,1],"end":[23,2],"bytes":[346,401]},"signature":"github.com/benbjohnson/litestream.PosV3.IsZero","parameters":[],"return_type":"bool","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.PosV3.String":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.String","kind":"method","span":{"start":[26,1],"end":[31,2],"bytes":[462,598]},"signature":"github.com/benbjohnson/litestream.PosV3.String","parameters":[],"return_type":"string","metrics":{"cyclomatic":2},"body":{"27:5":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.String@27:5","span":{"start":[27,5],"end":[27,15],"bytes":[499,509]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.IsZero"},"30:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.String@30:9","span":{"start":[30,9],"end":[30,70],"bytes":[535,596]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}}},"fields":{"Generation":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/Generation","kind":"field","type":"string","span":{"start":[15,1],"end":[15,41],"bytes":[164,204]}},"Index":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/Index","kind":"field","type":"int","span":{"start":[16,1],"end":[16,32],"bytes":[205,236]}},"Offset":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/Offset","kind":"field","type":"int64","span":{"start":[17,1],"end":[17,48],"bytes":[237,284]}}}},"ReplicaClientV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3","kind":"interface","span":{"start":[154,1],"end":[175,2],"bytes":[4830,5939]},"callables":{"github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","kind":"method","span":{"start":[158,1],"end":[158,54],"bytes":[5035,5088]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[158,1],"end":[158,54],"bytes":[5035,5088]}}],"return_type":"([]string, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3","kind":"method","span":{"start":[170,1],"end":[170,90],"bytes":[5624,5713]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[170,1],"end":[170,90],"bytes":[5624,5713]}},{"name":"generation","type":"string","span":{"start":[170,1],"end":[170,90],"bytes":[5624,5713]}},{"name":"index","type":"int","span":{"start":[170,1],"end":[170,90],"bytes":[5624,5713]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3","kind":"method","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]}},{"name":"generation","type":"string","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]}},{"name":"index","type":"int","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]}},{"name":"offset","type":"int64","span":{"start":[174,1],"end":[174,106],"bytes":[5832,5937]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","kind":"method","span":{"start":[162,1],"end":[162,79],"bytes":[5209,5287]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[162,1],"end":[162,79],"bytes":[5209,5287]}},{"name":"generation","type":"string","span":{"start":[162,1],"end":[162,79],"bytes":[5209,5287]}}],"return_type":"([]github.com/benbjohnson/litestream.SnapshotInfoV3, error)","error_channel":["error"],"body":{}},"github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3","kind":"method","span":{"start":[166,1],"end":[166,83],"bytes":[5428,5510]},"signature":"github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[166,1],"end":[166,83],"bytes":[5428,5510]}},{"name":"generation","type":"string","span":{"start":[166,1],"end":[166,83],"bytes":[5428,5510]}}],"return_type":"([]github.com/benbjohnson/litestream.WALSegmentInfoV3, error)","error_channel":["error"],"body":{}}}},"SnapshotInfoV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3","kind":"struct","span":{"start":[34,1],"end":[39,2],"bytes":[661,766]},"callables":{"github.com/benbjohnson/litestream.SnapshotInfoV3.Pos":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/github.com/benbjohnson/litestream.SnapshotInfoV3.Pos","kind":"method","span":{"start":[42,1],"end":[44,2],"bytes":[814,929]},"signature":"github.com/benbjohnson/litestream.SnapshotInfoV3.Pos","parameters":[],"return_type":"github.com/benbjohnson/litestream.PosV3","metrics":{"cyclomatic":1},"body":{}}},"fields":{"CreatedAt":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/CreatedAt","kind":"field","type":"time.Time","span":{"start":[38,1],"end":[38,22],"bytes":[743,764]}},"Generation":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/Generation","kind":"field","type":"string","span":{"start":[35,1],"end":[35,19],"bytes":[690,708]}},"Index":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/Index","kind":"field","type":"int","span":{"start":[36,1],"end":[36,16],"bytes":[709,724]}},"Size":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotInfoV3/Size","kind":"field","type":"int64","span":{"start":[37,1],"end":[37,18],"bytes":[725,742]}}}},"WALSegmentInfoV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3","kind":"struct","span":{"start":[47,1],"end":[53,2],"bytes":[997,1122]},"callables":{"github.com/benbjohnson/litestream.WALSegmentInfoV3.Pos":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/github.com/benbjohnson/litestream.WALSegmentInfoV3.Pos","kind":"method","span":{"start":[56,1],"end":[58,2],"bytes":[1173,1300]},"signature":"github.com/benbjohnson/litestream.WALSegmentInfoV3.Pos","parameters":[],"return_type":"github.com/benbjohnson/litestream.PosV3","metrics":{"cyclomatic":1},"body":{}}},"fields":{"CreatedAt":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/CreatedAt","kind":"field","type":"time.Time","span":{"start":[52,1],"end":[52,22],"bytes":[1099,1120]}},"Generation":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/Generation","kind":"field","type":"string","span":{"start":[48,1],"end":[48,19],"bytes":[1028,1046]}},"Index":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/Index","kind":"field","type":"int","span":{"start":[49,1],"end":[49,16],"bytes":[1047,1062]}},"Offset":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/Offset","kind":"field","type":"int64","span":{"start":[50,1],"end":[50,18],"bytes":[1063,1080]}},"Size":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentInfoV3/Size","kind":"field","type":"int64","span":{"start":[51,1],"end":[51,18],"bytes":[1081,1098]}}}}},"functions":{"github.com/benbjohnson/litestream.FormatSnapshotFilenameV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","kind":"function","span":{"start":[99,1],"end":[101,2],"bytes":[2721,2820]},"signature":"github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","parameters":[{"name":"index","type":"int","span":{"start":[99,1],"end":[99,50],"bytes":[2721,2770]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"100:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3@100:9","span":{"start":[100,9],"end":[100,48],"bytes":[2779,2818]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","kind":"function","span":{"start":[105,1],"end":[107,2],"bytes":[2943,3066]},"signature":"github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","parameters":[{"name":"index","type":"int","span":{"start":[105,1],"end":[105,66],"bytes":[2943,3008]}},{"name":"offset","type":"int64","span":{"start":[105,1],"end":[105,66],"bytes":[2943,3008]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"106:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3@106:9","span":{"start":[106,9],"end":[106,56],"bytes":[3017,3064]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream.GenerationPathV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.GenerationPathV3","kind":"function","span":{"start":[73,1],"end":[75,2],"bytes":[1652,1763]},"signature":"github.com/benbjohnson/litestream.GenerationPathV3","parameters":[{"name":"root","type":"string","span":{"start":[73,1],"end":[73,56],"bytes":[1652,1707]}},{"name":"generation","type":"string","span":{"start":[73,1],"end":[73,56],"bytes":[1652,1707]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"74:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.GenerationPathV3@74:9","span":{"start":[74,9],"end":[74,54],"bytes":[1716,1761]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream.GenerationsPathV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.GenerationsPathV3","kind":"function","span":{"start":[68,1],"end":[70,2],"bytes":[1499,1587]},"signature":"github.com/benbjohnson/litestream.GenerationsPathV3","parameters":[{"name":"root","type":"string","span":{"start":[68,1],"end":[68,45],"bytes":[1499,1543]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"69:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.GenerationsPathV3@69:9","span":{"start":[69,9],"end":[69,42],"bytes":[1552,1585]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream.IsGenerationIDV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3","kind":"function","span":{"start":[148,1],"end":[150,2],"bytes":[4608,4689]},"signature":"github.com/benbjohnson/litestream.IsGenerationIDV3","parameters":[{"name":"s","type":"string","span":{"start":[148,1],"end":[148,39],"bytes":[4608,4646]}}],"return_type":"bool","metrics":{"cyclomatic":1},"body":{"149:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3@149:9","span":{"start":[149,9],"end":[149,41],"bytes":[4655,4687]},"callee":"can://litestream/litestream/@external/regexp/Regexp.MatchString"}}},"github.com/benbjohnson/litestream.ParseSnapshotFilenameV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","kind":"function","span":{"start":[117,1],"end":[127,2],"bytes":[3451,3822]},"signature":"github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","parameters":[{"name":"filename","type":"string","span":{"start":[117,1],"end":[117,71],"bytes":[3451,3521]}}],"return_type":"(int, error)","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"118:7":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3@118:7","span":{"start":[118,7],"end":[118,51],"bytes":[3528,3572]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"120:13":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3@120:13","span":{"start":[120,13],"end":[120,73],"bytes":[3600,3660]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"122:14":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3@122:14","span":{"start":[122,14],"end":[122,44],"bytes":[3677,3707]},"callee":"can://litestream/litestream/@external/strconv/ParseInt"},"124:13":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3@124:13","span":{"start":[124,13],"end":[124,71],"bytes":[3737,3795]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"126:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3@126:9","span":{"start":[126,9],"end":[126,17],"bytes":[3807,3815]},"callee":null}}},"github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","kind":"function","span":{"start":[131,1],"end":[145,2],"bytes":[3973,4520]},"signature":"github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","parameters":[{"name":"filename","type":"string","span":{"start":[131,1],"end":[131,87],"bytes":[3973,4059]}}],"return_type":"(int, int64, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"132:7":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3@132:7","span":{"start":[132,7],"end":[132,53],"bytes":[4066,4112]},"callee":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch"},"134:16":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3@134:16","span":{"start":[134,16],"end":[134,79],"bytes":[4143,4206]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"136:14":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3@136:14","span":{"start":[136,14],"end":[136,44],"bytes":[4223,4253]},"callee":"can://litestream/litestream/@external/strconv/ParseInt"},"138:16":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3@138:16","span":{"start":[138,16],"end":[138,77],"bytes":[4286,4347]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"140:14":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3@140:14","span":{"start":[140,14],"end":[140,44],"bytes":[4364,4394]},"callee":"can://litestream/litestream/@external/strconv/ParseInt"},"142:16":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3@142:16","span":{"start":[142,16],"end":[142,77],"bytes":[4427,4488]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"144:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3@144:9","span":{"start":[144,9],"end":[144,17],"bytes":[4500,4508]},"callee":null}}},"github.com/benbjohnson/litestream.SnapshotPathV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","kind":"function","span":{"start":[88,1],"end":[90,2],"bytes":[2213,2365]},"signature":"github.com/benbjohnson/litestream.SnapshotPathV3","parameters":[{"name":"root","type":"string","span":{"start":[88,1],"end":[88,65],"bytes":[2213,2277]}},{"name":"generation","type":"string","span":{"start":[88,1],"end":[88,65],"bytes":[2213,2277]}},{"name":"index","type":"int","span":{"start":[88,1],"end":[88,65],"bytes":[2213,2277]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"89:19":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3@89:19","span":{"start":[89,19],"end":[89,52],"bytes":[2296,2329]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3"},"89:54":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3@89:54","span":{"start":[89,54],"end":[89,85],"bytes":[2331,2362]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3"},"89:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3@89:9","span":{"start":[89,9],"end":[89,86],"bytes":[2286,2363]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream.SnapshotsPathV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3","kind":"function","span":{"start":[78,1],"end":[80,2],"bytes":[1835,1961]},"signature":"github.com/benbjohnson/litestream.SnapshotsPathV3","parameters":[{"name":"root","type":"string","span":{"start":[78,1],"end":[78,55],"bytes":[1835,1889]}},{"name":"generation","type":"string","span":{"start":[78,1],"end":[78,55],"bytes":[1835,1889]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"79:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3@79:9","span":{"start":[79,9],"end":[79,70],"bytes":[1898,1959]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream.WALPathV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALPathV3","kind":"function","span":{"start":[83,1],"end":[85,2],"bytes":[2030,2144]},"signature":"github.com/benbjohnson/litestream.WALPathV3","parameters":[{"name":"root","type":"string","span":{"start":[83,1],"end":[83,49],"bytes":[2030,2078]}},{"name":"generation","type":"string","span":{"start":[83,1],"end":[83,49],"bytes":[2030,2078]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"84:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALPathV3@84:9","span":{"start":[84,9],"end":[84,64],"bytes":[2087,2142]},"callee":"can://litestream/litestream/@external/path/Join"}}},"github.com/benbjohnson/litestream.WALSegmentPathV3":{"id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","kind":"function","span":{"start":[93,1],"end":[95,2],"bytes":[2439,2611]},"signature":"github.com/benbjohnson/litestream.WALSegmentPathV3","parameters":[{"name":"root","type":"string","span":{"start":[93,1],"end":[93,81],"bytes":[2439,2519]}},{"name":"generation","type":"string","span":{"start":[93,1],"end":[93,81],"bytes":[2439,2519]}},{"name":"index","type":"int","span":{"start":[93,1],"end":[93,81],"bytes":[2439,2519]}},{"name":"offset","type":"int64","span":{"start":[93,1],"end":[93,81],"bytes":[2439,2519]}}],"return_type":"string","metrics":{"cyclomatic":1},"body":{"94:19":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3@94:19","span":{"start":[94,19],"end":[94,46],"bytes":[2538,2565]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALPathV3"},"94:48":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3@94:48","span":{"start":[94,48],"end":[94,89],"bytes":[2567,2608]},"callee":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3"},"94:9":{"kind":"call","id":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3@94:9","span":{"start":[94,9],"end":[94,90],"bytes":[2528,2609]},"callee":"can://litestream/litestream/@external/path/Join"}}}},"content_hash":"3bf323f796fa9b0118b9e5f58dc008d33d364a47dafdf1657d0333a57bf1e546"},"wal_reader.go":{"id":"can://litestream/litestream/go/wal_reader.go","kind":"module","span":{"start":[1,1],"end":[318,1],"bytes":[0,9615]},"package":"litestream","source":"package litestream\n\nimport (\n\t\"context\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\n// WALReader wraps an io.Reader and parses SQLite WAL frames.\n//\n// This reader verifies the salt \u0026 checksum integrity while it reads. It does\n// not enforce transaction boundaries (i.e. it may return uncommitted frames).\n// It is the responsibility of the caller to handle this.\ntype WALReader struct {\n\tr io.ReaderAt\n\tframeN int\n\n\tbo binary.ByteOrder\n\tpageSize uint32\n\tseq uint32\n\n\tsalt1, salt2 uint32\n\tchksum1, chksum2 uint32\n\n\tlogger *slog.Logger\n}\n\n// NewWALReader returns a new instance of WALReader.\nfunc NewWALReader(rd io.ReaderAt, logger *slog.Logger) (*WALReader, error) {\n\tr := \u0026WALReader{r: rd, logger: logger}\n\tif err := r.readHeader(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn r, nil\n}\n\n// NewWALReaderWithOffset returns a new instance of WALReader at a given offset.\n// Salt must match or else no frames will be returned. Checksum calculated from\n// from previous page.\nfunc NewWALReaderWithOffset(ctx context.Context, rd io.ReaderAt, offset int64, salt1, salt2 uint32, logger *slog.Logger) (*WALReader, error) {\n\t// Ensure we are not starting on the first page since we need to read the previous.\n\tif offset \u003c= WALHeaderSize {\n\t\treturn nil, fmt.Errorf(\"offset (%d) must be greater than the wal header size (%d)\", offset, WALHeaderSize)\n\t}\n\n\tr := \u0026WALReader{r: rd, logger: logger}\n\n\t// Read header to determine page size \u0026 byte order.\n\tif err := r.readHeader(); err != nil {\n\t\treturn nil, fmt.Errorf(\"read header: %w\", err)\n\t}\n\n\t// Load in salt in case the beginning of the file has been overwritten.\n\tr.salt1, r.salt2 = salt1, salt2\n\n\t// Ensure offset is positioned on a frame start.\n\tframeSize := int64(r.pageSize + WALFrameHeaderSize)\n\tif (offset-WALHeaderSize)%frameSize != 0 {\n\t\treturn nil, fmt.Errorf(\"unaligned wal offset %d for page size %d\", offset, r.pageSize)\n\t}\n\tr.frameN = int((offset - WALHeaderSize) / frameSize)\n\n\t// Read previous page to load checksum. Context errors are returned as-is\n\t// so callers don't mistake a cancellation for a frame mismatch.\n\tr.frameN--\n\tif _, _, err := r.readFrame(ctx, make([]byte, r.pageSize), false); err != nil {\n\t\tif ctx.Err() != nil {\n\t\t\treturn nil, context.Cause(ctx)\n\t\t}\n\t\treturn nil, \u0026PrevFrameMismatchError{Err: err}\n\t}\n\n\treturn r, nil\n}\n\n// PageSize returns the page size from the header. Must call ReadHeader() first.\nfunc (r *WALReader) PageSize() uint32 { return r.pageSize }\n\n// Offset returns the file offset of the last read frame.\n// Returns zero if no frames have been read.\nfunc (r *WALReader) Offset() int64 {\n\tif r.frameN == 0 {\n\t\treturn 0\n\t}\n\treturn WALHeaderSize + ((int64(r.frameN) - 1) * (WALFrameHeaderSize + int64(r.pageSize)))\n}\n\n// readHeader reads the WAL header into the reader. Returns io.EOF if WAL is invalid.\nfunc (r *WALReader) readHeader() error {\n\t// If we have a partial WAL, then mark WAL as done.\n\thdr := make([]byte, WALHeaderSize)\n\tif n, err := r.r.ReadAt(hdr, 0); n \u003c len(hdr) {\n\t\treturn io.EOF\n\t} else if err != nil {\n\t\treturn err\n\t}\n\n\t// Determine byte order of checksums.\n\tswitch magic := binary.BigEndian.Uint32(hdr[0:]); magic {\n\tcase 0x377f0682:\n\t\tr.bo = binary.LittleEndian\n\tcase 0x377f0683:\n\t\tr.bo = binary.BigEndian\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid wal header magic: %x\", magic)\n\t}\n\n\t// If the header checksum doesn't match then we may have failed with\n\t// a partial WAL header write during checkpointing.\n\tchksum1 := binary.BigEndian.Uint32(hdr[24:])\n\tchksum2 := binary.BigEndian.Uint32(hdr[28:])\n\tif v0, v1 := WALChecksum(r.bo, 0, 0, hdr[:24]); v0 != chksum1 || v1 != chksum2 {\n\t\treturn io.EOF\n\t}\n\n\t// Verify version is correct.\n\tif version := binary.BigEndian.Uint32(hdr[4:]); version != 3007000 {\n\t\treturn fmt.Errorf(\"unsupported wal version: %d\", version)\n\t}\n\n\tr.pageSize = binary.BigEndian.Uint32(hdr[8:])\n\tr.seq = binary.BigEndian.Uint32(hdr[12:])\n\tr.salt1 = binary.BigEndian.Uint32(hdr[16:])\n\tr.salt2 = binary.BigEndian.Uint32(hdr[20:])\n\tr.chksum1, r.chksum2 = chksum1, chksum2\n\n\treturn nil\n}\n\n// ReadFrame reads the next frame from the WAL and returns the page number.\n// Returns io.EOF at the end of the valid WAL.\nfunc (r *WALReader) ReadFrame(ctx context.Context, data []byte) (pgno, commit uint32, err error) {\n\treturn r.readFrame(ctx, data, true)\n}\n\nfunc (r *WALReader) readFrame(ctx context.Context, data []byte, verifyChecksum bool) (pgno, commit uint32, err error) {\n\tselect {\n\tcase \u003c-ctx.Done():\n\t\treturn 0, 0, context.Cause(ctx)\n\tdefault:\n\t}\n\n\tif len(data) != int(r.pageSize) {\n\t\treturn 0, 0, fmt.Errorf(\"WALReader.ReadFrame(): buffer size (%d) must match page size (%d)\", len(data), r.pageSize)\n\t}\n\n\tframeSize := r.pageSize + WALFrameHeaderSize\n\toffset := WALHeaderSize + (int64(r.frameN) * int64(frameSize))\n\n\t// Read WAL frame header.\n\thdr := make([]byte, WALFrameHeaderSize)\n\tif n, err := r.r.ReadAt(hdr, offset); n != len(hdr) {\n\t\treturn 0, 0, io.EOF\n\t} else if err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// Read WAL page data.\n\tif n, err := r.r.ReadAt(data, offset+WALFrameHeaderSize); n != len(data) {\n\t\treturn 0, 0, io.EOF\n\t} else if err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// Verify salt matches the salt in the header.\n\tsalt1 := binary.BigEndian.Uint32(hdr[8:])\n\tsalt2 := binary.BigEndian.Uint32(hdr[12:])\n\tif r.salt1 != salt1 || r.salt2 != salt2 {\n\t\treturn 0, 0, io.EOF\n\t}\n\n\t// Verify the checksum is valid. If checksum verification is disabled, it\n\t// is because we are jumping to an offset and not checksumming from the beginning.\n\tchksum1 := binary.BigEndian.Uint32(hdr[16:])\n\tchksum2 := binary.BigEndian.Uint32(hdr[20:])\n\tif verifyChecksum {\n\t\tr.chksum1, r.chksum2 = WALChecksum(r.bo, r.chksum1, r.chksum2, hdr[:8]) // frame header\n\t\tr.chksum1, r.chksum2 = WALChecksum(r.bo, r.chksum1, r.chksum2, data) // frame data\n\t\tif r.chksum1 != chksum1 || r.chksum2 != chksum2 {\n\t\t\treturn 0, 0, io.EOF\n\t\t}\n\t} else {\n\t\tr.chksum1, r.chksum2 = chksum1, chksum2\n\t}\n\n\tpgno = binary.BigEndian.Uint32(hdr[0:])\n\tcommit = binary.BigEndian.Uint32(hdr[4:])\n\n\tr.frameN++\n\n\treturn pgno, commit, nil\n}\n\n// PageMap reads all committed frames until the end of the file and returns a\n// map of pgno to offset of the latest version of each page. Also returns the\n// max offset of the wal segment read, and the final database size, in pages.\nfunc (r *WALReader) PageMap(ctx context.Context) (m map[uint32]int64, maxOffset int64, commit uint32, err error) {\n\tm, maxOffset, commit, _, err = r.pageMap(ctx, 0)\n\treturn m, maxOffset, commit, err\n}\n\nfunc (r *WALReader) pageMap(ctx context.Context, maxBytes int64) (m map[uint32]int64, maxOffset int64, commit uint32, limited bool, err error) {\n\tm = make(map[uint32]int64)\n\ttxMap := make(map[uint32]int64)\n\tdata := make([]byte, r.pageSize)\n\tframeSize := int64(WALFrameHeaderSize + r.pageSize)\n\tstartOffset := WALHeaderSize + int64(r.frameN)*frameSize\n\tfor {\n\t\tpgno, fcommit, err := r.ReadFrame(ctx, data)\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn nil, 0, 0, false, err\n\t\t}\n\n\t\t// Update latest offset for the page for this transaction.\n\t\t// Pages should not be saved to full map until we know txn is committed.\n\t\toffset := r.Offset()\n\t\ttxMap[pgno] = offset\n\n\t\t// For commit records, transfer offsets to full map and update db size.\n\t\tif fcommit != 0 {\n\t\t\tfor pgno, offset := range txMap {\n\t\t\t\tm[pgno] = offset\n\t\t\t}\n\t\t\ttxMap = make(map[uint32]int64)\n\t\t\tcommit = fcommit\n\n\t\t\tif maxBytes \u003e 0 \u0026\u0026 r.Offset()+frameSize-startOffset \u003e= maxBytes {\n\t\t\t\tlimited = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove pages that exceed the final commit size. This can occur when the\n\t// database shrinks (e.g., via VACUUM) between transactions in the WAL.\n\tfor pgno := range m {\n\t\tif pgno \u003e commit {\n\t\t\tdelete(m, pgno)\n\t\t}\n\t}\n\n\t// If full transactions available, return the original offset.\n\tif len(m) == 0 {\n\t\treturn m, 0, 0, limited, nil\n\t}\n\n\t// Compute the highest page offsets.\n\tvar end int64\n\tfor _, offset := range m {\n\t\tif end == 0 || offset \u003e end {\n\t\t\tend = offset\n\t\t}\n\t}\n\n\t// Extend to the end of the last frame read.\n\tend += WALFrameHeaderSize + int64(r.pageSize)\n\n\tr.logger.Log(ctx, internal.LevelTrace, \"page map complete\", \"n\", len(m), \"end\", end, \"commit\", commit)\n\treturn m, end, commit, limited, nil\n}\n\n// FrameSaltsUntil returns a set of all unique frame salts in the WAL file.\nfunc (r *WALReader) FrameSaltsUntil(ctx context.Context, until [2]uint32) (map[[2]uint32]struct{}, error) {\n\tm := make(map[[2]uint32]struct{})\n\tfor offset := int64(WALHeaderSize); ; offset += int64(WALFrameHeaderSize + r.pageSize) {\n\t\thdr := make([]byte, WALFrameHeaderSize)\n\t\tif n, err := r.r.ReadAt(hdr, offset); n != len(hdr) {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tsalt1 := binary.BigEndian.Uint32(hdr[8:])\n\t\tsalt2 := binary.BigEndian.Uint32(hdr[12:])\n\n\t\t// Track unique salts.\n\t\tm[[2]uint32{salt1, salt2}] = struct{}{}\n\n\t\t// Only read salts until the last one we expect.\n\t\tif salt1 == until[0] \u0026\u0026 salt2 == until[1] {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn m, nil\n}\n\n// WALChecksum computes a running SQLite WAL checksum over a byte slice.\nfunc WALChecksum(bo binary.ByteOrder, s0, s1 uint32, b []byte) (uint32, uint32) {\n\tassert(len(b)%8 == 0, \"misaligned checksum byte slice\")\n\n\t// Iterate over 8-byte units and compute checksum.\n\tfor i := 0; i \u003c len(b); i += 8 {\n\t\ts0 += bo.Uint32(b[i:]) + s1\n\t\ts1 += bo.Uint32(b[i+4:]) + s0\n\t}\n\treturn s0, s1\n}\n\ntype PrevFrameMismatchError struct {\n\tErr error\n}\n\nfunc (e *PrevFrameMismatchError) Error() string {\n\treturn fmt.Sprintf(\"prev frame mismatch: %s\", e.Err)\n}\n\nfunc (e *PrevFrameMismatchError) Unwrap() error {\n\treturn e.Err\n}\n","imports":[{"name":"context","path":"context","span":{"start":[4,1],"end":[4,11],"bytes":[29,39]}},{"name":"binary","path":"encoding/binary","span":{"start":[5,1],"end":[5,19],"bytes":[40,58]}},{"name":"errors","path":"errors","span":{"start":[6,1],"end":[6,10],"bytes":[59,68]}},{"name":"fmt","path":"fmt","span":{"start":[7,1],"end":[7,7],"bytes":[69,75]}},{"name":"io","path":"io","span":{"start":[8,1],"end":[8,6],"bytes":[76,81]}},{"name":"slog","path":"log/slog","span":{"start":[9,1],"end":[9,12],"bytes":[82,93]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[11,1],"end":[11,46],"bytes":[95,140]}}],"types":{"PrevFrameMismatchError":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError","kind":"struct","span":{"start":[307,1],"end":[309,2],"bytes":[9391,9440]},"callables":{"github.com/benbjohnson/litestream.PrevFrameMismatchError.Error":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError/github.com/benbjohnson/litestream.PrevFrameMismatchError.Error","kind":"method","span":{"start":[311,1],"end":[313,2],"bytes":[9442,9547]},"signature":"github.com/benbjohnson/litestream.PrevFrameMismatchError.Error","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{"312:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError/github.com/benbjohnson/litestream.PrevFrameMismatchError.Error@312:9","span":{"start":[312,9],"end":[312,54],"bytes":[9500,9545]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream.PrevFrameMismatchError.Unwrap":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError/github.com/benbjohnson/litestream.PrevFrameMismatchError.Unwrap","kind":"method","span":{"start":[315,1],"end":[317,2],"bytes":[9549,9614]},"signature":"github.com/benbjohnson/litestream.PrevFrameMismatchError.Unwrap","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{}}},"fields":{"Err":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError/Err","kind":"field","type":"error","span":{"start":[308,1],"end":[308,11],"bytes":[9428,9438]}}}},"WALReader":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader","kind":"struct","span":{"start":[19,1],"end":[31,2],"bytes":[424,616]},"callables":{"github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil","kind":"method","span":{"start":[270,1],"end":[293,2],"bytes":[8330,9007]},"signature":"github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[270,1],"end":[270,108],"bytes":[8330,8437]}},{"name":"until","type":"[2]uint32","span":{"start":[270,1],"end":[270,108],"bytes":[8330,8437]}}],"return_type":"(map[[2]uint32]struct{}, error)","error_channel":["error"],"metrics":{"cyclomatic":5},"body":{"271:7":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil@271:7","span":{"start":[271,7],"end":[271,35],"bytes":[8444,8472]},"callee":null},"272:16":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil@272:16","span":{"start":[272,16],"end":[272,36],"bytes":[8488,8508]},"callee":null},"272:50":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil@272:50","span":{"start":[272,50],"end":[272,88],"bytes":[8522,8560]},"callee":null},"273:10":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil@273:10","span":{"start":[273,10],"end":[273,42],"bytes":[8572,8604]},"callee":null},"274:16":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil@274:16","span":{"start":[274,16],"end":[274,39],"bytes":[8620,8643]},"callee":"can://litestream/litestream/@external/io/ReaderAt.ReadAt"},"274:46":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil@274:46","span":{"start":[274,46],"end":[274,54],"bytes":[8650,8658]},"callee":null},"280:12":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil@280:12","span":{"start":[280,12],"end":[280,44],"bytes":[8730,8762]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"281:12":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil@281:12","span":{"start":[281,12],"end":[281,45],"bytes":[8774,8807]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"}}},"github.com/benbjohnson/litestream.WALReader.Offset":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset","kind":"method","span":{"start":[86,1],"end":[91,2],"bytes":[2621,2784]},"signature":"github.com/benbjohnson/litestream.WALReader.Offset","parameters":[],"return_type":"int64","metrics":{"cyclomatic":2},"body":{"90:27":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset@90:27","span":{"start":[90,27],"end":[90,42],"bytes":[2718,2733]},"callee":null},"90:72":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset@90:72","span":{"start":[90,72],"end":[90,89],"bytes":[2763,2780]},"callee":null}}},"github.com/benbjohnson/litestream.WALReader.PageMap":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.PageMap","kind":"method","span":{"start":[202,1],"end":[205,2],"bytes":[6328,6528]},"signature":"github.com/benbjohnson/litestream.WALReader.PageMap","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[202,1],"end":[202,115],"bytes":[6328,6442]}}],"return_type":"(map[uint32]int64, int64, uint32, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"203:33":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.PageMap@203:33","span":{"start":[203,33],"end":[203,50],"bytes":[6475,6492]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap"}}},"github.com/benbjohnson/litestream.WALReader.PageSize":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.PageSize","kind":"method","span":{"start":[82,1],"end":[82,60],"bytes":[2457,2516]},"signature":"github.com/benbjohnson/litestream.WALReader.PageSize","parameters":[],"return_type":"uint32","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream.WALReader.ReadFrame":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame","kind":"method","span":{"start":[137,1],"end":[139,2],"bytes":[4212,4349]},"signature":"github.com/benbjohnson/litestream.WALReader.ReadFrame","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[137,1],"end":[137,99],"bytes":[4212,4310]}},{"name":"data","type":"[]byte","span":{"start":[137,1],"end":[137,99],"bytes":[4212,4310]}}],"return_type":"(uint32, uint32, error)","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"138:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame@138:9","span":{"start":[138,9],"end":[138,37],"bytes":[4319,4347]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame"}}},"github.com/benbjohnson/litestream.WALReader.pageMap":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","kind":"method","span":{"start":[207,1],"end":[267,2],"bytes":[6530,8252]},"signature":"github.com/benbjohnson/litestream.WALReader.pageMap","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[207,1],"end":[207,145],"bytes":[6530,6674]}},{"name":"maxBytes","type":"int64","span":{"start":[207,1],"end":[207,145],"bytes":[6530,6674]}}],"return_type":"(map[uint32]int64, int64, uint32, bool, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"208:6":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@208:6","span":{"start":[208,6],"end":[208,28],"bytes":[6680,6702]},"callee":null},"209:11":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@209:11","span":{"start":[209,11],"end":[209,33],"bytes":[6713,6735]},"callee":null},"210:10":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@210:10","span":{"start":[210,10],"end":[210,34],"bytes":[6745,6769]},"callee":null},"211:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@211:15","span":{"start":[211,15],"end":[211,53],"bytes":[6784,6822]},"callee":null},"212:33":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@212:33","span":{"start":[212,33],"end":[212,48],"bytes":[6855,6870]},"callee":null},"214:25":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@214:25","span":{"start":[214,25],"end":[214,47],"bytes":[6912,6934]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame"},"215:6":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@215:6","span":{"start":[215,6],"end":[215,28],"bytes":[6940,6962]},"callee":"can://litestream/litestream/@external/errors/Is"},"223:13":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@223:13","span":{"start":[223,13],"end":[223,23],"bytes":[7184,7194]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset"},"231:12":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@231:12","span":{"start":[231,12],"end":[231,34],"bytes":[7387,7409]},"callee":null},"234:23":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@234:23","span":{"start":[234,23],"end":[234,33],"bytes":[7453,7463]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset"},"245:4":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@245:4","span":{"start":[245,4],"end":[245,19],"bytes":[7738,7753]},"callee":null},"250:5":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@250:5","span":{"start":[250,5],"end":[250,11],"bytes":[7830,7836]},"callee":null},"263:30":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@263:30","span":{"start":[263,30],"end":[263,47],"bytes":[8091,8108]},"callee":null},"265:2":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@265:2","span":{"start":[265,2],"end":[265,104],"bytes":[8111,8213]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Log"},"265:67":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap@265:67","span":{"start":[265,67],"end":[265,73],"bytes":[8176,8182]},"callee":null}}},"github.com/benbjohnson/litestream.WALReader.readFrame":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","kind":"method","span":{"start":[141,1],"end":[197,2],"bytes":[4351,6092]},"signature":"github.com/benbjohnson/litestream.WALReader.readFrame","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[141,1],"end":[141,120],"bytes":[4351,4470]}},{"name":"data","type":"[]byte","span":{"start":[141,1],"end":[141,120],"bytes":[4351,4470]}},{"name":"verifyChecksum","type":"bool","span":{"start":[141,1],"end":[141,120],"bytes":[4351,4470]}}],"return_type":"(uint32, uint32, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"143:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@143:9","span":{"start":[143,9],"end":[143,19],"bytes":[4489,4499]},"callee":"can://litestream/litestream/@external/context/Context.Done"},"144:16":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@144:16","span":{"start":[144,16],"end":[144,34],"bytes":[4516,4534]},"callee":"can://litestream/litestream/@external/context/Cause"},"148:18":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@148:18","span":{"start":[148,18],"end":[148,33],"bytes":[4566,4581]},"callee":null},"148:5":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@148:5","span":{"start":[148,5],"end":[148,14],"bytes":[4553,4562]},"callee":null},"149:16":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@149:16","span":{"start":[149,16],"end":[149,118],"bytes":[4599,4701]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"149:96":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@149:96","span":{"start":[149,96],"end":[149,105],"bytes":[4679,4688]},"callee":null},"153:29":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@153:29","span":{"start":[153,29],"end":[153,44],"bytes":[4780,4795]},"callee":null},"153:47":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@153:47","span":{"start":[153,47],"end":[153,63],"bytes":[4798,4814]},"callee":null},"156:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@156:9","span":{"start":[156,9],"end":[156,41],"bytes":[4852,4884]},"callee":null},"157:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@157:15","span":{"start":[157,15],"end":[157,38],"bytes":[4899,4922]},"callee":"can://litestream/litestream/@external/io/ReaderAt.ReadAt"},"157:45":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@157:45","span":{"start":[157,45],"end":[157,53],"bytes":[4929,4937]},"callee":null},"164:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@164:15","span":{"start":[164,15],"end":[164,58],"bytes":[5047,5090]},"callee":"can://litestream/litestream/@external/io/ReaderAt.ReadAt"},"164:65":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@164:65","span":{"start":[164,65],"end":[164,74],"bytes":[5097,5106]},"callee":null},"171:11":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@171:11","span":{"start":[171,11],"end":[171,43],"bytes":[5236,5268]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"172:11":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@172:11","span":{"start":[172,11],"end":[172,44],"bytes":[5279,5312]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"179:13":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@179:13","span":{"start":[179,13],"end":[179,46],"bytes":[5553,5586]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"180:13":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@180:13","span":{"start":[180,13],"end":[180,46],"bytes":[5599,5632]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"182:26":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@182:26","span":{"start":[182,26],"end":[182,74],"bytes":[5679,5727]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum"},"183:26":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@183:26","span":{"start":[183,26],"end":[183,71],"bytes":[5769,5814]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum"},"191:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@191:9","span":{"start":[191,9],"end":[191,41],"bytes":[5975,6007]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"192:11":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame@192:11","span":{"start":[192,11],"end":[192,43],"bytes":[6018,6050]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"}}},"github.com/benbjohnson/litestream.WALReader.readHeader":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","kind":"method","span":{"start":[94,1],"end":[133,2],"bytes":[2872,4087]},"signature":"github.com/benbjohnson/litestream.WALReader.readHeader","parameters":[],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"104:18":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@104:18","span":{"start":[104,18],"end":[104,50],"bytes":[3164,3196]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"110:10":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@110:10","span":{"start":[110,10],"end":[110,59],"bytes":[3316,3365]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"115:13":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@115:13","span":{"start":[115,13],"end":[115,46],"bytes":[3505,3538]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"116:13":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@116:13","span":{"start":[116,13],"end":[116,46],"bytes":[3551,3584]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"117:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@117:15","span":{"start":[117,15],"end":[117,48],"bytes":[3599,3632]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum"},"122:16":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@122:16","span":{"start":[122,16],"end":[122,48],"bytes":[3733,3765]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"123:10":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@123:10","span":{"start":[123,10],"end":[123,60],"bytes":[3797,3847]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"126:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@126:15","span":{"start":[126,15],"end":[126,47],"bytes":[3866,3898]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"127:10":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@127:10","span":{"start":[127,10],"end":[127,43],"bytes":[3908,3941]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"128:12":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@128:12","span":{"start":[128,12],"end":[128,45],"bytes":[3953,3986]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"129:12":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@129:12","span":{"start":[129,12],"end":[129,45],"bytes":[3998,4031]},"callee":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32"},"96:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@96:9","span":{"start":[96,9],"end":[96,36],"bytes":[2974,3001]},"callee":null},"97:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@97:15","span":{"start":[97,15],"end":[97,33],"bytes":[3016,3034]},"callee":"can://litestream/litestream/@external/io/ReaderAt.ReadAt"},"97:39":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader@97:39","span":{"start":[97,39],"end":[97,47],"bytes":[3040,3048]},"callee":null}}}},"fields":{"bo":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/bo","kind":"field","type":"encoding/binary.ByteOrder","span":{"start":[23,1],"end":[23,27],"bytes":[481,507]}},"chksum1":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/chksum1","kind":"field","type":"uint32","span":{"start":[28,1],"end":[28,25],"bytes":[568,592]}},"chksum2":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/chksum2","kind":"field","type":"uint32","span":{"start":[28,1],"end":[28,25],"bytes":[568,592]}},"frameN":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/frameN","kind":"field","type":"int","span":{"start":[21,1],"end":[21,12],"bytes":[468,479]}},"logger":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[30,1],"end":[30,21],"bytes":[594,614]}},"pageSize":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/pageSize","kind":"field","type":"uint32","span":{"start":[24,1],"end":[24,17],"bytes":[508,524]}},"r":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/r","kind":"field","type":"io.ReaderAt","span":{"start":[20,1],"end":[20,20],"bytes":[448,467]}},"salt1":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/salt1","kind":"field","type":"uint32","span":{"start":[27,1],"end":[27,25],"bytes":[543,567]}},"salt2":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/salt2","kind":"field","type":"uint32","span":{"start":[27,1],"end":[27,25],"bytes":[543,567]}},"seq":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/seq","kind":"field","type":"uint32","span":{"start":[25,1],"end":[25,17],"bytes":[525,541]}}}}},"functions":{"github.com/benbjohnson/litestream.NewWALReader":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","kind":"function","span":{"start":[34,1],"end":[40,2],"bytes":[671,865]},"signature":"github.com/benbjohnson/litestream.NewWALReader","parameters":[{"name":"rd","type":"io.ReaderAt","span":{"start":[34,1],"end":[34,77],"bytes":[671,747]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[34,1],"end":[34,77],"bytes":[671,747]}}],"return_type":"(*github.com/benbjohnson/litestream.WALReader, error)","error_channel":["error"],"metrics":{"cyclomatic":2},"body":{"36:12":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader@36:12","span":{"start":[36,12],"end":[36,26],"bytes":[799,813]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader"}}},"github.com/benbjohnson/litestream.NewWALReaderWithOffset":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","kind":"function","span":{"start":[45,1],"end":[79,2],"bytes":[1051,2374]},"signature":"github.com/benbjohnson/litestream.NewWALReaderWithOffset","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"rd","type":"io.ReaderAt","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"offset","type":"int64","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"salt1","type":"uint32","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"salt2","type":"uint32","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}},{"name":"logger","type":"*log/slog.Logger","span":{"start":[45,1],"end":[45,143],"bytes":[1051,1193]}}],"return_type":"(*github.com/benbjohnson/litestream.WALReader, error)","error_channel":["error"],"metrics":{"cyclomatic":6},"body":{"48:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@48:15","span":{"start":[48,15],"end":[48,109],"bytes":[1323,1417]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"54:12":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@54:12","span":{"start":[54,12],"end":[54,26],"bytes":[1527,1541]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader"},"55:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@55:15","span":{"start":[55,15],"end":[55,49],"bytes":[1570,1604]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"62:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@62:15","span":{"start":[62,15],"end":[62,53],"bytes":[1780,1818]},"callee":null},"64:15":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@64:15","span":{"start":[64,15],"end":[64,89],"bytes":[1877,1951]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"66:13":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@66:13","span":{"start":[66,13],"end":[66,54],"bytes":[1967,2008]},"callee":null},"71:18":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@71:18","span":{"start":[71,18],"end":[71,67],"bytes":[2180,2229]},"callee":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame"},"71:35":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@71:35","span":{"start":[71,35],"end":[71,59],"bytes":[2197,2221]},"callee":null},"72:6":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@72:6","span":{"start":[72,6],"end":[72,15],"bytes":[2249,2258]},"callee":"can://litestream/litestream/@external/context/Context.Err"},"73:16":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset@73:16","span":{"start":[73,16],"end":[73,34],"bytes":[2283,2301]},"callee":"can://litestream/litestream/@external/context/Cause"}}},"github.com/benbjohnson/litestream.WALChecksum":{"id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","kind":"function","span":{"start":[296,1],"end":[305,2],"bytes":[9082,9389]},"signature":"github.com/benbjohnson/litestream.WALChecksum","parameters":[{"name":"bo","type":"encoding/binary.ByteOrder","span":{"start":[296,1],"end":[296,82],"bytes":[9082,9163]}},{"name":"s0","type":"uint32","span":{"start":[296,1],"end":[296,82],"bytes":[9082,9163]}},{"name":"s1","type":"uint32","span":{"start":[296,1],"end":[296,82],"bytes":[9082,9163]}},{"name":"b","type":"[]byte","span":{"start":[296,1],"end":[296,82],"bytes":[9082,9163]}}],"return_type":"(uint32, uint32)","metrics":{"cyclomatic":2},"body":{"297:2":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum@297:2","span":{"start":[297,2],"end":[297,57],"bytes":[9165,9220]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert"},"297:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum@297:9","span":{"start":[297,9],"end":[297,15],"bytes":[9172,9178]},"callee":null},"300:18":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum@300:18","span":{"start":[300,18],"end":[300,24],"bytes":[9291,9297]},"callee":null},"301:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum@301:9","span":{"start":[301,9],"end":[301,25],"bytes":[9316,9332]},"callee":"can://litestream/litestream/@external/encoding/binary/ByteOrder.Uint32"},"302:9":{"kind":"call","id":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum@302:9","span":{"start":[302,9],"end":[302,27],"bytes":[9346,9364]},"callee":"can://litestream/litestream/@external/encoding/binary/ByteOrder.Uint32"}}}},"content_hash":"00f72ee5d55ca0780b8d6725f51cf1c0a5be718454fba7b3cfd642b4749a3297"},"webdav/replica_client.go":{"id":"can://litestream/litestream/go/webdav/replica_client.go","kind":"module","span":{"start":[1,1],"end":[372,1],"bytes":[0,10831]},"package":"webdav","source":"package webdav\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/studio-b12/gowebdav\"\n\t\"github.com/superfly/ltx\"\n\n\t\"github.com/benbjohnson/litestream\"\n\t\"github.com/benbjohnson/litestream/internal\"\n)\n\nfunc init() {\n\tlitestream.RegisterReplicaClientFactory(\"webdav\", NewReplicaClientFromURL)\n\tlitestream.RegisterReplicaClientFactory(\"webdavs\", NewReplicaClientFromURL)\n}\n\nconst ReplicaClientType = \"webdav\"\n\nconst (\n\tDefaultTimeout = 30 * time.Second\n)\n\nvar _ litestream.ReplicaClient = (*ReplicaClient)(nil)\n\ntype ReplicaClient struct {\n\tmu sync.Mutex\n\tclient *gowebdav.Client\n\tlogger *slog.Logger\n\n\tURL string\n\tUsername string\n\tPassword string\n\tPath string\n\tTimeout time.Duration\n}\n\nfunc NewReplicaClient() *ReplicaClient {\n\treturn \u0026ReplicaClient{\n\t\tlogger: slog.Default().WithGroup(ReplicaClientType),\n\t\tTimeout: DefaultTimeout,\n\t}\n}\n\nfunc (c *ReplicaClient) SetLogger(logger *slog.Logger) {\n\tc.logger = logger.WithGroup(ReplicaClientType)\n}\n\n// NewReplicaClientFromURL creates a new ReplicaClient from URL components.\n// This is used by the replica client factory registration.\n// URL format: webdav://[user[:password]@]host[:port]/path or webdavs://... (for HTTPS)\nfunc NewReplicaClientFromURL(scheme, host, urlPath string, query url.Values, userinfo *url.Userinfo) (litestream.ReplicaClient, error) {\n\tclient := NewReplicaClient()\n\n\t// Determine HTTP or HTTPS based on scheme\n\thttpScheme := \"http\"\n\tif scheme == \"webdavs\" {\n\t\thttpScheme = \"https\"\n\t}\n\n\t// Extract credentials from userinfo\n\tif userinfo != nil {\n\t\tclient.Username = userinfo.Username()\n\t\tclient.Password, _ = userinfo.Password()\n\t}\n\n\tif host == \"\" {\n\t\treturn nil, fmt.Errorf(\"host required for webdav replica URL\")\n\t}\n\n\tclient.URL = fmt.Sprintf(\"%s://%s\", httpScheme, host)\n\tclient.Path = urlPath\n\n\treturn client, nil\n}\n\nfunc (c *ReplicaClient) Type() string {\n\treturn ReplicaClientType\n}\n\nfunc (c *ReplicaClient) Init(ctx context.Context) error {\n\t_, err := c.init(ctx)\n\treturn err\n}\n\n// init initializes the connection and returns the WebDAV client.\nfunc (c *ReplicaClient) init(ctx context.Context) (_ *gowebdav.Client, err error) {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\n\tif c.client != nil {\n\t\treturn c.client, nil\n\t}\n\n\tif c.URL == \"\" {\n\t\treturn nil, fmt.Errorf(\"webdav url required\")\n\t}\n\n\tc.client = gowebdav.NewClient(c.URL, c.Username, c.Password)\n\n\tc.client.SetTimeout(c.Timeout)\n\n\tif err := c.client.Connect(); err != nil {\n\t\tc.client = nil\n\t\treturn nil, fmt.Errorf(\"webdav: cannot connect to server: %w\", err)\n\t}\n\n\treturn c.client, nil\n}\n\nfunc (c *ReplicaClient) DeleteAll(ctx context.Context) error {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := client.RemoveAll(c.Path); err != nil \u0026\u0026 !os.IsNotExist(err) \u0026\u0026 !gowebdav.IsErrNotFound(err) {\n\t\treturn fmt.Errorf(\"webdav: cannot delete path %q: %w\", c.Path, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\n\treturn nil\n}\n\nfunc (c *ReplicaClient) LTXFiles(ctx context.Context, level int, seek ltx.TXID, _ bool) (_ ltx.FileIterator, err error) {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdir := litestream.LTXLevelDir(c.Path, level)\n\tfiles, err := client.ReadDir(dir)\n\tif err != nil {\n\t\tif os.IsNotExist(err) || gowebdav.IsErrNotFound(err) {\n\t\t\treturn ltx.NewFileInfoSliceIterator(nil), nil\n\t\t}\n\t\treturn nil, fmt.Errorf(\"webdav: cannot read directory %q: %w\", dir, err)\n\t}\n\n\tinfos := make([]*ltx.FileInfo, 0, len(files))\n\tfor _, fi := range files {\n\t\tif fi.IsDir() {\n\t\t\tcontinue\n\t\t}\n\n\t\tminTXID, maxTXID, err := ltx.ParseFilename(path.Base(fi.Name()))\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t} else if minTXID \u003c seek {\n\t\t\tcontinue\n\t\t}\n\n\t\tinfos = append(infos, \u0026ltx.FileInfo{\n\t\t\tLevel: level,\n\t\t\tMinTXID: minTXID,\n\t\t\tMaxTXID: maxTXID,\n\t\t\tSize: fi.Size(),\n\t\t\tCreatedAt: fi.ModTime().UTC(),\n\t\t})\n\t}\n\n\tsort.Slice(infos, func(i, j int) bool {\n\t\tif infos[i].MinTXID != infos[j].MinTXID {\n\t\t\treturn infos[i].MinTXID \u003c infos[j].MinTXID\n\t\t}\n\t\treturn infos[i].MaxTXID \u003c infos[j].MaxTXID\n\t})\n\n\treturn ltx.NewFileInfoSliceIterator(infos), nil\n}\n\n// WriteLTXFile writes an LTX file to the WebDAV server.\n//\n// WebDAV Upload Strategy - Temp File Approach:\n//\n// Unlike other replica backends (S3, SFTP, NATS, ABS) which stream directly using\n// internal.NewReadCounter, WebDAV requires a different approach due to library and\n// protocol constraints:\n//\n// 1. gowebdav Library Limitations:\n//\n// - WriteStream() buffers entire payload in memory for non-seekable readers\n//\n// - WriteStreamWithLength() requires both content-length AND seekable reader\n//\n// - No native support for HTTP chunked transfer encoding\n//\n// 2. Server Compatibility Issues:\n// Research shows HTTP chunked transfer encoding with WebDAV is unreliable:\n//\n// - Nginx + FastCGI: Discards request body → 0-byte files (silent data loss)\n//\n// - Lighttpd: Returns HTTP 411 (Length Required), rejects chunked requests\n//\n// - Apache + FastCGI: Request body never arrives at application\n//\n// - Only Apache + mod_php handles chunked encoding reliably (~30-40% of deployments)\n//\n// 3. LTX Header Requirement:\n// - Must peek at LTX header to extract timestamp before upload\n// - Peeking consumes data, making the reader non-seekable\n// - Cannot calculate content-length without fully reading stream\n//\n// Solution: Stage to temporary file\n//\n// To ensure universal compatibility and prevent silent data loss:\n// 1. Extract timestamp from LTX header (required for file metadata)\n// 2. Stream full contents to temporary file on disk\n// 3. Seek back to start of temp file (now seekable + known size)\n// 4. Upload using WriteStreamWithLength() with Content-Length header\n// 5. Clean up temp file\n//\n// Trade-offs:\n// - Universal compatibility with all WebDAV server configurations\n// - No risk of silent data loss or failed uploads\n// - Predictable, reliable behavior\n// - Additional disk I/O overhead\n// - Requires local disk space proportional to LTX file size\n// - Diverges from streaming pattern used by other backends\n//\n// References:\n// - https://github.com/studio-b12/gowebdav/issues/35 (chunked encoding issues)\n// - https://github.com/nextcloud/server/issues/7995 (0-byte file bug)\n// - https://evertpot.com/260/ (WebDAV chunked encoding compatibility)\nfunc (c *ReplicaClient) WriteLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, rd io.Reader) (info *ltx.FileInfo, err error) {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\tvar buf bytes.Buffer\n\tteeReader := io.TeeReader(rd, \u0026buf)\n\n\thdr, _, err := ltx.PeekHeader(teeReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"extract timestamp from LTX header: %w\", err)\n\t}\n\ttimestamp := time.UnixMilli(hdr.Timestamp).UTC()\n\n\t// Stage to temporary file to get seekable reader with known size.\n\t// This ensures compatibility with all WebDAV servers and avoids the\n\t// unreliable chunked transfer encoding that causes silent data loss\n\t// on common configurations (Nginx+FastCGI, Lighttpd, Apache+FastCGI).\n\ttmpFile, err := os.CreateTemp(\"\", \"litestream-webdav-*.ltx\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot create temp file: %w\", err)\n\t}\n\tdefer func() {\n\t\t_ = tmpFile.Close()\n\t\t_ = os.Remove(tmpFile.Name())\n\t}()\n\n\tfullReader := io.MultiReader(\u0026buf, rd)\n\n\tsize, err := io.Copy(tmpFile, fullReader)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot copy to temp file: %w\", err)\n\t}\n\n\tif _, err := tmpFile.Seek(0, io.SeekStart); err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot seek temp file: %w\", err)\n\t}\n\n\tif err := client.MkdirAll(path.Dir(filename), 0755); err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot create parent directory %q: %w\", path.Dir(filename), err)\n\t}\n\n\t// Upload with Content-Length header using seekable temp file.\n\t// WriteStreamWithLength requires both a seekable reader and known size,\n\t// which we now have from the temp file. This avoids chunked encoding\n\t// and ensures reliable uploads across all WebDAV server configurations.\n\tif err := client.WriteStreamWithLength(filename, tmpFile, size, 0644); err != nil {\n\t\treturn nil, fmt.Errorf(\"webdav: cannot write file %q: %w\", filename, err)\n\t}\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Inc()\n\tinternal.OperationBytesCounterVec.WithLabelValues(ReplicaClientType, \"PUT\").Add(float64(size))\n\n\treturn \u0026ltx.FileInfo{\n\t\tLevel: level,\n\t\tMinTXID: minTXID,\n\t\tMaxTXID: maxTXID,\n\t\tSize: size,\n\t\tCreatedAt: timestamp,\n\t}, nil\n}\n\nfunc (c *ReplicaClient) OpenLTXFile(ctx context.Context, level int, minTXID, maxTXID ltx.TXID, offset, size int64) (_ io.ReadCloser, err error) {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfilename := litestream.LTXFilePath(c.Path, level, minTXID, maxTXID)\n\n\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"GET\").Inc()\n\n\tif size \u003e 0 {\n\t\trc, err := client.ReadStreamRange(filename, offset, size)\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) || gowebdav.IsErrNotFound(err) {\n\t\t\t\treturn nil, os.ErrNotExist\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"webdav: cannot read file %q: %w\", filename, err)\n\t\t}\n\t\treturn internal.LimitReadCloser(rc, size), nil\n\t}\n\n\tif offset \u003e 0 {\n\t\trc, err := client.ReadStream(filename)\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) || gowebdav.IsErrNotFound(err) {\n\t\t\t\treturn nil, os.ErrNotExist\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"webdav: cannot read file %q: %w\", filename, err)\n\t\t}\n\n\t\tif _, err := io.CopyN(io.Discard, rc, offset); err != nil {\n\t\t\tif err == io.EOF || err == io.ErrUnexpectedEOF {\n\t\t\t\t_ = rc.Close()\n\t\t\t\treturn io.NopCloser(bytes.NewReader(nil)), nil\n\t\t\t}\n\t\t\t_ = rc.Close()\n\t\t\treturn nil, fmt.Errorf(\"webdav: cannot skip offset in file %q: %w\", filename, err)\n\t\t}\n\n\t\treturn rc, nil\n\t}\n\n\trc, err := client.ReadStream(filename)\n\tif err != nil {\n\t\tif os.IsNotExist(err) || gowebdav.IsErrNotFound(err) {\n\t\t\treturn nil, os.ErrNotExist\n\t\t}\n\t\treturn nil, fmt.Errorf(\"webdav: cannot read file %q: %w\", filename, err)\n\t}\n\treturn rc, nil\n}\n\nfunc (c *ReplicaClient) DeleteLTXFiles(ctx context.Context, a []*ltx.FileInfo) error {\n\tclient, err := c.init(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, info := range a {\n\t\tfilename := litestream.LTXFilePath(c.Path, info.Level, info.MinTXID, info.MaxTXID)\n\n\t\tc.logger.Debug(\"deleting ltx file\", \"level\", info.Level, \"minTXID\", info.MinTXID, \"maxTXID\", info.MaxTXID, \"path\", filename)\n\n\t\tif err := client.Remove(filename); err != nil \u0026\u0026 !os.IsNotExist(err) \u0026\u0026 !gowebdav.IsErrNotFound(err) {\n\t\t\treturn fmt.Errorf(\"webdav: cannot delete ltx file %q: %w\", filename, err)\n\t\t}\n\t\tinternal.OperationTotalCounterVec.WithLabelValues(ReplicaClientType, \"DELETE\").Inc()\n\t}\n\n\treturn nil\n}\n","imports":[{"name":"bytes","path":"bytes","span":{"start":[4,1],"end":[4,9],"bytes":[25,33]}},{"name":"context","path":"context","span":{"start":[5,1],"end":[5,11],"bytes":[34,44]}},{"name":"fmt","path":"fmt","span":{"start":[6,1],"end":[6,7],"bytes":[45,51]}},{"name":"io","path":"io","span":{"start":[7,1],"end":[7,6],"bytes":[52,57]}},{"name":"slog","path":"log/slog","span":{"start":[8,1],"end":[8,12],"bytes":[58,69]}},{"name":"url","path":"net/url","span":{"start":[9,1],"end":[9,11],"bytes":[70,80]}},{"name":"os","path":"os","span":{"start":[10,1],"end":[10,6],"bytes":[81,86]}},{"name":"path","path":"path","span":{"start":[11,1],"end":[11,8],"bytes":[87,94]}},{"name":"sort","path":"sort","span":{"start":[12,1],"end":[12,8],"bytes":[95,102]}},{"name":"sync","path":"sync","span":{"start":[13,1],"end":[13,8],"bytes":[103,110]}},{"name":"time","path":"time","span":{"start":[14,1],"end":[14,8],"bytes":[111,118]}},{"name":"gowebdav","path":"github.com/studio-b12/gowebdav","span":{"start":[16,1],"end":[16,34],"bytes":[120,153]}},{"name":"ltx","path":"github.com/superfly/ltx","span":{"start":[17,1],"end":[17,27],"bytes":[154,180]}},{"name":"litestream","path":"github.com/benbjohnson/litestream","span":{"start":[19,1],"end":[19,37],"bytes":[182,218]}},{"name":"internal","path":"github.com/benbjohnson/litestream/internal","span":{"start":[20,1],"end":[20,46],"bytes":[219,264]}}],"types":{"ReplicaClient":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient","kind":"struct","span":{"start":[36,1],"end":[46,2],"bytes":[576,763]},"callables":{"github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll","kind":"method","span":{"start":[121,1],"end":[134,2],"bytes":[2598,3002]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[121,1],"end":[121,63],"bytes":[2598,2660]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":3},"body":{"122:17":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll@122:17","span":{"start":[122,17],"end":[122,28],"bytes":[2677,2688]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"127:12":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll@127:12","span":{"start":[127,12],"end":[127,36],"bytes":[2734,2758]},"callee":null},"127:53":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll@127:53","span":{"start":[127,53],"end":[127,71],"bytes":[2775,2793]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"127:76":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll@127:76","span":{"start":[127,76],"end":[127,103],"bytes":[2798,2825]},"callee":null},"128:10":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll@128:10","span":{"start":[128,10],"end":[128,70],"bytes":[2837,2897]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"131:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll@131:2","span":{"start":[131,2],"end":[131,86],"bytes":[2903,2987]},"callee":null},"131:2/2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll@131:2/2","span":{"start":[131,2],"end":[131,80],"bytes":[2903,2981]},"callee":null}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","kind":"method","span":{"start":[353,1],"end":[371,2],"bytes":[10151,10830]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[353,1],"end":[353,87],"bytes":[10151,10237]}},{"name":"a","type":"[]invalid type","span":{"start":[353,1],"end":[353,87],"bytes":[10151,10237]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"354:17":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@354:17","span":{"start":[354,17],"end":[354,28],"bytes":[10254,10265]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"360:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@360:15","span":{"start":[360,15],"end":[360,85],"bytes":[10340,10410]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"362:3":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@362:3","span":{"start":[362,3],"end":[362,127],"bytes":[10414,10538]},"callee":"can://litestream/litestream/@external/log/slog/Logger.Debug"},"364:13":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@364:13","span":{"start":[364,13],"end":[364,36],"bytes":[10552,10575]},"callee":null},"364:53":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@364:53","span":{"start":[364,53],"end":[364,71],"bytes":[10592,10610]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"364:76":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@364:76","span":{"start":[364,76],"end":[364,103],"bytes":[10615,10642]},"callee":null},"365:11":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@365:11","span":{"start":[365,11],"end":[365,77],"bytes":[10655,10721]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"367:3":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@367:3","span":{"start":[367,3],"end":[367,87],"bytes":[10728,10812]},"callee":null},"367:3/2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles@367:3/2","span":{"start":[367,3],"end":[367,81],"bytes":[10728,10806]},"callee":null}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.Init":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.Init","kind":"method","span":{"start":[91,1],"end":[94,2],"bytes":[1942,2036]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.Init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[91,1],"end":[91,58],"bytes":[1942,1999]}}],"return_type":"error","error_channel":["error"],"metrics":{"cyclomatic":1},"body":{"92:12":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.Init@92:12","span":{"start":[92,12],"end":[92,23],"bytes":[2011,2022]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","kind":"method","span":{"start":[136,1],"end":[181,2],"bytes":[3004,4142]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[136,1],"end":[136,122],"bytes":[3004,3125]}},{"name":"level","type":"int","span":{"start":[136,1],"end":[136,122],"bytes":[3004,3125]}},{"name":"seek","type":"invalid type","span":{"start":[136,1],"end":[136,122],"bytes":[3004,3125]}},{"name":"_","type":"bool","span":{"start":[136,1],"end":[136,122],"bytes":[3004,3125]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":9},"body":{"137:17":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@137:17","span":{"start":[137,17],"end":[137,28],"bytes":[3142,3153]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"142:9":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@142:9","span":{"start":[142,9],"end":[142,46],"bytes":[3201,3238]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir"},"143:16":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@143:16","span":{"start":[143,16],"end":[143,35],"bytes":[3254,3273]},"callee":null},"145:28":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@145:28","span":{"start":[145,28],"end":[145,55],"bytes":[3318,3345]},"callee":null},"145:6":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@145:6","span":{"start":[145,6],"end":[145,24],"bytes":[3296,3314]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"146:11":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@146:11","span":{"start":[146,11],"end":[146,44],"bytes":[3358,3391]},"callee":null},"148:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@148:15","span":{"start":[148,15],"end":[148,75],"bytes":[3415,3475]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"151:11":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@151:11","span":{"start":[151,11],"end":[151,47],"bytes":[3490,3526]},"callee":null},"151:36":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@151:36","span":{"start":[151,36],"end":[151,46],"bytes":[3515,3525]},"callee":null},"153:6":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@153:6","span":{"start":[153,6],"end":[153,16],"bytes":[3560,3570]},"callee":null},"157:28":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@157:28","span":{"start":[157,28],"end":[157,67],"bytes":[3617,3656]},"callee":null},"157:46":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@157:46","span":{"start":[157,46],"end":[157,66],"bytes":[3635,3655]},"callee":"can://litestream/litestream/@external/path/Base"},"157:56":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@157:56","span":{"start":[157,56],"end":[157,65],"bytes":[3645,3654]},"callee":null},"164:11":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@164:11","span":{"start":[164,11],"end":[170,5],"bytes":[3743,3902]},"callee":null},"168:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@168:15","span":{"start":[168,15],"end":[168,24],"bytes":[3853,3862]},"callee":null},"169:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@169:15","span":{"start":[169,15],"end":[169,33],"bytes":[3878,3896]},"callee":null},"169:15/2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@169:15/2","span":{"start":[169,15],"end":[169,27],"bytes":[3878,3890]},"callee":null},"173:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@173:2","span":{"start":[173,2],"end":[178,4],"bytes":[3908,4090]},"callee":"can://litestream/litestream/@external/sort/Slice"},"180:9":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles@180:9","span":{"start":[180,9],"end":[180,44],"bytes":[4100,4135]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles.closure_1","kind":"function","span":{"start":[173,1],"end":[178,4],"bytes":[3907,4090]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles.closure_1","parameters":[{"name":"i","type":"int","span":{"start":[173,1],"end":[173,41],"bytes":[3907,3947]}},{"name":"j","type":"int","span":{"start":[173,1],"end":[173,41],"bytes":[3907,3947]}}],"return_type":"bool","body":{}}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","kind":"method","span":{"start":[301,1],"end":[351,2],"bytes":[8649,10149]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"level","type":"int","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"minTXID","type":"invalid type","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"maxTXID","type":"invalid type","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"offset","type":"int64","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}},{"name":"size","type":"int64","span":{"start":[301,1],"end":[301,146],"bytes":[8649,8794]}}],"return_type":"(io.ReadCloser, error)","error_channel":["error"],"metrics":{"cyclomatic":12},"body":{"302:17":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@302:17","span":{"start":[302,17],"end":[302,28],"bytes":[8811,8822]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"307:14":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@307:14","span":{"start":[307,14],"end":[307,69],"bytes":[8875,8930]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"309:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@309:2","span":{"start":[309,2],"end":[309,83],"bytes":[8933,9014]},"callee":null},"309:2/2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@309:2/2","span":{"start":[309,2],"end":[309,77],"bytes":[8933,9008]},"callee":null},"312:14":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@312:14","span":{"start":[312,14],"end":[312,60],"bytes":[9044,9090]},"callee":null},"314:29":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@314:29","span":{"start":[314,29],"end":[314,56],"bytes":[9137,9164]},"callee":null},"314:7":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@314:7","span":{"start":[314,7],"end":[314,25],"bytes":[9115,9133]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"317:16":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@317:16","span":{"start":[317,16],"end":[317,76],"bytes":[9218,9278]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"319:10":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@319:10","span":{"start":[319,10],"end":[319,44],"bytes":[9292,9326]},"callee":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser"},"323:14":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@323:14","span":{"start":[323,14],"end":[323,41],"bytes":[9366,9393]},"callee":null},"325:29":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@325:29","span":{"start":[325,29],"end":[325,56],"bytes":[9440,9467]},"callee":null},"325:7":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@325:7","span":{"start":[325,7],"end":[325,25],"bytes":[9418,9436]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"328:16":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@328:16","span":{"start":[328,16],"end":[328,76],"bytes":[9521,9581]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"331:16":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@331:16","span":{"start":[331,16],"end":[331,48],"bytes":[9602,9634]},"callee":"can://litestream/litestream/@external/io/CopyN"},"333:9":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@333:9","span":{"start":[333,9],"end":[333,19],"bytes":[9709,9719]},"callee":null},"334:12":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@334:12","span":{"start":[334,12],"end":[334,46],"bytes":[9731,9765]},"callee":"can://litestream/litestream/@external/io/NopCloser"},"334:25":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@334:25","span":{"start":[334,25],"end":[334,45],"bytes":[9744,9764]},"callee":"can://litestream/litestream/@external/bytes/NewReader"},"336:8":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@336:8","span":{"start":[336,8],"end":[336,18],"bytes":[9783,9793]},"callee":null},"337:16":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@337:16","span":{"start":[337,16],"end":[337,86],"bytes":[9809,9879]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"343:13":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@343:13","span":{"start":[343,13],"end":[343,40],"bytes":[9918,9945]},"callee":null},"345:28":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@345:28","span":{"start":[345,28],"end":[345,55],"bytes":[9990,10017]},"callee":null},"345:6":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@345:6","span":{"start":[345,6],"end":[345,24],"bytes":[9968,9986]},"callee":"can://litestream/litestream/@external/os/IsNotExist"},"348:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile@348:15","span":{"start":[348,15],"end":[348,75],"bytes":[10068,10128]},"callee":"can://litestream/litestream/@external/fmt/Errorf"}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.SetLogger":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.SetLogger","kind":"method","span":{"start":[55,1],"end":[57,2],"bytes":[919,1025]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.SetLogger","parameters":[{"name":"logger","type":"*log/slog.Logger","span":{"start":[55,1],"end":[55,57],"bytes":[919,975]}}],"metrics":{"cyclomatic":1},"body":{"56:13":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.SetLogger@56:13","span":{"start":[56,13],"end":[56,48],"bytes":[988,1023]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.Type":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.Type","kind":"method","span":{"start":[87,1],"end":[89,2],"bytes":[1873,1940]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.Type","parameters":[],"return_type":"string","metrics":{"cyclomatic":1},"body":{}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","kind":"method","span":{"start":[236,1],"end":[299,2],"bytes":[6374,8647]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}},{"name":"level","type":"int","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}},{"name":"minTXID","type":"invalid type","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}},{"name":"maxTXID","type":"invalid type","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}},{"name":"rd","type":"io.Reader","span":{"start":[236,1],"end":[236,144],"bytes":[6374,6517]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":8},"body":{"237:17":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@237:17","span":{"start":[237,17],"end":[237,28],"bytes":[6534,6545]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init"},"242:14":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@242:14","span":{"start":[242,14],"end":[242,69],"bytes":[6598,6653]},"callee":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath"},"245:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@245:15","span":{"start":[245,15],"end":[245,37],"bytes":[6691,6713]},"callee":"can://litestream/litestream/@external/io/TeeReader"},"247:17":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@247:17","span":{"start":[247,17],"end":[247,42],"bytes":[6731,6756]},"callee":null},"249:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@249:15","span":{"start":[249,15],"end":[249,71],"bytes":[6788,6844]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"251:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@251:15","span":{"start":[251,15],"end":[251,50],"bytes":[6862,6897]},"callee":"can://litestream/litestream/@external/time/Time.UTC"},"251:15/2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@251:15/2","span":{"start":[251,15],"end":[251,44],"bytes":[6862,6891]},"callee":"can://litestream/litestream/@external/time/UnixMilli"},"257:18":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@257:18","span":{"start":[257,18],"end":[257,62],"bytes":[7196,7240]},"callee":"can://litestream/litestream/@external/os/CreateTemp"},"259:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@259:15","span":{"start":[259,15],"end":[259,69],"bytes":[7272,7326]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"261:8":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@261:8","span":{"start":[261,8],"end":[264,5],"bytes":[7337,7404]},"callee":null,"is_deferred":true},"266:16":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@266:16","span":{"start":[266,16],"end":[266,40],"bytes":[7421,7445]},"callee":"can://litestream/litestream/@external/io/MultiReader"},"268:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@268:15","span":{"start":[268,15],"end":[268,43],"bytes":[7461,7489]},"callee":"can://litestream/litestream/@external/io/Copy"},"270:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@270:15","span":{"start":[270,15],"end":[270,70],"bytes":[7521,7576]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"273:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@273:15","span":{"start":[273,15],"end":[273,44],"bytes":[7595,7624]},"callee":"can://litestream/litestream/@external/os/File.Seek"},"274:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@274:15","span":{"start":[274,15],"end":[274,67],"bytes":[7653,7705]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"277:12":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@277:12","span":{"start":[277,12],"end":[277,53],"bytes":[7721,7762]},"callee":null},"277:28":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@277:28","span":{"start":[277,28],"end":[277,46],"bytes":[7737,7755]},"callee":"can://litestream/litestream/@external/path/Dir"},"278:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@278:15","span":{"start":[278,15],"end":[278,99],"bytes":[7791,7875]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"278:75":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@278:75","span":{"start":[278,75],"end":[278,93],"bytes":[7851,7869]},"callee":"can://litestream/litestream/@external/path/Dir"},"285:12":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@285:12","span":{"start":[285,12],"end":[285,71],"bytes":[8174,8233]},"callee":null},"286:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@286:15","span":{"start":[286,15],"end":[286,76],"bytes":[8262,8323]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"289:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@289:2","span":{"start":[289,2],"end":[289,83],"bytes":[8329,8410]},"callee":null},"289:2/2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@289:2/2","span":{"start":[289,2],"end":[289,77],"bytes":[8329,8404]},"callee":null},"290:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@290:2","span":{"start":[290,2],"end":[290,96],"bytes":[8412,8506]},"callee":null},"290:2/2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@290:2/2","span":{"start":[290,2],"end":[290,77],"bytes":[8412,8487]},"callee":null},"290:82":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile@290:82","span":{"start":[290,82],"end":[290,95],"bytes":[8492,8505]},"callee":null}},"callables":{"closure_1":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1","kind":"function","span":{"start":[261,1],"end":[264,5],"bytes":[7330,7404]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1","parameters":[],"body":{"262:7":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1@262:7","span":{"start":[262,7],"end":[262,22],"bytes":[7352,7367]},"callee":"can://litestream/litestream/@external/os/File.Close"},"263:17":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1@263:17","span":{"start":[263,17],"end":[263,31],"bytes":[7384,7398]},"callee":"can://litestream/litestream/@external/os/File.Name"},"263:7":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1@263:7","span":{"start":[263,7],"end":[263,32],"bytes":[7374,7399]},"callee":"can://litestream/litestream/@external/os/Remove"}}}}},"github.com/benbjohnson/litestream/webdav.ReplicaClient.init":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","kind":"method","span":{"start":[97,1],"end":[119,2],"bytes":[2104,2596]},"signature":"github.com/benbjohnson/litestream/webdav.ReplicaClient.init","parameters":[{"name":"ctx","type":"context.Context","span":{"start":[97,1],"end":[97,84],"bytes":[2104,2187]}}],"return_type":"(invalid type, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"106:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init@106:15","span":{"start":[106,15],"end":[106,48],"bytes":[2304,2337]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"109:13":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init@109:13","span":{"start":[109,13],"end":[109,62],"bytes":[2354,2403]},"callee":null},"111:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init@111:2","span":{"start":[111,2],"end":[111,32],"bytes":[2406,2436]},"callee":null},"113:12":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init@113:12","span":{"start":[113,12],"end":[113,30],"bytes":[2449,2467]},"callee":null},"115:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init@115:15","span":{"start":[115,15],"end":[115,70],"bytes":[2513,2568]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"98:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init@98:2","span":{"start":[98,2],"end":[98,13],"bytes":[2189,2200]},"callee":"can://litestream/litestream/@external/sync/Mutex.Lock"},"99:8":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init@99:8","span":{"start":[99,8],"end":[99,21],"bytes":[2208,2221]},"callee":"can://litestream/litestream/@external/sync/Mutex.Unlock","is_deferred":true}}}},"fields":{"Password":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/Password","kind":"field","type":"string","span":{"start":[43,1],"end":[43,17],"bytes":[704,720]}},"Path":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/Path","kind":"field","type":"string","span":{"start":[44,1],"end":[44,17],"bytes":[721,737]}},"Timeout":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/Timeout","kind":"field","type":"time.Duration","span":{"start":[45,1],"end":[45,24],"bytes":[738,761]}},"URL":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/URL","kind":"field","type":"string","span":{"start":[41,1],"end":[41,17],"bytes":[670,686]}},"Username":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/Username","kind":"field","type":"string","span":{"start":[42,1],"end":[42,17],"bytes":[687,703]}},"client":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/client","kind":"field","type":"invalid type","span":{"start":[38,1],"end":[38,25],"bytes":[623,647]}},"logger":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/logger","kind":"field","type":"*log/slog.Logger","span":{"start":[39,1],"end":[39,21],"bytes":[648,668]}},"mu":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/mu","kind":"field","type":"sync.Mutex","span":{"start":[37,1],"end":[37,19],"bytes":[604,622]}}}}},"functions":{"github.com/benbjohnson/litestream/webdav.NewReplicaClient":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","kind":"function","span":{"start":[48,1],"end":[53,2],"bytes":[765,917]},"signature":"github.com/benbjohnson/litestream/webdav.NewReplicaClient","parameters":[],"return_type":"*github.com/benbjohnson/litestream/webdav.ReplicaClient","metrics":{"cyclomatic":1},"body":{"50:12":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient@50:12","span":{"start":[50,12],"end":[50,55],"bytes":[841,884]},"callee":"can://litestream/litestream/@external/log/slog/Logger.WithGroup"},"50:12/2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient@50:12/2","span":{"start":[50,12],"end":[50,26],"bytes":[841,855]},"callee":"can://litestream/litestream/@external/log/slog/Default"}}},"github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","kind":"function","span":{"start":[62,1],"end":[85,2],"bytes":[1251,1871]},"signature":"github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","parameters":[{"name":"scheme","type":"string","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}},{"name":"host","type":"string","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}},{"name":"urlPath","type":"string","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}},{"name":"query","type":"net/url.Values","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}},{"name":"userinfo","type":"*net/url.Userinfo","span":{"start":[62,1],"end":[62,137],"bytes":[1251,1387]}}],"return_type":"(github.com/benbjohnson/litestream.ReplicaClient, error)","error_channel":["error"],"metrics":{"cyclomatic":4},"body":{"63:12":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL@63:12","span":{"start":[63,12],"end":[63,30],"bytes":[1399,1417]},"callee":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient"},"73:21":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL@73:21","span":{"start":[73,21],"end":[73,40],"bytes":[1618,1637]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Username"},"74:24":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL@74:24","span":{"start":[74,24],"end":[74,43],"bytes":[1661,1680]},"callee":"can://litestream/litestream/@external/net/url/Userinfo.Password"},"78:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL@78:15","span":{"start":[78,15],"end":[78,65],"bytes":[1716,1766]},"callee":"can://litestream/litestream/@external/fmt/Errorf"},"81:15":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL@81:15","span":{"start":[81,15],"end":[81,55],"bytes":[1785,1825]},"callee":"can://litestream/litestream/@external/fmt/Sprintf"}}},"github.com/benbjohnson/litestream/webdav.init":{"id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.init","kind":"function","span":{"start":[23,1],"end":[26,2],"bytes":[268,436]},"signature":"github.com/benbjohnson/litestream/webdav.init","parameters":[],"metrics":{"cyclomatic":1},"body":{"24:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.init@24:2","span":{"start":[24,2],"end":[24,76],"bytes":[283,357]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"},"25:2":{"kind":"call","id":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.init@25:2","span":{"start":[25,2],"end":[25,77],"bytes":[359,434]},"callee":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory"}}}},"content_hash":"0663d9d2f104f9e08f85fb1d08c60dd84bbaa0f77b692584f583b18f7f092a35"}},"call_graph":[{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Userinfo.Username","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Values.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/strings/TrimSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/log/slog/Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/log/slog/Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/os/Getenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/MultiReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/TeeReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.Format","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ReplicaClient/github.com/benbjohnson/litestream/abs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.init","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.isNotExists","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.Next","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.ltxFileIterator/github.com/benbjohnson/litestream/abs.ltxFileIterator.loadNextPage","dst":"can://litestream/litestream/@external/time/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.newLTXFileIterator","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.DurationVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Float64Var","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.IntVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.StringVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","dst":"can://litestream/litestream/@external/math/rand/Float64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","dst":"can://litestream/litestream/@external/time/Duration.Seconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.sinApprox","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable","dst":"can://litestream/litestream/@external/database/sql/DB.Exec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","dst":"can://litestream/litestream/@external/sync/atomic/LoadInt64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","dst":"can://litestream/litestream/@external/time/Duration.Round","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","dst":"can://litestream/litestream/@external/time/Duration.Seconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/context/WithTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/database/sql/DB.SetMaxIdleConns","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/database/sql/DB.SetMaxOpenConns","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/os/signal/Notify","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/sync/WaitGroup.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/sync/WaitGroup.Wait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.ensureTestTable","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.finalReport","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_1","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_2","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.generateLoad.closure_2","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","dst":"can://litestream/litestream/@external/database/sql/DB.QueryRow","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","dst":"can://litestream/litestream/@external/database/sql/Row.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","dst":"can://litestream/litestream/@external/time/Time.Unix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","dst":"can://litestream/litestream/@external/database/sql/DB.Exec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","dst":"can://litestream/litestream/@external/math/rand/Int63","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","dst":"can://litestream/litestream/@external/time/Time.Unix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","dst":"can://litestream/litestream/@external/time/Time.UnixNano","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/sync/atomic/LoadInt64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/sync/atomic/StoreInt64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/time/Duration.Round","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/time/Duration.Seconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/time/NewTicker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.reportStats","dst":"can://litestream/litestream/@external/time/Ticker.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/@external/crypto/rand/Read","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/@external/log/slog/Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/@external/math/rand/Float64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/@external/sync/atomic/AddInt64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/@external/time/NewTicker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/@external/time/Ticker.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.calculateRate","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performRead","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.worker","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.performWrite","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Args","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/load.go/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand/github.com/benbjohnson/litestream/cmd/litestream-test.LoadCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Usage","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","dst":"can://litestream/litestream/@external/runtime/Version","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Run","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream-test.VersionCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.init","dst":"can://litestream/litestream/@external/log/slog/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.init","dst":"can://litestream/litestream/@external/log/slog/NewTextHandler","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.init","dst":"can://litestream/litestream/@external/log/slog/SetDefault","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","dst":"can://litestream/litestream/@external/os/Exit","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","dst":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.Main/github.com/benbjohnson/litestream/cmd/litestream-test.Main.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.main","dst":"can://litestream/litestream/go/cmd/litestream-test/main.go/github.com/benbjohnson/litestream/cmd/litestream-test.NewMain","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Float64Var","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.IntVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.StringVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/database/sql/DB.Exec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/log/slog/Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/math/rand/Float64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/time/Duration.Seconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateDatabase","dst":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/crypto/rand/Read","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/database/sql/DB.Begin","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/database/sql/Stmt.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/database/sql/Stmt.Exec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/database/sql/Tx.Commit","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/database/sql/Tx.Prepare","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/database/sql/Tx.Rollback","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/math/rand/Float64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/math/rand/Int63","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.PopulateCommand.populateTable","dst":"can://litestream/litestream/@external/time/Time.Unix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.parseSize","dst":"can://litestream/litestream/@external/fmt/Sscanf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.BoolVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Float64Var","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.StringVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/database/sql/DB.Exec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/database/sql/DB.Query","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/database/sql/DB.QueryRow","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/database/sql/Result.RowsAffected","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/database/sql/Row.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/database/sql/Rows.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/database/sql/Rows.Next","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/database/sql/Rows.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/log/slog/Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","dst":"can://litestream/litestream/@external/database/sql/DB.Query","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","dst":"can://litestream/litestream/@external/database/sql/Rows.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","dst":"can://litestream/litestream/@external/database/sql/Rows.Next","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","dst":"can://litestream/litestream/@external/database/sql/Rows.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","dst":"can://litestream/litestream/@external/database/sql/DB.QueryRow","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","dst":"can://litestream/litestream/@external/database/sql/Row.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","dst":"can://litestream/litestream/@external/database/sql/DB.Exec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/@external/log/slog/Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/go/cmd/litestream-test/populate.go/github.com/benbjohnson/litestream/cmd/litestream-test.getDatabaseSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.deleteFromTable","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.getTableList","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runCheckpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.shrinkDatabase","dst":"can://litestream/litestream/go/cmd/litestream-test/shrink.go/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ShrinkCommand.runVacuum","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.BoolVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.StringVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","dst":"can://litestream/litestream/@external/crypto/md5/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","dst":"can://litestream/litestream/@external/hash/Hash.Sum","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","dst":"can://litestream/litestream/@external/database/sql/DB.QueryRow","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","dst":"can://litestream/litestream/@external/database/sql/Row.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","dst":"can://litestream/litestream/@external/database/sql/DB.Query","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","dst":"can://litestream/litestream/@external/database/sql/Rows.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","dst":"can://litestream/litestream/@external/database/sql/Rows.Next","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","dst":"can://litestream/litestream/@external/database/sql/Rows.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performChecksumCheck","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.calculateDBChecksum","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getRowCount","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performDataValidation","dst":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.getTableList","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/database/sql/DB.Query","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/database/sql/Rows.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/database/sql/Rows.Next","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/database/sql/Rows.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performIntegrityCheck","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","dst":"can://litestream/litestream/@external/database/sql/DB.QueryRow","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","dst":"can://litestream/litestream/@external/database/sql/Row.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performQuickCheck","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/log/slog/Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.performRestore","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","dst":"can://litestream/litestream/@external/log/slog/Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.reportResults","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","dst":"can://litestream/litestream/@external/os/exec/Cmd.Output","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","dst":"can://litestream/litestream/@external/strings/Split","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream-test/validate.go/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand/github.com/benbjohnson/litestream/cmd/litestream-test.ValidateCommand.validateLTXContinuity","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/text/tabwriter/NewWriter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Usage","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","dst":"can://litestream/litestream/@external/sync/WaitGroup.Wait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","dst":"can://litestream/litestream/@external/path/filepath/Clean","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","dst":"can://litestream/litestream/@external/path/filepath/WalkDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches.closure_1","dst":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches.closure_1","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/@external/path/filepath/Clean","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase.closure_1","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.matchesPattern","dst":"can://litestream/litestream/@external/path/filepath/Match","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabase","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDatabasesUnder","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","dst":"can://litestream/litestream/@external/path/filepath/Clean","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.removeDirectoryWatch","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://litestream/litestream/@external/time/NewTimer","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://litestream/litestream/@external/time/Timer.Reset","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://litestream/litestream/@external/time/Timer.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.flushPendingEvents","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handleEvent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://litestream/litestream/@external/io/fs/DirEntry.Name","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://litestream/litestream/@external/os/ReadDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://litestream/litestream/@external/path/filepath/WalkDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","dst":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addDirectoryWatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory.closure_1","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.handlePotentialDatabase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.shouldSkipPath","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/@external/errors/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/@external/log/slog/With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/@external/sync/WaitGroup.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.addInitialWatches","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.scanDirectory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Unmarshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Int","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/net/http/Client.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","dst":"can://litestream/litestream/@external/time/Time.Format","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/DialTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Unmarshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Int","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/net/http/Client.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","dst":"can://litestream/litestream/@external/time/Time.Format","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/DialTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Var","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/text/tabwriter/NewWriter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Usage","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ByteSize/github.com/benbjohnson/litestream/cmd/litestream.ByteSize.UnmarshalYAML","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","dst":"can://litestream/litestream/@external/path/filepath/Clean","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings/github.com/benbjohnson/litestream/cmd/litestream.ReplicaSettings.SetDefaults","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError/github.com/benbjohnson/litestream/cmd/litestream.ConfigValidationError.Error","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.DefaultSocketConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","dst":"can://litestream/litestream/@external/os/Getenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases","dst":"can://litestream/litestream/@external/path/filepath/Walk","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1","dst":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1","dst":"can://litestream/litestream/@external/path/filepath/Match","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases.closure_1","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","dst":"can://litestream/litestream/@external/os/File.Read","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.IsSQLiteDatabase","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/@external/os/Process.Signal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/databases.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand/github.com/benbjohnson/litestream/cmd/litestream.DatabasesCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/info.go/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand/github.com/benbjohnson/litestream/cmd/litestream.InfoCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/list.go/github.com/benbjohnson/litestream/cmd/litestream.ListCommand/github.com/benbjohnson/litestream/cmd/litestream.ListCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/ltx.go/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand/github.com/benbjohnson/litestream/cmd/litestream.LTXCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.isWindowsService","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.runWindowsService","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicateCommand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.SetDone","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","dst":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetMetaPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.FindSQLiteDatabases","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Values.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/@external/os/ReadFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/@external/os/UserHomeDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.ApplyDefault","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.boolSetting/github.com/benbjohnson/litestream/cmd/litestream.boolSetting.Set","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newBoolSetting","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewS3ReplicaClientFromConfig","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseByteSize","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/@external/os/Expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/@external/os/Getenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.Validate","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.applyDBSnapshotConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.propagateGlobalSettings","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","dst":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1","dst":"can://litestream/litestream/@external/os/Getenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1","dst":"can://litestream/litestream/@external/os/Getpid","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig.closure_1","dst":"can://litestream/litestream/@external/strconv/Itoa","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.OpenConfigFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ParseConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","dst":"can://litestream/litestream/@external/os/LookupEnv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.applyLitestreamEnv","dst":"can://litestream/litestream/@external/os/Setenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/@external/net/url/URL.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/@external/path/filepath/FromSlash","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/@external/path/filepath/ToSlash","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig/github.com/benbjohnson/litestream/cmd/litestream.ReplicaConfig.ReplicaType","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.appendRelativePathToURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","dst":"can://litestream/litestream/@external/path/filepath/Clean","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","dst":"can://litestream/litestream/@external/path/filepath/Split","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","dst":"can://litestream/litestream/@external/os/user/Current","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","dst":"can://litestream/litestream/@external/path/filepath/Abs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.StripSQLitePrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.init","dst":"can://litestream/litestream/@external/runtime/debug/ReadBuildInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.init","dst":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.isValidHeartbeatURL","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.Set","dst":"can://litestream/litestream/@external/strconv/Atoi","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.levelVar/github.com/benbjohnson/litestream/cmd/litestream.levelVar.String","dst":"can://litestream/litestream/@external/strconv/Itoa","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://litestream/litestream/@external/os/Exit","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Main/github.com/benbjohnson/litestream/cmd/litestream.Main.Run","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewMain","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.main","dst":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Userinfo.Username","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/path/Clean","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newABSReplicaClientFromConfig","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://litestream/litestream/@external/path/filepath/Rel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.cloneReplicaConfigWithRelativePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.deriveMetaPathForDirectoryEntry","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newDBFromDirectoryEntry","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newFileReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newGSReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/strings/Trim","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newNATSReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newOSSReplicaClientFromConfig","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Userinfo.Password","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Userinfo.Username","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newSFTPReplicaClientFromConfig","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Userinfo.Password","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","dst":"can://litestream/litestream/@external/net/url/Userinfo.Username","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.newWebDAVReplicaClientFromConfig","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.txidVar/github.com/benbjohnson/litestream/cmd/litestream.txidVar.Set","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan","dst":"can://litestream/litestream/@external/os/signal/Notify","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool.closure_1","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/bufio/NewScanner","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/bufio/Scanner.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/bufio/Scanner.Text","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/log/slog/Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/strings/Builder.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/strings/Builder.WriteString","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/strings/Fields","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool/github.com/benbjohnson/litestream/cmd/litestream.InfoTool.closure_1","dst":"can://litestream/litestream/@external/strings/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool/github.com/benbjohnson/litestream/cmd/litestream.LTXTool.closure_1","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close","dst":"can://litestream/litestream/@external/context/WithTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close","dst":"can://litestream/litestream/@external/net/http/Server.Shutdown","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.ServeHTTP","dst":"can://litestream/litestream/@external/net/http/ServeMux.ServeHTTP","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1","dst":"can://litestream/litestream/@external/log/slog/Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start.closure_1","dst":"can://litestream/litestream/@external/net/http/Server.ListenAndServe","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/@external/net/http/NewServeMux","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/@external/net/http/ServeMux.Handle","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.DatabasesTool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.InfoTool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.LTXTool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.ResetTool/github.com/benbjohnson/litestream/cmd/litestream.ResetTool.closure_1","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","dst":"can://litestream/litestream/@external/strconv/FormatBool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool/github.com/benbjohnson/litestream/cmd/litestream.RestoreTool.closure_1","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.StatusTool/github.com/benbjohnson/litestream/cmd/litestream.StatusTool.closure_1","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.VersionTool/github.com/benbjohnson/litestream/cmd/litestream.VersionTool.closure_1","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.isReplicaURL","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Marshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Unmarshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Int","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/@external/net/http/Client.Post","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.registerDisplayStatus","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/DialTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/register.go/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand/github.com/benbjohnson/litestream/cmd/litestream.RegisterCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://litestream/litestream/@external/log/slog/Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://litestream/litestream/@external/log/slog/Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Close","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/flag/FlagSet.Args","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/os/Setenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.ParseFlags","dst":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/log/slog/With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/net/JoinHostPort","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/net/SplitHostPort","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/os/Environ","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/os/exec/Cmd.Start","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/@external/os/exec/CommandContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor/github.com/benbjohnson/litestream/cmd/litestream.DirectoryMonitor.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/directory_watcher.go/github.com/benbjohnson/litestream/cmd/litestream.NewDirectoryMonitor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.CompactionLevels","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBsFromDirectoryConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.MCPServer/github.com/benbjohnson/litestream/cmd/litestream.MCPServer.Start","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/mcp.go/github.com/benbjohnson/litestream/cmd/litestream.NewMCP","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.NewHeartbeatClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetRetentionEnabled","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1","dst":"can://litestream/litestream/@external/log/slog/Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/http/Handle","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/http/ListenAndServe","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Run.closure_2","dst":"can://litestream/litestream/@external/os/exec/Cmd.Wait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.Usage","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewRestoreOptions","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.restoreIfNeeded","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/replicate.go/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand/github.com/benbjohnson/litestream/cmd/litestream.ReplicateCommand.runOnce","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/path/filepath/Abs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/@external/path/filepath/IsAbs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MetaPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Run","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand/github.com/benbjohnson/litestream/cmd/litestream.ResetCommand.Usage","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles","dst":"can://litestream/litestream/@external/path/filepath/WalkDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/reset.go/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles/github.com/benbjohnson/litestream/cmd/litestream.localLTXFiles.closure_1","dst":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/errors/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.BoolVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.DurationVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.IntVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.StringVar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Var","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/log/slog/Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/time/Duration.Milliseconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/time/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main_notwindows.go/github.com/benbjohnson/litestream/cmd/litestream.signalChan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewRestoreOptions","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Run.closure_1","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage","dst":"can://litestream/litestream/@external/strconv/Itoa","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.Usage","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.dryRunPlan","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.Config/github.com/benbjohnson/litestream/cmd/litestream.Config.DBConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromConfig","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.expand","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewReplicaFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.loadFromURL","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","dst":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.prepareOutputPath","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","dst":"can://litestream/litestream/@external/text/tabwriter/NewWriter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.printDryRunPlan","dst":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/restore.go/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand/github.com/benbjohnson/litestream/cmd/litestream.RestoreCommand.restoreTXID","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Marshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Unmarshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Int","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/@external/net/http/Client.Post","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/DialTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.StartCommand/github.com/benbjohnson/litestream/cmd/litestream.StartCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/text/tabwriter/NewWriter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.NewDBFromConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.ReadConfigFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.registerConfigFlag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Run","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.Usage","dst":"can://litestream/litestream/go/cmd/litestream/main.go/github.com/benbjohnson/litestream/cmd/litestream.DefaultConfigPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/status.go/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand/github.com/benbjohnson/litestream/cmd/litestream.StatusCommand.getDBStatus","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Marshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Unmarshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Int","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/@external/net/http/Client.Post","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/start.go/github.com/benbjohnson/litestream/cmd/litestream.printStartStopResult","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/DialTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/stop.go/github.com/benbjohnson/litestream/cmd/litestream.StopCommand/github.com/benbjohnson/litestream/cmd/litestream.StopCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Marshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Unmarshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Int","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/net/http/Client.Post","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/time/Duration.Milliseconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/DialTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand/github.com/benbjohnson/litestream/cmd/litestream.SyncCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/sync.go/github.com/benbjohnson/litestream/cmd/litestream.printSyncResult","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Marshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/encoding/json/Unmarshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Arg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Int","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.NArg","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/@external/net/http/Client.Post","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Run.closure_1","dst":"can://litestream/litestream/@external/net/DialTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand/github.com/benbjohnson/litestream/cmd/litestream.UnregisterCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","dst":"can://litestream/litestream/@external/encoding/json/MarshalIndent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/unregister.go/github.com/benbjohnson/litestream/cmd/litestream.printUnregisterResult","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Bool","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://litestream/litestream/@external/flag/FlagSet.Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://litestream/litestream/@external/flag/NewFlagSet","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://litestream/litestream/@external/fmt/Printf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://litestream/litestream/@external/runtime/Version","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://litestream/litestream/@external/runtime/debug/ReadBuildInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Run","dst":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand/github.com/benbjohnson/litestream/cmd/litestream.VersionCommand.Usage","dst":"can://litestream/litestream/@external/fmt/Println","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.resolveVersion","dst":"can://litestream/litestream/go/cmd/litestream/version.go/github.com/benbjohnson/litestream/cmd/litestream.vcsSettings","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt","dst":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","dst":"can://litestream/litestream/@external/time/Time.Truncate","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Level","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Level","dst":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.NextLevel","dst":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel","dst":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.MaxLevel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/@external/io/Pipe","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/@external/io/PipeReader.CloseWithError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/@external/log/slog/Logger.Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_1","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact/github.com/benbjohnson/litestream.Compactor.Compact.closure_2","dst":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceL0Retention","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceSnapshotRetention","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.MaxLTXFileInfo","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.VerifyLevelConsistency","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.NewCompactor","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/@external/hash/Hash64.Sum64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/@external/hash/crc64/MakeTable","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/@external/hash/crc64/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/@external/os/File.Seek","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.CRC64","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Checkpoint/github.com/benbjohnson/litestream.DB.Checkpoint.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/@external/context/WithoutCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/@external/sync/WaitGroup.Wait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","dst":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.Compact","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID","dst":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.EnforceRetentionByTXID","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/slices/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteLTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/@external/os/MkdirAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/@external/path/filepath/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewRestoreOptions","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnsureExists","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","dst":"can://litestream/litestream/@external/strconv/Itoa","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","dst":"can://litestream/litestream/@external/io/fs/DirEntry.Name","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","dst":"can://litestream/litestream/@external/os/ReadDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://litestream/litestream/@external/sync/WaitGroup.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open/github.com/benbjohnson/litestream.DB.Open.closure_1","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open/github.com/benbjohnson/litestream.DB.Open.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos/github.com/benbjohnson/litestream.DB.Pos.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://litestream/litestream/@external/os/RemoveAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","dst":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.Compactor/github.com/benbjohnson/litestream.Compactor.setLogger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.SetLogger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot/github.com/benbjohnson/litestream.DB.Snapshot.closure_1","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SnapshotReader","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","dst":"can://litestream/litestream/@external/context/Cause","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","dst":"can://litestream/litestream/@external/time/Duration.Seconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","dst":"can://litestream/litestream/@external/time/Time.Sub","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncStatus","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","dst":"can://litestream/litestream/@external/context/WithoutCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","dst":"can://litestream/litestream/@external/database/sql/DB.BeginTx","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","dst":"can://litestream/litestream/@external/database/sql/Tx.ExecContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","dst":"can://litestream/litestream/@external/database/sql/Tx.Rollback","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncResult","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncResult","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","dst":"can://litestream/litestream/@external/database/sql/DB.ExecContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/os/Create","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/os/File.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/os/RemoveAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/@external/os/Rename","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_1","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica.closure_2","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/@external/log/slog/Logger.Log","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/@external/os/File.Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/bytes/Equal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/database/sql/DB.BeginTx","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/database/sql/Tx.ExecContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/log/slog/Logger.Log","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/sync/RWMutex.TryLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_4","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointWithExecutor/github.com/benbjohnson/litestream.DB.checkpointWithExecutor.closure_8","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteLocalLTXFile","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.deleteMetrics","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.bumpLitestreamSeq","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.effectiveTruncatePageN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.calcWALSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://litestream/litestream/@external/database/sql/DB.QueryRowContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://litestream/litestream/@external/database/sql/Row.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.addDurationToCounter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.execCheckpoint/github.com/benbjohnson/litestream.DB.execCheckpoint.closure_2","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/database/sql/DB.ExecContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/database/sql/DB.QueryRowContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/database/sql/Row.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/path/filepath/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/@external/time/Duration.Milliseconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.acquireReadLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkDatabaseBehindReplica","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init/github.com/benbjohnson/litestream.DB.init.closure_1","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init/github.com/benbjohnson/litestream.DB.init.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init/github.com/benbjohnson/litestream.DB.init.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","dst":"can://litestream/litestream/@external/bytes/Equal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","dst":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","dst":"can://litestream/litestream/@external/context/Cause","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncExecutorWait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncExecutorWait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/log/slog/Logger.Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/time/After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/time/NewTicker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/@external/time/Ticker.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.monitor","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.openLocalLTXFile","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.openLocalLTXFile","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.releaseReadLock","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL","dst":"can://litestream/litestream/@external/database/sql/Conn.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL","dst":"can://litestream/litestream/@external/database/sql/Conn.Raw","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL","dst":"can://litestream/litestream/@external/database/sql/DB.Conn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setPersistWAL/github.com/benbjohnson/litestream.DB.setPersistWAL.closure_1","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotPosition","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader","dst":"can://litestream/litestream/@external/io/Pipe","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader","dst":"can://litestream/litestream/@external/os/File.Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/io/PipeWriter.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/@external/time/Time.UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotHeaderWALRange","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotReader/github.com/benbjohnson/litestream.DB.snapshotReader.closure_1","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset/github.com/benbjohnson/litestream.DB.snapshotWALEndOffset.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Mode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/log/slog/Logger.Log","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/os/Chown","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/os/File.Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/os/Rename","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/path/filepath/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/@external/time/Time.UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.invalidatePosCache","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_4","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync/github.com/benbjohnson/litestream.DB.sync.closure_5","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.ltxStagingFile/github.com/benbjohnson/litestream.ltxStagingFile.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.applySyncExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.beginSyncDiag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.checkpointIfNeeded","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ensureWALExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.exceedsTruncateThreshold","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.newSyncExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.syncExecutor/github.com/benbjohnson/litestream.syncExecutor.applySyncResult","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.finishSyncDiag","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.addDurationToCounter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked/github.com/benbjohnson/litestream.DB.syncLocked.closure_2","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lockExec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncOnce","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncLocked","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/context/WithTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/log/slog/Logger.Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/time/After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/@external/time/Until","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry/github.com/benbjohnson/litestream.DB.syncReplicaWithRetry.closure_1","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verify","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSync","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.setSyncDiagPhase","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyAndSyncWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/@external/log/slog/Logger.Log","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.detectFullCheckpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.lastPageMatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.verifyWithExecutor/github.com/benbjohnson/litestream.DB.verifyWithExecutor.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.walFileSize","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.WALPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","dst":"can://litestream/litestream/@external/context/Cause","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","dst":"can://litestream/litestream/@external/log/slog/Logger.Log","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromDB","dst":"can://litestream/litestream/@external/os/File.ReadAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","dst":"can://litestream/litestream/@external/context/Cause","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","dst":"can://litestream/litestream/@external/log/slog/Logger.Log","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","dst":"can://litestream/litestream/@external/os/File.ReadAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.writeLTXFromWAL","dst":"can://litestream/litestream/@external/slices/Sort","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/@external/log/slog/With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/@external/path/filepath/Split","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/go/compactor.go/github.com/benbjohnson/litestream.NewCompactor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.initMetrics","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_1","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_1","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_2","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB/github.com/benbjohnson/litestream.NewDB.closure_2","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.addDurationToCounter","dst":"can://litestream/litestream/@external/time/Duration.Seconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.defaultOpenLTXFile","dst":"can://litestream/litestream/@external/os/OpenFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isDiskFullError","dst":"can://litestream/litestream/@external/strings/ToLower","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.isSQLiteBusyError","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/github.com/benbjohnson/litestream.snapshotReadCloser.Close","dst":"can://litestream/litestream/@external/io/PipeReader.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadCloser/github.com/benbjohnson/litestream.snapshotReadCloser.Close","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close","dst":"can://litestream/litestream/@external/sync/Once.Do","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.snapshotReadPosition/github.com/benbjohnson/litestream.snapshotReadPosition.close/github.com/benbjohnson/litestream.snapshotReadPosition.close.closure_1","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/os/RemoveAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/io/fs/DirEntry.Name","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/os/ReadDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/slices/Sort","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","dst":"can://litestream/litestream/@external/path/filepath/FromSlash","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Name","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/os/File.Readdir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","dst":"can://litestream/litestream/@external/path/filepath/FromSlash","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXLevelDir","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/os/File.Seek","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/io/fs/DirEntry.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/io/fs/DirEntry.Name","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/os/ReadDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/slices/SortFunc","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/io/fs/DirEntry.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/io/fs/DirEntry.Name","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/os/ReadDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/slices/SortFunc","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3/github.com/benbjohnson/litestream/file.ReplicaClient.WALSegmentsV3.closure_1","dst":"can://litestream/litestream/@external/cmp/Compare","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/MultiReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/TeeReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Size","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/os/Chtimes","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/os/File.Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/os/File.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/os/Rename","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/path/filepath/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.FileInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/file.ReplicaClient.WriteLTXFile.closure_1","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.ReplicaClient/github.com/benbjohnson/litestream/file.ReplicaClient.db","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.init","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.newLTXFileIterator","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/MultiReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/TeeReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.Format","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.init","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.isNotExists","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ltxFileIterator/github.com/benbjohnson/litestream/gs.ltxFileIterator.Next","dst":"can://litestream/litestream/@external/time/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.LastPingAt","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping","dst":"can://litestream/litestream/@external/net/http/Client.Do","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping","dst":"can://litestream/litestream/@external/net/http/NewRequestWithContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump","dst":"can://litestream/litestream/@external/bytes/Buffer.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump","dst":"can://litestream/litestream/@external/bytes/Equal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.Hexdump","dst":"can://litestream/litestream/go/internal/hexdump.go/github.com/benbjohnson/litestream/internal.toChar","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Mode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","dst":"can://litestream/litestream/@external/os/File.Chown","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","dst":"can://litestream/litestream/@external/os/OpenFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.CreateFile","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.LZ4ReadCloser/github.com/benbjohnson/litestream/internal.LZ4ReadCloser.Close","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Mode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/@external/os/Chown","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/@external/os/IsPathSeparator","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/@external/os/Lstat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/@external/os/Mkdir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.fixRootDirectory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Close","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCloser/github.com/benbjohnson/litestream/internal.ReadCloser.Read","dst":"can://litestream/litestream/@external/io/Reader.Read","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.Read","dst":"can://litestream/litestream/@external/io/Reader.Read","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.Fileinfo","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Sys","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","dst":"can://litestream/litestream/@external/os/File.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Close","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitedReadCloser/github.com/benbjohnson/litestream/internal.LimitedReadCloser.Read","dst":"can://litestream/litestream/@external/io/Reader.Read","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive","dst":"can://litestream/litestream/@external/os/File.Fd","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive","dst":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile","dst":"can://litestream/litestream/@external/os/File.Fd","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile","dst":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.setFcntlLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath","dst":"can://litestream/litestream/@external/strings/Index","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath","dst":"can://litestream/litestream/@external/strings/LastIndex","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath","dst":"can://litestream/litestream/@external/strings/TrimSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","dst":"can://litestream/litestream/@external/log/slog/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","dst":"can://litestream/litestream/@external/log/slog/NewJSONHandler","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","dst":"can://litestream/litestream/@external/log/slog/NewTextHandler","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","dst":"can://litestream/litestream/@external/log/slog/SetDefault","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","dst":"can://litestream/litestream/@external/os/File.Fd","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","dst":"can://litestream/litestream/@external/os/Getenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.InitLog","dst":"can://litestream/litestream/@external/strings/ToUpper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr","dst":"can://litestream/litestream/@external/log/slog/StringValue","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr","dst":"can://litestream/litestream/@external/log/slog/Value.Any","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.ReplaceAttr","dst":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.CleanSourcePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.init","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/log.go/github.com/benbjohnson/litestream/internal.init","dst":"can://litestream/litestream/@external/runtime/debug/ReadBuildInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Close","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.LTXFileOpener/github.com/benbjohnson/litestream/internal.LTXFileOpener.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.Read","dst":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.dropStream","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","dst":"can://litestream/litestream/@external/io/Reader.Read","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","dst":"can://litestream/litestream/@external/sync/atomic/Bool.Load","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","dst":"can://litestream/litestream/@external/time/AfterFunc","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream","dst":"can://litestream/litestream/@external/time/Timer.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream/github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.readStream/github.com/benbjohnson/litestream/internal.ResumableReader.readStream.closure_1","dst":"can://litestream/litestream/@external/sync/atomic/Bool.Store","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.retry","dst":"can://litestream/litestream/@external/time/After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.setStream","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.ResumableReader/github.com/benbjohnson/litestream/internal.ResumableReader.stream","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer","dst":"can://litestream/litestream/@external/net/Addr.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer","dst":"can://litestream/litestream/@external/net/Listen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer","dst":"can://litestream/litestream/@external/net/Listener.Addr","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer","dst":"can://litestream/litestream/@external/testing/common.Fatal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1","dst":"can://litestream/litestream/@external/net/Listener.Accept","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1/github.com/benbjohnson/litestream/internal/testingutil.MockSFTPServer.closure_1.closure_1.closure_1","dst":"can://litestream/litestream/@external/testing/common.Logf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://litestream/litestream/@external/os/RemoveAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://litestream/litestream/@external/path/filepath/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://litestream/litestream/@external/testing/TB.Fatal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseDBs","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","dst":"can://litestream/litestream/@external/testing/TB.Fatal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustCloseSQLDB","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","dst":"can://litestream/litestream/@external/testing/TB.Fatalf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.DeleteAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustDeleteAll","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","dst":"can://litestream/litestream/@external/path/filepath/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","dst":"can://litestream/litestream/@external/testing/TB.TempDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://litestream/litestream/@external/testing/TB.Fatal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBAt","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenDBs","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","dst":"can://litestream/litestream/@external/database/sql/DB.ExecContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","dst":"can://litestream/litestream/@external/testing/TB.Fatal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.MustOpenSQLDB","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","dst":"can://litestream/litestream/go/abs/replica_client.go/github.com/benbjohnson/litestream/abs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Skip","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","dst":"can://litestream/litestream/@external/log/slog/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","dst":"can://litestream/litestream/@external/log/slog/NewTextHandler","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","dst":"can://litestream/litestream/@external/strings/EqualFold","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","dst":"can://litestream/litestream/@external/testing/TB.Logf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.TempDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","dst":"can://litestream/litestream/go/file/replica_client.go/github.com/benbjohnson/litestream/file.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/@external/os/Getenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Logf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","dst":"can://litestream/litestream/go/gs/replica_client.go/github.com/benbjohnson/litestream/gs.ReplicaClient/github.com/benbjohnson/litestream/gs.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Skip","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Fatalf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewABSReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewB2ReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewFileReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewGSReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewNATSReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewOSSReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewR2ReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewReplicaClient","dst":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewS3ReplicaClient","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewSFTPReplicaClient","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Skip","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewTigrisReplicaClient","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","dst":"can://litestream/litestream/@external/math/rand/v2/Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","dst":"can://litestream/litestream/@external/testing/TB.Helper","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.NewWebDAVReplicaClient","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/internal/testingutil/testingutil.go/github.com/benbjohnson/litestream/internal/testingutil.ReplicaClientTypes","dst":"can://litestream/litestream/@external/strings/Split","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired","dst":"can://litestream/litestream/@external/time/Time.After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.TTL","dst":"can://litestream/litestream/@external/time/Until","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/github.com/benbjohnson/litestream.LeaseExistsError.Error","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.LeaseExistsError/github.com/benbjohnson/litestream.LeaseExistsError.Error","dst":"can://litestream/litestream/@external/time/Time.Format","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.Checksum","dst":"can://litestream/litestream/@external/encoding/binary/ByteOrder.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.Checksum","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXDir","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","dst":"can://litestream/litestream/@external/strconv/Itoa","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt","dst":"can://litestream/litestream/@external/os/File.ReadAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALFileAt","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader","dst":"can://litestream/litestream/@external/io/ReadFull","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.readWALHeader","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles","dst":"can://litestream/litestream/@external/path/filepath/Walk","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles/github.com/benbjohnson/litestream.removeTmpFiles.closure_1","dst":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles/github.com/benbjohnson/litestream.removeTmpFiles.closure_1","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.removeTmpFiles/github.com/benbjohnson/litestream.removeTmpFiles.closure_1","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback","dst":"can://litestream/litestream/@external/database/sql/Tx.Rollback","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.rollback","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Userinfo.Password","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Userinfo.Username","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/strings/Trim","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Close","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Close","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/sort/Slice","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/time/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/io/CopyN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/MultiReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/TeeReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.Format","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.connect","dst":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.options","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.initObjectStore","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.ltxPath","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","dst":"can://litestream/litestream/@external/strconv/Atoi","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","dst":"can://litestream/litestream/@external/strings/Split","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.ReplicaClient/github.com/benbjohnson/litestream/nats.ReplicaClient.parseLTXPath","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.init","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/nats/replica_client.go/github.com/benbjohnson/litestream/nats.isNotFoundError","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","dst":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseURL","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ParseHost","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/MultiReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/TeeReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.Format","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","dst":"can://litestream/litestream/@external/errors/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","dst":"can://litestream/litestream/@external/strings/Builder.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.deleteResultError","dst":"can://litestream/litestream/@external/strings/Builder.WriteString","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.Next","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/oss.fileIterator.fetchMetadataBatch.closure_1","dst":"can://litestream/litestream/@external/time/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.fileIterator/github.com/benbjohnson/litestream/oss.fileIterator.initPaginator","dst":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.ReplicaClient/github.com/benbjohnson/litestream/oss.ReplicaClient.ltxPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.init","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.isNotExists","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/oss/replica_client.go/github.com/benbjohnson/litestream/oss.newFileIterator","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplicaWithClient","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","dst":"can://litestream/litestream/@external/os/ReadFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.TXIDPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","dst":"can://litestream/litestream/@external/time/Time.After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","dst":"can://litestream/litestream/@external/time/Time.Before","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CalcRestoreTarget","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.CreatedAt","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Type","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/io/Pipe","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/os/Create","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/os/File.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/os/Rename","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/path/filepath/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/internal/resumable_reader.go/github.com/benbjohnson/litestream/internal.NewResumableReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.CalcRestorePlan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.ReadTXIDFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_1","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_2","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_3","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Restore/github.com/benbjohnson/litestream.Replica.Restore.closure_4","dst":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/os/Rename","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/os/Stat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/@external/path/filepath/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.DirInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.MkdirAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.DB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.RestoreV3/github.com/benbjohnson/litestream.Replica.RestoreV3.closure_1","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start","dst":"can://litestream/litestream/@external/sync/WaitGroup.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start/github.com/benbjohnson/litestream.Replica.Start.closure_1","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Start/github.com/benbjohnson/litestream.Replica.Start.closure_1","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Stop","dst":"can://litestream/litestream/@external/sync/WaitGroup.Wait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Sync","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://litestream/litestream/@external/time/Time.After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://litestream/litestream/@external/time/Time.Before","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.WALSegmentsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenWALSegmentV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3.closure_1","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/@external/crypto/rand/Read","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/@external/os/File.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/@external/os/File.Truncate","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/@external/os/File.WriteAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.LockFileExclusive","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/go/internal/lock_unix.go/github.com/benbjohnson/litestream/internal.UnlockFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1","dst":"can://litestream/litestream/@external/errors/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles.closure_1","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","dst":"can://litestream/litestream/@external/os/OpenFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.appendWALSegmentV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3/github.com/benbjohnson/litestream.Replica.applyWALSegmentsV3.closure_2","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","dst":"can://litestream/litestream/@external/os/Create","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","dst":"can://litestream/litestream/@external/os/File.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.OpenSnapshotV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_1","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3/github.com/benbjohnson/litestream.Replica.downloadSnapshotV3.closure_2","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap/github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1","dst":"can://litestream/litestream/@external/errors/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.fillFollowGap/github.com/benbjohnson/litestream.Replica.fillFollowGap.closure_1","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.GenerationsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ReplicaClientV3/github.com/benbjohnson/litestream.ReplicaClientV3.SnapshotsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/os/File.ReadAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/os/OpenFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/time/NewTicker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/@external/time/Ticker.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.applyNewLTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow/github.com/benbjohnson/litestream.Replica.follow.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.follow/github.com/benbjohnson/litestream.Replica.follow.closure_1","dst":"can://litestream/litestream/@external/os/File.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync","dst":"can://litestream/litestream/@external/context/Cause","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync","dst":"can://litestream/litestream/@external/sync/atomic/Int64.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/log/slog/Logger.Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/time/After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/time/NewTicker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/@external/time/Ticker.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Notify","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.ResetLocalState","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXError/github.com/benbjohnson/litestream.LTXError.IsAutoRecoverable","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.monitor","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/@external/time/Time.After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBounds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.TimeBoundsV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestLTXSnapshotForTimestamp","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.shouldUseV3Restore","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.findBestV3SnapshotForTimestamp","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.sync","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/@external/context/Cause","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/@external/log/slog/Group","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/@external/log/slog/String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.RecordSuccessfulSync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.SetPos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.calcPos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.lockSync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce/github.com/benbjohnson/litestream.Replica.syncOnce.closure_1","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.syncOnce/github.com/benbjohnson/litestream.Replica.syncOnce.closure_1","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://litestream/litestream/@external/os/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LTXPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.NewLTXError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Logger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.WriteLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.uploadLTXFile/github.com/benbjohnson/litestream.Replica.uploadLTXFile.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/@external/fmt/Fprintln","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/@external/os/Create","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/@external/os/File.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/@external/os/Rename","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/@external/path/filepath/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/go/internal/internal_unix.go/github.com/benbjohnson/litestream/internal.FsyncDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.WriteTXIDFile","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.TXIDPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity","dst":"can://litestream/litestream/@external/database/sql/DB.QueryRowContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity","dst":"can://litestream/litestream/@external/database/sql/Row.Scan","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkIntegrity/github.com/benbjohnson/litestream.checkIntegrity.closure_1","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3","dst":"can://litestream/litestream/@external/database/sql/DB.Exec","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3","dst":"can://litestream/litestream/@external/database/sql/Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.checkpointV3/github.com/benbjohnson/litestream.checkpointV3.closure_1","dst":"can://litestream/litestream/@external/database/sql/DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3","dst":"can://litestream/litestream/@external/time/Time.After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.filterWALSegmentsV3","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3","dst":"can://litestream/litestream/@external/time/Time.After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.findBestSnapshotV3","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreCandidateBetter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.refresh","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.restoreLevelCursor/github.com/benbjohnson/litestream.restoreLevelCursor.ensureCurrent","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.sortSnapshotsV3ByCreatedAt","dst":"can://litestream/litestream/@external/time/Time.After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchLTXHeader","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPage","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex","dst":"can://litestream/litestream/@external/bufio/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FetchPageIndex","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.FindLTXFiles","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.LTXFiles","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","dst":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint64","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","dst":"can://litestream/litestream/@external/io/Closer.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","dst":"can://litestream/litestream/@external/io/NopCloser","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","dst":"can://litestream/litestream/@external/io/ReadAll","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.fetchPageIndexData","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.OpenLTXFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue","dst":"can://litestream/litestream/@external/net/url/Values.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue","dst":"can://litestream/litestream/@external/strings/ToLower","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath","dst":"can://litestream/litestream/@external/path/Clean","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","dst":"can://litestream/litestream/@external/net/url/Values.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","dst":"can://litestream/litestream/@external/strconv/ParseInt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","dst":"can://litestream/litestream/@external/strings/Split","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","dst":"can://litestream/litestream/@external/strings/TrimSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsLocalEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Port","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","dst":"can://litestream/litestream/@external/strings/HasSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL","dst":"can://litestream/litestream/@external/regexp/Regexp.MatchString","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/sync/RWMutex.RLock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","dst":"can://litestream/litestream/@external/strings/ToLower","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/@external/net/url/URL.Query","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/@external/net/url/URL.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/@external/path/Clean","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/@external/strings/ToLower","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURLWithQuery","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN","dst":"can://litestream/litestream/@external/strings/SplitN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","dst":"can://litestream/litestream/@external/sync/RWMutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","dst":"can://litestream/litestream/@external/sync/RWMutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ReplicaTypeFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.ParseReplicaURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","dst":"can://litestream/litestream/@external/strings/ToLower","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseEndpoint","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://litestream/litestream/@external/net/url/ParseQuery","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://litestream/litestream/@external/strings/IndexByte","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://litestream/litestream/@external/strings/ToLower","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.CleanReplicaURLPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.parseS3AccessPointURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN","dst":"can://litestream/litestream/@external/strings/Index","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN","dst":"can://litestream/litestream/@external/strings/IndexByte","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.splitS3AccessPointARN","dst":"can://litestream/litestream/@external/strings/ToLower","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/go/leaser.go/github.com/benbjohnson/litestream.Lease/github.com/benbjohnson/litestream.Lease.IsExpired","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.AcquireLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.DeleteObject","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.ReleaseLease","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.RenewLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://litestream/litestream/@external/encoding/json/Decoder.Decode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://litestream/litestream/@external/encoding/json/NewDecoder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.GetObject","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.readLease","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://litestream/litestream/@external/encoding/json/Marshal","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.lockKey","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.S3API/github.com/benbjohnson/litestream/s3.S3API.PutObject","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.Leaser/github.com/benbjohnson/litestream/s3.Leaser.writeLease","dst":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser","dst":"can://litestream/litestream/@external/os/Getpid","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.NewLeaser","dst":"can://litestream/litestream/@external/os/Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isNotFoundError","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/leaser.go/github.com/benbjohnson/litestream/s3.isPreconditionFailed","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Values.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/os/Getenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.BoolQueryValue","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.EnsureEndpointScheme","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IntQueryValue","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsBackblazeEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsCloudflareR2Endpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsDigitalOceanEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsFilebaseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsHetznerEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsMinIOEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsScalewayEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsSupabaseEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegionFromS3ARN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","dst":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","dst":"can://litestream/litestream/@external/strings/SplitN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL","dst":"can://litestream/litestream/@external/strings/SplitN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseURL","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ParseHost","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/time/Duration.Milliseconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/time/Duration.Seconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/slices/Sort","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/strings/TrimPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/@external/strings/TrimSuffix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.GenerationsPathV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.GenerationsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init/github.com/benbjohnson/litestream/s3.ReplicaClient.Init.closure_1","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenSnapshotV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewLZ4Reader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.OpenWALSegmentV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/@external/slices/SortFunc","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.SnapshotsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/@external/slices/SortFunc","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALPathV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3/github.com/benbjohnson/litestream/s3.ReplicaClient.WALSegmentsV3.closure_1","dst":"can://litestream/litestream/@external/cmp/Compare","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint.closure_1","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.findBucketRegion","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.configureEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsGoogleCloudStorageEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.IsTigrisEndpoint","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_1","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_2","dst":"can://litestream/litestream/@external/strings/Contains","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1/github.com/benbjohnson/litestream/s3.ReplicaClient.middlewareOption.closure_1.closure_5","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","dst":"can://litestream/litestream/@external/time/Time.Format","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","dst":"can://litestream/litestream/@external/io/Seeker.Seek","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadLTX","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","dst":"can://litestream/litestream/@external/io/Seeker.Seek","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadSizedLTX","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/bytes/Buffer.Bytes","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/bytes/Buffer.Len","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/io/CopyN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/io/MultiReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/io/TeeReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.NewReadCounter","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/go/internal/internal.go/github.com/benbjohnson/litestream/internal.ReadCounter/github.com/benbjohnson/litestream/internal.ReadCounter.N","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.uploadStreamedLTX","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.putObjectInput","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/crypto/md5/Sum","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/encoding/base64/Encoding.DecodeString","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/encoding/base64/Encoding.EncodeToString","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/net/IP.IsLoopback","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/net/IP.IsPrivate","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/net/ParseIP","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/net/url/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/net/url/URL.Hostname","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.ReplicaClient/github.com/benbjohnson/litestream/s3.ReplicaClient.validateSSEConfig","dst":"can://litestream/litestream/@external/strings/HasPrefix","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","dst":"can://litestream/litestream/@external/crypto/md5/Sum","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","dst":"can://litestream/litestream/@external/encoding/base64/Encoding.EncodeToString","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.computeDeleteObjectsContentMD5","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","dst":"can://litestream/litestream/@external/errors/New","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","dst":"can://litestream/litestream/@external/fmt/Fprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","dst":"can://litestream/litestream/@external/strings/Builder.String","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.deleteOutputError","dst":"can://litestream/litestream/@external/strings/Builder.WriteString","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifierList","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeObjectIdentifier","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.Next","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.fileIterator/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch/github.com/benbjohnson/litestream/s3.fileIterator.fetchMetadataBatch.closure_1","dst":"can://litestream/litestream/@external/time/Parse","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.init","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.isNotExists","dst":"can://litestream/litestream/@external/errors/As","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.marshalDeleteObjects","dst":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.encodeDeleteDocument","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.newFileIterator","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","dst":"can://litestream/litestream/@external/log/slog/Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","dst":"can://litestream/litestream/@external/os/Getenv","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","dst":"can://litestream/litestream/@external/strings/Split","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","dst":"can://litestream/litestream/@external/strings/ToLower","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/s3/replica_client.go/github.com/benbjohnson/litestream/s3.parseS3DebugEnv","dst":"can://litestream/litestream/@external/strings/TrimSpace","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer","dst":"can://litestream/litestream/@external/net/http/NewServeMux","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.NewServer","dst":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","dst":"can://litestream/litestream/@external/context/WithTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","dst":"can://litestream/litestream/@external/net/http/Server.Shutdown","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Close","dst":"can://litestream/litestream/@external/sync/WaitGroup.Wait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/io/fs/FileInfo.Mode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/net/Listen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/net/Listener.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/os/Chmod","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/os/Lstat","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/sync/WaitGroup.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start/github.com/benbjohnson/litestream.Server.Start.closure_1","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start/github.com/benbjohnson/litestream.Server.Start.closure_1","dst":"can://litestream/litestream/@external/net/http/Server.Serve","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.Start/github.com/benbjohnson/litestream.Server.Start.closure_1","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo","dst":"can://litestream/litestream/@external/os/Getpid","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo","dst":"can://litestream/litestream/@external/time/Duration.Seconds","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo","dst":"can://litestream/litestream/@external/time/Since","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleInfo","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleList","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/@external/encoding/json/Decoder.Decode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/@external/encoding/json/NewDecoder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.NewDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.NewReplica","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.NewReplicaClientFromURL","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleRegister","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/@external/context/WithTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/@external/encoding/json/Decoder.Decode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/@external/encoding/json/NewDecoder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStart","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/@external/context/WithTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/@external/encoding/json/Decoder.Decode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/@external/encoding/json/NewDecoder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleStop","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/@external/context/WithTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/@external/encoding/json/Decoder.Decode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/@external/encoding/json/NewDecoder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSync","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/@external/net/url/URL.Query","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/@external/net/url/Values.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncDiagnostic","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleSyncStatus","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://litestream/litestream/@external/net/url/URL.Query","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://litestream/litestream/@external/net/url/Values.Get","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleTXID","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/@external/context/WithTimeout","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/@external/encoding/json/Decoder.Decode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/@external/encoding/json/NewDecoder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.expandPath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.handleUnregister","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.Server/github.com/benbjohnson/litestream.Server.storeTXID","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","dst":"can://litestream/litestream/@external/encoding/json/Encoder.Encode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","dst":"can://litestream/litestream/@external/encoding/json/NewEncoder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","dst":"can://litestream/litestream/@external/net/http/Header.Set","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","dst":"can://litestream/litestream/@external/net/http/ResponseWriter.Header","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSON","dst":"can://litestream/litestream/@external/net/http/ResponseWriter.WriteHeader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","dst":"can://litestream/litestream/@external/encoding/json/Encoder.Encode","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","dst":"can://litestream/litestream/@external/encoding/json/NewEncoder","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","dst":"can://litestream/litestream/@external/net/http/Header.Set","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","dst":"can://litestream/litestream/@external/net/http/ResponseWriter.Header","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/server.go/github.com/benbjohnson/litestream.writeJSONError","dst":"can://litestream/litestream/@external/net/http/ResponseWriter.WriteHeader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Userinfo.Password","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Userinfo.Username","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup/github.com/benbjohnson/litestream/sftp.ReplicaClient.Cleanup.closure_1","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteAll.closure_1","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles/github.com/benbjohnson/litestream/sftp.ReplicaClient.DeleteLTXFiles.closure_1","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.Init","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles/github.com/benbjohnson/litestream/sftp.ReplicaClient.LTXFiles.closure_1","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.OpenLTXFile.closure_1","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/MultiReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/TeeReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/os/Getpid","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/path/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.UnixNano","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/sftp.ReplicaClient.WriteLTXFile.closure_1","dst":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","dst":"can://litestream/litestream/@external/log/slog/Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","dst":"can://litestream/litestream/@external/net/JoinHostPort","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","dst":"can://litestream/litestream/@external/net/SplitHostPort","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","dst":"can://litestream/litestream/@external/os/ReadFile","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.init","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.ReplicaClient/github.com/benbjohnson/litestream/sftp.ReplicaClient.resetOnConnError","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/sftp/replica_client.go/github.com/benbjohnson/litestream/sftp.init","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://litestream/litestream/@external/context/WithCancel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.NewStore","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","dst":"can://litestream/litestream/@external/slices/Clone","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","dst":"can://litestream/litestream/@external/sync/WaitGroup.Wait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Close","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/@external/log/slog/Group","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/@external/log/slog/Logger.InfoContext","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.PrevCompactionAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.PrevLevel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Compact","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTXFileInfo","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.PageSize","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Snapshot","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","dst":"can://litestream/litestream/@external/slices/Clone","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DisableDB","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnableDB","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceRetentionByTXID","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceSnapshotRetention","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","dst":"can://litestream/litestream/@external/sync/WaitGroup.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","dst":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevels/github.com/benbjohnson/litestream.CompactionLevels.Validate","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_1","dst":"can://litestream/litestream/go/replica_client.go/github.com/benbjohnson/litestream.ReplicaClient/github.com/benbjohnson/litestream.ReplicaClient.Init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_2","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_3","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_3","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_4","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_4","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SnapshotLevel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_4","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_5","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_5","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_6","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Open/github.com/benbjohnson/litestream.Store.Open.closure_6","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/@external/context/Background","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/@external/log/slog/Logger.With","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/@external/path/filepath/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Open","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SetLogger","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.RegisterDB","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetDone","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetL0Retention","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetRetentionEnabled","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetRetentionEnabled","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncInterval","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetShutdownSyncTimeout","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SetVerifyCompaction","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.MaxLTX","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Sync","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.SyncAndWait","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.Pos","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.SyncDB","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.FindDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","dst":"can://litestream/litestream/@external/slices/Delete","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.UnregisterDB","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","dst":"can://litestream/litestream/@external/strconv/Itoa","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","dst":"can://litestream/litestream/go/replica.go/github.com/benbjohnson/litestream.Replica/github.com/benbjohnson/litestream.Replica.ValidateLevel","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","dst":"can://litestream/litestream/@external/time/Time.Before","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.LastSuccessfulSyncAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/log/slog/Logger.Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/time/NewTimer","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/time/Time.After","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/time/Time.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/time/Timer.Reset","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/time/Timer.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/@external/time/Until","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/go/compaction_level.go/github.com/benbjohnson/litestream.CompactionLevel/github.com/benbjohnson/litestream.CompactionLevel.NextCompactionAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.CompactDB","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorCompactionLevel","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.EnforceSnapshotRetention","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","dst":"can://litestream/litestream/@external/time/NewTicker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","dst":"can://litestream/litestream/@external/time/Ticker.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/@external/time/NewTicker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/@external/time/Ticker.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.EnforceL0RetentionByTime","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.IsOpen","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/go/db.go/github.com/benbjohnson/litestream.DB/github.com/benbjohnson/litestream.DB.Path","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorL0Retention","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.DBs","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://litestream/litestream/@external/log/slog/Logger.Info","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://litestream/litestream/@external/log/slog/Logger.Warn","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://litestream/litestream/@external/time/NewTicker","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://litestream/litestream/@external/time/Ticker.Stop","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.isShutdownError","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorValidation","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.Validate","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://litestream/litestream/@external/log/slog/Logger.Error","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://litestream/litestream/@external/time/Now","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://litestream/litestream/@external/time/Time.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.Ping","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.RecordPing","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://litestream/litestream/go/heartbeat.go/github.com/benbjohnson/litestream.HeartbeatClient/github.com/benbjohnson/litestream.HeartbeatClient.ShouldPing","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.sendHeartbeatIfNeeded","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.allDatabasesHealthy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","dst":"can://litestream/litestream/@external/sync/WaitGroup.Add","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.hasHeartbeatConfigLocked","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded.closure_1","dst":"can://litestream/litestream/@external/sync/WaitGroup.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded/github.com/benbjohnson/litestream.Store.startHeartbeatMonitorIfNeeded.closure_1","dst":"can://litestream/litestream/go/store.go/github.com/benbjohnson/litestream.Store/github.com/benbjohnson/litestream.Store.monitorHeartbeats","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.GenerationPathV3","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.GenerationsPathV3","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.IsGenerationIDV3","dst":"can://litestream/litestream/@external/regexp/Regexp.MatchString","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","dst":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseSnapshotFilenameV3","dst":"can://litestream/litestream/@external/strconv/ParseInt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","dst":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.ParseWALSegmentFilenameV3","dst":"can://litestream/litestream/@external/strconv/ParseInt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.String","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.String","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.PosV3/github.com/benbjohnson/litestream.PosV3.IsZero","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatSnapshotFilenameV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotPathV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.SnapshotsPathV3","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALPathV3","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","dst":"can://litestream/litestream/@external/path/Join","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.FormatWALSegmentFilenameV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALSegmentPathV3","dst":"can://litestream/litestream/go/v3.go/github.com/benbjohnson/litestream.WALPathV3","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReader","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","dst":"can://litestream/litestream/@external/context/Cause","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","dst":"can://litestream/litestream/@external/context/Context.Err","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.NewWALReaderWithOffset","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.PrevFrameMismatchError/github.com/benbjohnson/litestream.PrevFrameMismatchError.Error","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","dst":"can://litestream/litestream/@external/encoding/binary/ByteOrder.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.assert","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil","dst":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.FrameSaltsUntil","dst":"can://litestream/litestream/@external/io/ReaderAt.ReadAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.PageMap","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","dst":"can://litestream/litestream/@external/errors/Is","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","dst":"can://litestream/litestream/@external/log/slog/Logger.Log","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.Offset","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.pageMap","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.ReadFrame","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","dst":"can://litestream/litestream/@external/context/Cause","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","dst":"can://litestream/litestream/@external/context/Context.Done","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","dst":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","dst":"can://litestream/litestream/@external/io/ReaderAt.ReadAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readFrame","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","dst":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","dst":"can://litestream/litestream/@external/io/ReaderAt.ReadAt","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALReader/github.com/benbjohnson/litestream.WALReader.readHeader","dst":"can://litestream/litestream/go/wal_reader.go/github.com/benbjohnson/litestream.WALChecksum","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Default","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/fmt/Sprintf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Userinfo.Password","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","dst":"can://litestream/litestream/@external/net/url/Userinfo.Username","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClientFromURL","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.NewReplicaClient","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteAll","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/log/slog/Logger.Debug","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.DeleteLTXFiles","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.Init","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/path/Base","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/@external/sort/Slice","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXLevelDir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.LTXFiles","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/bytes/NewReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/io/CopyN","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/io/NopCloser","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/@external/os/IsNotExist","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/internal/limit_read_closer.go/github.com/benbjohnson/litestream/internal.LimitReadCloser","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.OpenLTXFile","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.SetLogger","dst":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/Copy","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/MultiReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/io/TeeReader","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/os/CreateTemp","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/os/File.Seek","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/path/Dir","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/Time.UTC","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/@external/time/UnixMilli","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/litestream.go/github.com/benbjohnson/litestream.LTXFilePath","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile","dst":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1","dst":"can://litestream/litestream/@external/os/File.Close","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1","dst":"can://litestream/litestream/@external/os/File.Name","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile/github.com/benbjohnson/litestream/webdav.ReplicaClient.WriteLTXFile.closure_1","dst":"can://litestream/litestream/@external/os/Remove","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","dst":"can://litestream/litestream/@external/fmt/Errorf","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","dst":"can://litestream/litestream/@external/sync/Mutex.Lock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.ReplicaClient/github.com/benbjohnson/litestream/webdav.ReplicaClient.init","dst":"can://litestream/litestream/@external/sync/Mutex.Unlock","prov":["go/types"],"weight":1},{"src":"can://litestream/litestream/go/webdav/replica_client.go/github.com/benbjohnson/litestream/webdav.init","dst":"can://litestream/litestream/go/replica_url.go/github.com/benbjohnson/litestream.RegisterReplicaClientFactory","prov":["go/types"],"weight":1}],"external_symbols":{"can://litestream/litestream/@external/bufio/NewReader":{"id":"can://litestream/litestream/@external/bufio/NewReader","kind":"external","name":"NewReader","module":"bufio","signature":"NewReader","parameters":[{"name":"rd","type":"io.Reader"}],"return_type":"*bufio.Reader"},"can://litestream/litestream/@external/bufio/NewScanner":{"id":"can://litestream/litestream/@external/bufio/NewScanner","kind":"external","name":"NewScanner","module":"bufio","signature":"NewScanner","parameters":[{"name":"r","type":"io.Reader"}],"return_type":"*bufio.Scanner"},"can://litestream/litestream/@external/bufio/Scanner.Scan":{"id":"can://litestream/litestream/@external/bufio/Scanner.Scan","kind":"external","name":"Scan","module":"bufio","signature":"Scanner.Scan","parameters":[],"return_type":"bool","receiver":{"name":"s","type":"*bufio.Scanner"}},"can://litestream/litestream/@external/bufio/Scanner.Text":{"id":"can://litestream/litestream/@external/bufio/Scanner.Text","kind":"external","name":"Text","module":"bufio","signature":"Scanner.Text","parameters":[],"return_type":"string","receiver":{"name":"s","type":"*bufio.Scanner"}},"can://litestream/litestream/@external/bytes/Buffer.Bytes":{"id":"can://litestream/litestream/@external/bytes/Buffer.Bytes","kind":"external","name":"Bytes","module":"bytes","signature":"Buffer.Bytes","parameters":[],"return_type":"[]byte","receiver":{"name":"b","type":"*bytes.Buffer"}},"can://litestream/litestream/@external/bytes/Buffer.Len":{"id":"can://litestream/litestream/@external/bytes/Buffer.Len","kind":"external","name":"Len","module":"bytes","signature":"Buffer.Len","parameters":[],"return_type":"int","receiver":{"name":"b","type":"*bytes.Buffer"}},"can://litestream/litestream/@external/bytes/Buffer.String":{"id":"can://litestream/litestream/@external/bytes/Buffer.String","kind":"external","name":"String","module":"bytes","signature":"Buffer.String","parameters":[],"return_type":"string","receiver":{"name":"b","type":"*bytes.Buffer"}},"can://litestream/litestream/@external/bytes/Equal":{"id":"can://litestream/litestream/@external/bytes/Equal","kind":"external","name":"Equal","module":"bytes","signature":"Equal","parameters":[{"name":"a","type":"[]byte"},{"name":"b","type":"[]byte"}],"return_type":"bool"},"can://litestream/litestream/@external/bytes/NewReader":{"id":"can://litestream/litestream/@external/bytes/NewReader","kind":"external","name":"NewReader","module":"bytes","signature":"NewReader","parameters":[{"name":"b","type":"[]byte"}],"return_type":"*bytes.Reader"},"can://litestream/litestream/@external/cmp/Compare":{"id":"can://litestream/litestream/@external/cmp/Compare","kind":"external","name":"Compare","module":"cmp","signature":"Compare","parameters":[{"name":"x","type":"T"},{"name":"y","type":"T"}],"return_type":"int"},"can://litestream/litestream/@external/context/Background":{"id":"can://litestream/litestream/@external/context/Background","kind":"external","name":"Background","module":"context","signature":"Background","parameters":[],"return_type":"context.Context"},"can://litestream/litestream/@external/context/Cause":{"id":"can://litestream/litestream/@external/context/Cause","kind":"external","name":"Cause","module":"context","signature":"Cause","parameters":[{"name":"c","type":"context.Context"}],"return_type":"error"},"can://litestream/litestream/@external/context/Context.Done":{"id":"can://litestream/litestream/@external/context/Context.Done","kind":"external","name":"Done","module":"context","signature":"Context.Done","parameters":[],"return_type":"\u003c-chan struct{}","receiver":{"name":"_recv","type":"context.Context"}},"can://litestream/litestream/@external/context/Context.Err":{"id":"can://litestream/litestream/@external/context/Context.Err","kind":"external","name":"Err","module":"context","signature":"Context.Err","parameters":[],"return_type":"error","receiver":{"name":"_recv","type":"context.Context"}},"can://litestream/litestream/@external/context/WithCancel":{"id":"can://litestream/litestream/@external/context/WithCancel","kind":"external","name":"WithCancel","module":"context","signature":"WithCancel","parameters":[{"name":"parent","type":"context.Context"}],"return_type":"(context.Context, context.CancelFunc)"},"can://litestream/litestream/@external/context/WithTimeout":{"id":"can://litestream/litestream/@external/context/WithTimeout","kind":"external","name":"WithTimeout","module":"context","signature":"WithTimeout","parameters":[{"name":"parent","type":"context.Context"},{"name":"timeout","type":"time.Duration"}],"return_type":"(context.Context, context.CancelFunc)"},"can://litestream/litestream/@external/context/WithoutCancel":{"id":"can://litestream/litestream/@external/context/WithoutCancel","kind":"external","name":"WithoutCancel","module":"context","signature":"WithoutCancel","parameters":[{"name":"parent","type":"context.Context"}],"return_type":"context.Context"},"can://litestream/litestream/@external/crypto/md5/New":{"id":"can://litestream/litestream/@external/crypto/md5/New","kind":"external","name":"New","module":"crypto/md5","signature":"New","parameters":[],"return_type":"hash.Hash"},"can://litestream/litestream/@external/crypto/md5/Sum":{"id":"can://litestream/litestream/@external/crypto/md5/Sum","kind":"external","name":"Sum","module":"crypto/md5","signature":"Sum","parameters":[{"name":"data","type":"[]byte"}],"return_type":"[16]byte"},"can://litestream/litestream/@external/crypto/rand/Read":{"id":"can://litestream/litestream/@external/crypto/rand/Read","kind":"external","name":"Read","module":"crypto/rand","signature":"Read","parameters":[{"name":"b","type":"[]byte"}],"return_type":"(int, error)"},"can://litestream/litestream/@external/database/sql/Conn.Close":{"id":"can://litestream/litestream/@external/database/sql/Conn.Close","kind":"external","name":"Close","module":"database/sql","signature":"Conn.Close","parameters":[],"return_type":"error","receiver":{"name":"c","type":"*database/sql.Conn"}},"can://litestream/litestream/@external/database/sql/Conn.Raw":{"id":"can://litestream/litestream/@external/database/sql/Conn.Raw","kind":"external","name":"Raw","module":"database/sql","signature":"Conn.Raw","parameters":[{"name":"f","type":"func(driverConn any) error"}],"return_type":"error","receiver":{"name":"c","type":"*database/sql.Conn"}},"can://litestream/litestream/@external/database/sql/DB.Begin":{"id":"can://litestream/litestream/@external/database/sql/DB.Begin","kind":"external","name":"Begin","module":"database/sql","signature":"DB.Begin","parameters":[],"return_type":"(*database/sql.Tx, error)","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.BeginTx":{"id":"can://litestream/litestream/@external/database/sql/DB.BeginTx","kind":"external","name":"BeginTx","module":"database/sql","signature":"DB.BeginTx","parameters":[{"name":"ctx","type":"context.Context"},{"name":"opts","type":"*database/sql.TxOptions"}],"return_type":"(*database/sql.Tx, error)","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.Close":{"id":"can://litestream/litestream/@external/database/sql/DB.Close","kind":"external","name":"Close","module":"database/sql","signature":"DB.Close","parameters":[],"return_type":"error","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.Conn":{"id":"can://litestream/litestream/@external/database/sql/DB.Conn","kind":"external","name":"Conn","module":"database/sql","signature":"DB.Conn","parameters":[{"name":"ctx","type":"context.Context"}],"return_type":"(*database/sql.Conn, error)","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.Exec":{"id":"can://litestream/litestream/@external/database/sql/DB.Exec","kind":"external","name":"Exec","module":"database/sql","signature":"DB.Exec","parameters":[{"name":"query","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"return_type":"(database/sql.Result, error)","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.ExecContext":{"id":"can://litestream/litestream/@external/database/sql/DB.ExecContext","kind":"external","name":"ExecContext","module":"database/sql","signature":"DB.ExecContext","parameters":[{"name":"ctx","type":"context.Context"},{"name":"query","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"return_type":"(database/sql.Result, error)","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.Query":{"id":"can://litestream/litestream/@external/database/sql/DB.Query","kind":"external","name":"Query","module":"database/sql","signature":"DB.Query","parameters":[{"name":"query","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"return_type":"(*database/sql.Rows, error)","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.QueryRow":{"id":"can://litestream/litestream/@external/database/sql/DB.QueryRow","kind":"external","name":"QueryRow","module":"database/sql","signature":"DB.QueryRow","parameters":[{"name":"query","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"return_type":"*database/sql.Row","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.QueryRowContext":{"id":"can://litestream/litestream/@external/database/sql/DB.QueryRowContext","kind":"external","name":"QueryRowContext","module":"database/sql","signature":"DB.QueryRowContext","parameters":[{"name":"ctx","type":"context.Context"},{"name":"query","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"return_type":"*database/sql.Row","receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.SetMaxIdleConns":{"id":"can://litestream/litestream/@external/database/sql/DB.SetMaxIdleConns","kind":"external","name":"SetMaxIdleConns","module":"database/sql","signature":"DB.SetMaxIdleConns","parameters":[{"name":"n","type":"int"}],"receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/DB.SetMaxOpenConns":{"id":"can://litestream/litestream/@external/database/sql/DB.SetMaxOpenConns","kind":"external","name":"SetMaxOpenConns","module":"database/sql","signature":"DB.SetMaxOpenConns","parameters":[{"name":"n","type":"int"}],"receiver":{"name":"db","type":"*database/sql.DB"}},"can://litestream/litestream/@external/database/sql/Open":{"id":"can://litestream/litestream/@external/database/sql/Open","kind":"external","name":"Open","module":"database/sql","signature":"Open","parameters":[{"name":"driverName","type":"string"},{"name":"dataSourceName","type":"string"}],"return_type":"(*database/sql.DB, error)"},"can://litestream/litestream/@external/database/sql/Result.RowsAffected":{"id":"can://litestream/litestream/@external/database/sql/Result.RowsAffected","kind":"external","name":"RowsAffected","module":"database/sql","signature":"Result.RowsAffected","parameters":[],"return_type":"(int64, error)","receiver":{"name":"_recv","type":"database/sql.Result"}},"can://litestream/litestream/@external/database/sql/Row.Scan":{"id":"can://litestream/litestream/@external/database/sql/Row.Scan","kind":"external","name":"Scan","module":"database/sql","signature":"Row.Scan","parameters":[{"name":"dest","type":"[]any","is_variadic":true}],"return_type":"error","receiver":{"name":"r","type":"*database/sql.Row"}},"can://litestream/litestream/@external/database/sql/Rows.Close":{"id":"can://litestream/litestream/@external/database/sql/Rows.Close","kind":"external","name":"Close","module":"database/sql","signature":"Rows.Close","parameters":[],"return_type":"error","receiver":{"name":"rs","type":"*database/sql.Rows"}},"can://litestream/litestream/@external/database/sql/Rows.Next":{"id":"can://litestream/litestream/@external/database/sql/Rows.Next","kind":"external","name":"Next","module":"database/sql","signature":"Rows.Next","parameters":[],"return_type":"bool","receiver":{"name":"rs","type":"*database/sql.Rows"}},"can://litestream/litestream/@external/database/sql/Rows.Scan":{"id":"can://litestream/litestream/@external/database/sql/Rows.Scan","kind":"external","name":"Scan","module":"database/sql","signature":"Rows.Scan","parameters":[{"name":"dest","type":"[]any","is_variadic":true}],"return_type":"error","receiver":{"name":"rs","type":"*database/sql.Rows"}},"can://litestream/litestream/@external/database/sql/Stmt.Close":{"id":"can://litestream/litestream/@external/database/sql/Stmt.Close","kind":"external","name":"Close","module":"database/sql","signature":"Stmt.Close","parameters":[],"return_type":"error","receiver":{"name":"s","type":"*database/sql.Stmt"}},"can://litestream/litestream/@external/database/sql/Stmt.Exec":{"id":"can://litestream/litestream/@external/database/sql/Stmt.Exec","kind":"external","name":"Exec","module":"database/sql","signature":"Stmt.Exec","parameters":[{"name":"args","type":"[]any","is_variadic":true}],"return_type":"(database/sql.Result, error)","receiver":{"name":"s","type":"*database/sql.Stmt"}},"can://litestream/litestream/@external/database/sql/Tx.Commit":{"id":"can://litestream/litestream/@external/database/sql/Tx.Commit","kind":"external","name":"Commit","module":"database/sql","signature":"Tx.Commit","parameters":[],"return_type":"error","receiver":{"name":"tx","type":"*database/sql.Tx"}},"can://litestream/litestream/@external/database/sql/Tx.ExecContext":{"id":"can://litestream/litestream/@external/database/sql/Tx.ExecContext","kind":"external","name":"ExecContext","module":"database/sql","signature":"Tx.ExecContext","parameters":[{"name":"ctx","type":"context.Context"},{"name":"query","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"return_type":"(database/sql.Result, error)","receiver":{"name":"tx","type":"*database/sql.Tx"}},"can://litestream/litestream/@external/database/sql/Tx.Prepare":{"id":"can://litestream/litestream/@external/database/sql/Tx.Prepare","kind":"external","name":"Prepare","module":"database/sql","signature":"Tx.Prepare","parameters":[{"name":"query","type":"string"}],"return_type":"(*database/sql.Stmt, error)","receiver":{"name":"tx","type":"*database/sql.Tx"}},"can://litestream/litestream/@external/database/sql/Tx.Rollback":{"id":"can://litestream/litestream/@external/database/sql/Tx.Rollback","kind":"external","name":"Rollback","module":"database/sql","signature":"Tx.Rollback","parameters":[],"return_type":"error","receiver":{"name":"tx","type":"*database/sql.Tx"}},"can://litestream/litestream/@external/encoding/base64/Encoding.DecodeString":{"id":"can://litestream/litestream/@external/encoding/base64/Encoding.DecodeString","kind":"external","name":"DecodeString","module":"encoding/base64","signature":"Encoding.DecodeString","parameters":[{"name":"s","type":"string"}],"return_type":"([]byte, error)","receiver":{"name":"enc","type":"*encoding/base64.Encoding"}},"can://litestream/litestream/@external/encoding/base64/Encoding.EncodeToString":{"id":"can://litestream/litestream/@external/encoding/base64/Encoding.EncodeToString","kind":"external","name":"EncodeToString","module":"encoding/base64","signature":"Encoding.EncodeToString","parameters":[{"name":"src","type":"[]byte"}],"return_type":"string","receiver":{"name":"enc","type":"*encoding/base64.Encoding"}},"can://litestream/litestream/@external/encoding/binary/ByteOrder.Uint32":{"id":"can://litestream/litestream/@external/encoding/binary/ByteOrder.Uint32","kind":"external","name":"Uint32","module":"encoding/binary","signature":"ByteOrder.Uint32","parameters":[{"name":"_0","type":"[]byte"}],"return_type":"uint32","receiver":{"name":"_recv","type":"encoding/binary.ByteOrder"}},"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32":{"id":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint32","kind":"external","name":"Uint32","module":"encoding/binary","signature":"bigEndian.Uint32","parameters":[{"name":"b","type":"[]byte"}],"return_type":"uint32","receiver":{"name":"_recv","type":"encoding/binary.bigEndian"}},"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint64":{"id":"can://litestream/litestream/@external/encoding/binary/bigEndian.Uint64","kind":"external","name":"Uint64","module":"encoding/binary","signature":"bigEndian.Uint64","parameters":[{"name":"b","type":"[]byte"}],"return_type":"uint64","receiver":{"name":"_recv","type":"encoding/binary.bigEndian"}},"can://litestream/litestream/@external/encoding/json/Decoder.Decode":{"id":"can://litestream/litestream/@external/encoding/json/Decoder.Decode","kind":"external","name":"Decode","module":"encoding/json","signature":"Decoder.Decode","parameters":[{"name":"v","type":"any"}],"return_type":"error","receiver":{"name":"dec","type":"*encoding/json.Decoder"}},"can://litestream/litestream/@external/encoding/json/Encoder.Encode":{"id":"can://litestream/litestream/@external/encoding/json/Encoder.Encode","kind":"external","name":"Encode","module":"encoding/json","signature":"Encoder.Encode","parameters":[{"name":"v","type":"any"}],"return_type":"error","receiver":{"name":"enc","type":"*encoding/json.Encoder"}},"can://litestream/litestream/@external/encoding/json/Marshal":{"id":"can://litestream/litestream/@external/encoding/json/Marshal","kind":"external","name":"Marshal","module":"encoding/json","signature":"Marshal","parameters":[{"name":"v","type":"any"}],"return_type":"([]byte, error)"},"can://litestream/litestream/@external/encoding/json/MarshalIndent":{"id":"can://litestream/litestream/@external/encoding/json/MarshalIndent","kind":"external","name":"MarshalIndent","module":"encoding/json","signature":"MarshalIndent","parameters":[{"name":"v","type":"any"},{"name":"prefix","type":"string"},{"name":"indent","type":"string"}],"return_type":"([]byte, error)"},"can://litestream/litestream/@external/encoding/json/NewDecoder":{"id":"can://litestream/litestream/@external/encoding/json/NewDecoder","kind":"external","name":"NewDecoder","module":"encoding/json","signature":"NewDecoder","parameters":[{"name":"r","type":"io.Reader"}],"return_type":"*encoding/json.Decoder"},"can://litestream/litestream/@external/encoding/json/NewEncoder":{"id":"can://litestream/litestream/@external/encoding/json/NewEncoder","kind":"external","name":"NewEncoder","module":"encoding/json","signature":"NewEncoder","parameters":[{"name":"w","type":"io.Writer"}],"return_type":"*encoding/json.Encoder"},"can://litestream/litestream/@external/encoding/json/Unmarshal":{"id":"can://litestream/litestream/@external/encoding/json/Unmarshal","kind":"external","name":"Unmarshal","module":"encoding/json","signature":"Unmarshal","parameters":[{"name":"data","type":"[]byte"},{"name":"v","type":"any"}],"return_type":"error"},"can://litestream/litestream/@external/errors/As":{"id":"can://litestream/litestream/@external/errors/As","kind":"external","name":"As","module":"errors","signature":"As","parameters":[{"name":"err","type":"error"},{"name":"target","type":"any"}],"return_type":"bool"},"can://litestream/litestream/@external/errors/Is":{"id":"can://litestream/litestream/@external/errors/Is","kind":"external","name":"Is","module":"errors","signature":"Is","parameters":[{"name":"err","type":"error"},{"name":"target","type":"error"}],"return_type":"bool"},"can://litestream/litestream/@external/errors/Join":{"id":"can://litestream/litestream/@external/errors/Join","kind":"external","name":"Join","module":"errors","signature":"Join","parameters":[{"name":"errs","type":"[]error","is_variadic":true}],"return_type":"error"},"can://litestream/litestream/@external/errors/New":{"id":"can://litestream/litestream/@external/errors/New","kind":"external","name":"New","module":"errors","signature":"New","parameters":[{"name":"text","type":"string"}],"return_type":"error"},"can://litestream/litestream/@external/flag/FlagSet.Arg":{"id":"can://litestream/litestream/@external/flag/FlagSet.Arg","kind":"external","name":"Arg","module":"flag","signature":"FlagSet.Arg","parameters":[{"name":"i","type":"int"}],"return_type":"string","receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.Args":{"id":"can://litestream/litestream/@external/flag/FlagSet.Args","kind":"external","name":"Args","module":"flag","signature":"FlagSet.Args","parameters":[],"return_type":"[]string","receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.Bool":{"id":"can://litestream/litestream/@external/flag/FlagSet.Bool","kind":"external","name":"Bool","module":"flag","signature":"FlagSet.Bool","parameters":[{"name":"name","type":"string"},{"name":"value","type":"bool"},{"name":"usage","type":"string"}],"return_type":"*bool","receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.BoolVar":{"id":"can://litestream/litestream/@external/flag/FlagSet.BoolVar","kind":"external","name":"BoolVar","module":"flag","signature":"FlagSet.BoolVar","parameters":[{"name":"p","type":"*bool"},{"name":"name","type":"string"},{"name":"value","type":"bool"},{"name":"usage","type":"string"}],"receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.DurationVar":{"id":"can://litestream/litestream/@external/flag/FlagSet.DurationVar","kind":"external","name":"DurationVar","module":"flag","signature":"FlagSet.DurationVar","parameters":[{"name":"p","type":"*time.Duration"},{"name":"name","type":"string"},{"name":"value","type":"time.Duration"},{"name":"usage","type":"string"}],"receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.Float64Var":{"id":"can://litestream/litestream/@external/flag/FlagSet.Float64Var","kind":"external","name":"Float64Var","module":"flag","signature":"FlagSet.Float64Var","parameters":[{"name":"p","type":"*float64"},{"name":"name","type":"string"},{"name":"value","type":"float64"},{"name":"usage","type":"string"}],"receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.Int":{"id":"can://litestream/litestream/@external/flag/FlagSet.Int","kind":"external","name":"Int","module":"flag","signature":"FlagSet.Int","parameters":[{"name":"name","type":"string"},{"name":"value","type":"int"},{"name":"usage","type":"string"}],"return_type":"*int","receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.IntVar":{"id":"can://litestream/litestream/@external/flag/FlagSet.IntVar","kind":"external","name":"IntVar","module":"flag","signature":"FlagSet.IntVar","parameters":[{"name":"p","type":"*int"},{"name":"name","type":"string"},{"name":"value","type":"int"},{"name":"usage","type":"string"}],"receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.NArg":{"id":"can://litestream/litestream/@external/flag/FlagSet.NArg","kind":"external","name":"NArg","module":"flag","signature":"FlagSet.NArg","parameters":[],"return_type":"int","receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.Parse":{"id":"can://litestream/litestream/@external/flag/FlagSet.Parse","kind":"external","name":"Parse","module":"flag","signature":"FlagSet.Parse","parameters":[{"name":"arguments","type":"[]string"}],"return_type":"error","receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.String":{"id":"can://litestream/litestream/@external/flag/FlagSet.String","kind":"external","name":"String","module":"flag","signature":"FlagSet.String","parameters":[{"name":"name","type":"string"},{"name":"value","type":"string"},{"name":"usage","type":"string"}],"return_type":"*string","receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.StringVar":{"id":"can://litestream/litestream/@external/flag/FlagSet.StringVar","kind":"external","name":"StringVar","module":"flag","signature":"FlagSet.StringVar","parameters":[{"name":"p","type":"*string"},{"name":"name","type":"string"},{"name":"value","type":"string"},{"name":"usage","type":"string"}],"receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/FlagSet.Var":{"id":"can://litestream/litestream/@external/flag/FlagSet.Var","kind":"external","name":"Var","module":"flag","signature":"FlagSet.Var","parameters":[{"name":"value","type":"flag.Value"},{"name":"name","type":"string"},{"name":"usage","type":"string"}],"receiver":{"name":"f","type":"*flag.FlagSet"}},"can://litestream/litestream/@external/flag/NewFlagSet":{"id":"can://litestream/litestream/@external/flag/NewFlagSet","kind":"external","name":"NewFlagSet","module":"flag","signature":"NewFlagSet","parameters":[{"name":"name","type":"string"},{"name":"errorHandling","type":"flag.ErrorHandling"}],"return_type":"*flag.FlagSet"},"can://litestream/litestream/@external/fmt/Errorf":{"id":"can://litestream/litestream/@external/fmt/Errorf","kind":"external","name":"Errorf","module":"fmt","signature":"Errorf","parameters":[{"name":"format","type":"string"},{"name":"a","type":"[]any","is_variadic":true}],"return_type":"error"},"can://litestream/litestream/@external/fmt/Fprintf":{"id":"can://litestream/litestream/@external/fmt/Fprintf","kind":"external","name":"Fprintf","module":"fmt","signature":"Fprintf","parameters":[{"name":"w","type":"io.Writer"},{"name":"format","type":"string"},{"name":"a","type":"[]any","is_variadic":true}],"return_type":"(int, error)"},"can://litestream/litestream/@external/fmt/Fprintln":{"id":"can://litestream/litestream/@external/fmt/Fprintln","kind":"external","name":"Fprintln","module":"fmt","signature":"Fprintln","parameters":[{"name":"w","type":"io.Writer"},{"name":"a","type":"[]any","is_variadic":true}],"return_type":"(int, error)"},"can://litestream/litestream/@external/fmt/Printf":{"id":"can://litestream/litestream/@external/fmt/Printf","kind":"external","name":"Printf","module":"fmt","signature":"Printf","parameters":[{"name":"format","type":"string"},{"name":"a","type":"[]any","is_variadic":true}],"return_type":"(int, error)"},"can://litestream/litestream/@external/fmt/Println":{"id":"can://litestream/litestream/@external/fmt/Println","kind":"external","name":"Println","module":"fmt","signature":"Println","parameters":[{"name":"a","type":"[]any","is_variadic":true}],"return_type":"(int, error)"},"can://litestream/litestream/@external/fmt/Sprintf":{"id":"can://litestream/litestream/@external/fmt/Sprintf","kind":"external","name":"Sprintf","module":"fmt","signature":"Sprintf","parameters":[{"name":"format","type":"string"},{"name":"a","type":"[]any","is_variadic":true}],"return_type":"string"},"can://litestream/litestream/@external/fmt/Sscanf":{"id":"can://litestream/litestream/@external/fmt/Sscanf","kind":"external","name":"Sscanf","module":"fmt","signature":"Sscanf","parameters":[{"name":"str","type":"string"},{"name":"format","type":"string"},{"name":"a","type":"[]any","is_variadic":true}],"return_type":"(int, error)"},"can://litestream/litestream/@external/hash/Hash.Sum":{"id":"can://litestream/litestream/@external/hash/Hash.Sum","kind":"external","name":"Sum","module":"hash","signature":"Hash.Sum","parameters":[{"name":"b","type":"[]byte"}],"return_type":"[]byte","receiver":{"name":"_recv","type":"hash.Hash"}},"can://litestream/litestream/@external/hash/Hash64.Sum64":{"id":"can://litestream/litestream/@external/hash/Hash64.Sum64","kind":"external","name":"Sum64","module":"hash","signature":"Hash64.Sum64","parameters":[],"return_type":"uint64","receiver":{"name":"_recv","type":"hash.Hash64"}},"can://litestream/litestream/@external/hash/crc64/MakeTable":{"id":"can://litestream/litestream/@external/hash/crc64/MakeTable","kind":"external","name":"MakeTable","module":"hash/crc64","signature":"MakeTable","parameters":[{"name":"poly","type":"uint64"}],"return_type":"*hash/crc64.Table"},"can://litestream/litestream/@external/hash/crc64/New":{"id":"can://litestream/litestream/@external/hash/crc64/New","kind":"external","name":"New","module":"hash/crc64","signature":"New","parameters":[{"name":"tab","type":"*hash/crc64.Table"}],"return_type":"hash.Hash64"},"can://litestream/litestream/@external/io/Closer.Close":{"id":"can://litestream/litestream/@external/io/Closer.Close","kind":"external","name":"Close","module":"io","signature":"Closer.Close","parameters":[],"return_type":"error","receiver":{"name":"_recv","type":"io.Closer"}},"can://litestream/litestream/@external/io/Copy":{"id":"can://litestream/litestream/@external/io/Copy","kind":"external","name":"Copy","module":"io","signature":"Copy","parameters":[{"name":"dst","type":"io.Writer"},{"name":"src","type":"io.Reader"}],"return_type":"(int64, error)"},"can://litestream/litestream/@external/io/CopyN":{"id":"can://litestream/litestream/@external/io/CopyN","kind":"external","name":"CopyN","module":"io","signature":"CopyN","parameters":[{"name":"dst","type":"io.Writer"},{"name":"src","type":"io.Reader"},{"name":"n","type":"int64"}],"return_type":"(int64, error)"},"can://litestream/litestream/@external/io/MultiReader":{"id":"can://litestream/litestream/@external/io/MultiReader","kind":"external","name":"MultiReader","module":"io","signature":"MultiReader","parameters":[{"name":"readers","type":"[]io.Reader","is_variadic":true}],"return_type":"io.Reader"},"can://litestream/litestream/@external/io/NopCloser":{"id":"can://litestream/litestream/@external/io/NopCloser","kind":"external","name":"NopCloser","module":"io","signature":"NopCloser","parameters":[{"name":"r","type":"io.Reader"}],"return_type":"io.ReadCloser"},"can://litestream/litestream/@external/io/Pipe":{"id":"can://litestream/litestream/@external/io/Pipe","kind":"external","name":"Pipe","module":"io","signature":"Pipe","parameters":[],"return_type":"(*io.PipeReader, *io.PipeWriter)"},"can://litestream/litestream/@external/io/PipeReader.Close":{"id":"can://litestream/litestream/@external/io/PipeReader.Close","kind":"external","name":"Close","module":"io","signature":"PipeReader.Close","parameters":[],"return_type":"error","receiver":{"name":"r","type":"*io.PipeReader"}},"can://litestream/litestream/@external/io/PipeReader.CloseWithError":{"id":"can://litestream/litestream/@external/io/PipeReader.CloseWithError","kind":"external","name":"CloseWithError","module":"io","signature":"PipeReader.CloseWithError","parameters":[{"name":"err","type":"error"}],"return_type":"error","receiver":{"name":"r","type":"*io.PipeReader"}},"can://litestream/litestream/@external/io/PipeWriter.Close":{"id":"can://litestream/litestream/@external/io/PipeWriter.Close","kind":"external","name":"Close","module":"io","signature":"PipeWriter.Close","parameters":[],"return_type":"error","receiver":{"name":"w","type":"*io.PipeWriter"}},"can://litestream/litestream/@external/io/PipeWriter.CloseWithError":{"id":"can://litestream/litestream/@external/io/PipeWriter.CloseWithError","kind":"external","name":"CloseWithError","module":"io","signature":"PipeWriter.CloseWithError","parameters":[{"name":"err","type":"error"}],"return_type":"error","receiver":{"name":"w","type":"*io.PipeWriter"}},"can://litestream/litestream/@external/io/ReadAll":{"id":"can://litestream/litestream/@external/io/ReadAll","kind":"external","name":"ReadAll","module":"io","signature":"ReadAll","parameters":[{"name":"r","type":"io.Reader"}],"return_type":"([]byte, error)"},"can://litestream/litestream/@external/io/ReadFull":{"id":"can://litestream/litestream/@external/io/ReadFull","kind":"external","name":"ReadFull","module":"io","signature":"ReadFull","parameters":[{"name":"r","type":"io.Reader"},{"name":"buf","type":"[]byte"}],"return_type":"(int, error)"},"can://litestream/litestream/@external/io/Reader.Read":{"id":"can://litestream/litestream/@external/io/Reader.Read","kind":"external","name":"Read","module":"io","signature":"Reader.Read","parameters":[{"name":"p","type":"[]byte"}],"return_type":"(int, error)","receiver":{"name":"_recv","type":"io.Reader"}},"can://litestream/litestream/@external/io/ReaderAt.ReadAt":{"id":"can://litestream/litestream/@external/io/ReaderAt.ReadAt","kind":"external","name":"ReadAt","module":"io","signature":"ReaderAt.ReadAt","parameters":[{"name":"p","type":"[]byte"},{"name":"off","type":"int64"}],"return_type":"(int, error)","receiver":{"name":"_recv","type":"io.ReaderAt"}},"can://litestream/litestream/@external/io/Seeker.Seek":{"id":"can://litestream/litestream/@external/io/Seeker.Seek","kind":"external","name":"Seek","module":"io","signature":"Seeker.Seek","parameters":[{"name":"offset","type":"int64"},{"name":"whence","type":"int"}],"return_type":"(int64, error)","receiver":{"name":"_recv","type":"io.Seeker"}},"can://litestream/litestream/@external/io/TeeReader":{"id":"can://litestream/litestream/@external/io/TeeReader","kind":"external","name":"TeeReader","module":"io","signature":"TeeReader","parameters":[{"name":"r","type":"io.Reader"},{"name":"w","type":"io.Writer"}],"return_type":"io.Reader"},"can://litestream/litestream/@external/io/fs/DirEntry.Info":{"id":"can://litestream/litestream/@external/io/fs/DirEntry.Info","kind":"external","name":"Info","module":"io/fs","signature":"DirEntry.Info","parameters":[],"return_type":"(io/fs.FileInfo, error)","receiver":{"name":"_recv","type":"io/fs.DirEntry"}},"can://litestream/litestream/@external/io/fs/DirEntry.IsDir":{"id":"can://litestream/litestream/@external/io/fs/DirEntry.IsDir","kind":"external","name":"IsDir","module":"io/fs","signature":"DirEntry.IsDir","parameters":[],"return_type":"bool","receiver":{"name":"_recv","type":"io/fs.DirEntry"}},"can://litestream/litestream/@external/io/fs/DirEntry.Name":{"id":"can://litestream/litestream/@external/io/fs/DirEntry.Name","kind":"external","name":"Name","module":"io/fs","signature":"DirEntry.Name","parameters":[],"return_type":"string","receiver":{"name":"_recv","type":"io/fs.DirEntry"}},"can://litestream/litestream/@external/io/fs/FileInfo.IsDir":{"id":"can://litestream/litestream/@external/io/fs/FileInfo.IsDir","kind":"external","name":"IsDir","module":"io/fs","signature":"FileInfo.IsDir","parameters":[],"return_type":"bool","receiver":{"name":"_recv","type":"io/fs.FileInfo"}},"can://litestream/litestream/@external/io/fs/FileInfo.ModTime":{"id":"can://litestream/litestream/@external/io/fs/FileInfo.ModTime","kind":"external","name":"ModTime","module":"io/fs","signature":"FileInfo.ModTime","parameters":[],"return_type":"time.Time","receiver":{"name":"_recv","type":"io/fs.FileInfo"}},"can://litestream/litestream/@external/io/fs/FileInfo.Mode":{"id":"can://litestream/litestream/@external/io/fs/FileInfo.Mode","kind":"external","name":"Mode","module":"io/fs","signature":"FileInfo.Mode","parameters":[],"return_type":"io/fs.FileMode","receiver":{"name":"_recv","type":"io/fs.FileInfo"}},"can://litestream/litestream/@external/io/fs/FileInfo.Name":{"id":"can://litestream/litestream/@external/io/fs/FileInfo.Name","kind":"external","name":"Name","module":"io/fs","signature":"FileInfo.Name","parameters":[],"return_type":"string","receiver":{"name":"_recv","type":"io/fs.FileInfo"}},"can://litestream/litestream/@external/io/fs/FileInfo.Size":{"id":"can://litestream/litestream/@external/io/fs/FileInfo.Size","kind":"external","name":"Size","module":"io/fs","signature":"FileInfo.Size","parameters":[],"return_type":"int64","receiver":{"name":"_recv","type":"io/fs.FileInfo"}},"can://litestream/litestream/@external/io/fs/FileInfo.Sys":{"id":"can://litestream/litestream/@external/io/fs/FileInfo.Sys","kind":"external","name":"Sys","module":"io/fs","signature":"FileInfo.Sys","parameters":[],"return_type":"any","receiver":{"name":"_recv","type":"io/fs.FileInfo"}},"can://litestream/litestream/@external/log/slog/Debug":{"id":"can://litestream/litestream/@external/log/slog/Debug","kind":"external","name":"Debug","module":"log/slog","signature":"Debug","parameters":[{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}]},"can://litestream/litestream/@external/log/slog/Default":{"id":"can://litestream/litestream/@external/log/slog/Default","kind":"external","name":"Default","module":"log/slog","signature":"Default","parameters":[],"return_type":"*log/slog.Logger"},"can://litestream/litestream/@external/log/slog/Error":{"id":"can://litestream/litestream/@external/log/slog/Error","kind":"external","name":"Error","module":"log/slog","signature":"Error","parameters":[{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}]},"can://litestream/litestream/@external/log/slog/Group":{"id":"can://litestream/litestream/@external/log/slog/Group","kind":"external","name":"Group","module":"log/slog","signature":"Group","parameters":[{"name":"key","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"return_type":"log/slog.Attr"},"can://litestream/litestream/@external/log/slog/Info":{"id":"can://litestream/litestream/@external/log/slog/Info","kind":"external","name":"Info","module":"log/slog","signature":"Info","parameters":[{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}]},"can://litestream/litestream/@external/log/slog/Logger.Debug":{"id":"can://litestream/litestream/@external/log/slog/Logger.Debug","kind":"external","name":"Debug","module":"log/slog","signature":"Logger.Debug","parameters":[{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"l","type":"*log/slog.Logger"}},"can://litestream/litestream/@external/log/slog/Logger.Error":{"id":"can://litestream/litestream/@external/log/slog/Logger.Error","kind":"external","name":"Error","module":"log/slog","signature":"Logger.Error","parameters":[{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"l","type":"*log/slog.Logger"}},"can://litestream/litestream/@external/log/slog/Logger.Info":{"id":"can://litestream/litestream/@external/log/slog/Logger.Info","kind":"external","name":"Info","module":"log/slog","signature":"Logger.Info","parameters":[{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"l","type":"*log/slog.Logger"}},"can://litestream/litestream/@external/log/slog/Logger.InfoContext":{"id":"can://litestream/litestream/@external/log/slog/Logger.InfoContext","kind":"external","name":"InfoContext","module":"log/slog","signature":"Logger.InfoContext","parameters":[{"name":"ctx","type":"context.Context"},{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"l","type":"*log/slog.Logger"}},"can://litestream/litestream/@external/log/slog/Logger.Log":{"id":"can://litestream/litestream/@external/log/slog/Logger.Log","kind":"external","name":"Log","module":"log/slog","signature":"Logger.Log","parameters":[{"name":"ctx","type":"context.Context"},{"name":"level","type":"log/slog.Level"},{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"l","type":"*log/slog.Logger"}},"can://litestream/litestream/@external/log/slog/Logger.Warn":{"id":"can://litestream/litestream/@external/log/slog/Logger.Warn","kind":"external","name":"Warn","module":"log/slog","signature":"Logger.Warn","parameters":[{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"l","type":"*log/slog.Logger"}},"can://litestream/litestream/@external/log/slog/Logger.With":{"id":"can://litestream/litestream/@external/log/slog/Logger.With","kind":"external","name":"With","module":"log/slog","signature":"Logger.With","parameters":[{"name":"args","type":"[]any","is_variadic":true}],"return_type":"*log/slog.Logger","receiver":{"name":"l","type":"*log/slog.Logger"}},"can://litestream/litestream/@external/log/slog/Logger.WithGroup":{"id":"can://litestream/litestream/@external/log/slog/Logger.WithGroup","kind":"external","name":"WithGroup","module":"log/slog","signature":"Logger.WithGroup","parameters":[{"name":"name","type":"string"}],"return_type":"*log/slog.Logger","receiver":{"name":"l","type":"*log/slog.Logger"}},"can://litestream/litestream/@external/log/slog/New":{"id":"can://litestream/litestream/@external/log/slog/New","kind":"external","name":"New","module":"log/slog","signature":"New","parameters":[{"name":"h","type":"log/slog.Handler"}],"return_type":"*log/slog.Logger"},"can://litestream/litestream/@external/log/slog/NewJSONHandler":{"id":"can://litestream/litestream/@external/log/slog/NewJSONHandler","kind":"external","name":"NewJSONHandler","module":"log/slog","signature":"NewJSONHandler","parameters":[{"name":"w","type":"io.Writer"},{"name":"opts","type":"*log/slog.HandlerOptions"}],"return_type":"*log/slog.JSONHandler"},"can://litestream/litestream/@external/log/slog/NewTextHandler":{"id":"can://litestream/litestream/@external/log/slog/NewTextHandler","kind":"external","name":"NewTextHandler","module":"log/slog","signature":"NewTextHandler","parameters":[{"name":"w","type":"io.Writer"},{"name":"opts","type":"*log/slog.HandlerOptions"}],"return_type":"*log/slog.TextHandler"},"can://litestream/litestream/@external/log/slog/SetDefault":{"id":"can://litestream/litestream/@external/log/slog/SetDefault","kind":"external","name":"SetDefault","module":"log/slog","signature":"SetDefault","parameters":[{"name":"l","type":"*log/slog.Logger"}]},"can://litestream/litestream/@external/log/slog/String":{"id":"can://litestream/litestream/@external/log/slog/String","kind":"external","name":"String","module":"log/slog","signature":"String","parameters":[{"name":"key","type":"string"},{"name":"value","type":"string"}],"return_type":"log/slog.Attr"},"can://litestream/litestream/@external/log/slog/StringValue":{"id":"can://litestream/litestream/@external/log/slog/StringValue","kind":"external","name":"StringValue","module":"log/slog","signature":"StringValue","parameters":[{"name":"value","type":"string"}],"return_type":"log/slog.Value"},"can://litestream/litestream/@external/log/slog/Value.Any":{"id":"can://litestream/litestream/@external/log/slog/Value.Any","kind":"external","name":"Any","module":"log/slog","signature":"Value.Any","parameters":[],"return_type":"any","receiver":{"name":"v","type":"log/slog.Value"}},"can://litestream/litestream/@external/log/slog/Warn":{"id":"can://litestream/litestream/@external/log/slog/Warn","kind":"external","name":"Warn","module":"log/slog","signature":"Warn","parameters":[{"name":"msg","type":"string"},{"name":"args","type":"[]any","is_variadic":true}]},"can://litestream/litestream/@external/log/slog/With":{"id":"can://litestream/litestream/@external/log/slog/With","kind":"external","name":"With","module":"log/slog","signature":"With","parameters":[{"name":"args","type":"[]any","is_variadic":true}],"return_type":"*log/slog.Logger"},"can://litestream/litestream/@external/math/rand/Float64":{"id":"can://litestream/litestream/@external/math/rand/Float64","kind":"external","name":"Float64","module":"math/rand","signature":"Float64","parameters":[],"return_type":"float64"},"can://litestream/litestream/@external/math/rand/Int63":{"id":"can://litestream/litestream/@external/math/rand/Int63","kind":"external","name":"Int63","module":"math/rand","signature":"Int63","parameters":[],"return_type":"int64"},"can://litestream/litestream/@external/math/rand/v2/Uint64":{"id":"can://litestream/litestream/@external/math/rand/v2/Uint64","kind":"external","name":"Uint64","module":"math/rand/v2","signature":"Uint64","parameters":[],"return_type":"uint64"},"can://litestream/litestream/@external/net/Addr.String":{"id":"can://litestream/litestream/@external/net/Addr.String","kind":"external","name":"String","module":"net","signature":"Addr.String","parameters":[],"return_type":"string","receiver":{"name":"_recv","type":"net.Addr"}},"can://litestream/litestream/@external/net/DialTimeout":{"id":"can://litestream/litestream/@external/net/DialTimeout","kind":"external","name":"DialTimeout","module":"net","signature":"DialTimeout","parameters":[{"name":"network","type":"string"},{"name":"address","type":"string"},{"name":"timeout","type":"time.Duration"}],"return_type":"(net.Conn, error)"},"can://litestream/litestream/@external/net/IP.IsLoopback":{"id":"can://litestream/litestream/@external/net/IP.IsLoopback","kind":"external","name":"IsLoopback","module":"net","signature":"IP.IsLoopback","parameters":[],"return_type":"bool","receiver":{"name":"ip","type":"net.IP"}},"can://litestream/litestream/@external/net/IP.IsPrivate":{"id":"can://litestream/litestream/@external/net/IP.IsPrivate","kind":"external","name":"IsPrivate","module":"net","signature":"IP.IsPrivate","parameters":[],"return_type":"bool","receiver":{"name":"ip","type":"net.IP"}},"can://litestream/litestream/@external/net/JoinHostPort":{"id":"can://litestream/litestream/@external/net/JoinHostPort","kind":"external","name":"JoinHostPort","module":"net","signature":"JoinHostPort","parameters":[{"name":"host","type":"string"},{"name":"port","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/net/Listen":{"id":"can://litestream/litestream/@external/net/Listen","kind":"external","name":"Listen","module":"net","signature":"Listen","parameters":[{"name":"network","type":"string"},{"name":"address","type":"string"}],"return_type":"(net.Listener, error)"},"can://litestream/litestream/@external/net/Listener.Accept":{"id":"can://litestream/litestream/@external/net/Listener.Accept","kind":"external","name":"Accept","module":"net","signature":"Listener.Accept","parameters":[],"return_type":"(net.Conn, error)","receiver":{"name":"_recv","type":"net.Listener"}},"can://litestream/litestream/@external/net/Listener.Addr":{"id":"can://litestream/litestream/@external/net/Listener.Addr","kind":"external","name":"Addr","module":"net","signature":"Listener.Addr","parameters":[],"return_type":"net.Addr","receiver":{"name":"_recv","type":"net.Listener"}},"can://litestream/litestream/@external/net/Listener.Close":{"id":"can://litestream/litestream/@external/net/Listener.Close","kind":"external","name":"Close","module":"net","signature":"Listener.Close","parameters":[],"return_type":"error","receiver":{"name":"_recv","type":"net.Listener"}},"can://litestream/litestream/@external/net/ParseIP":{"id":"can://litestream/litestream/@external/net/ParseIP","kind":"external","name":"ParseIP","module":"net","signature":"ParseIP","parameters":[{"name":"s","type":"string"}],"return_type":"net.IP"},"can://litestream/litestream/@external/net/SplitHostPort":{"id":"can://litestream/litestream/@external/net/SplitHostPort","kind":"external","name":"SplitHostPort","module":"net","signature":"SplitHostPort","parameters":[{"name":"hostport","type":"string"}],"return_type":"(string, string, error)"},"can://litestream/litestream/@external/net/http/Client.Do":{"id":"can://litestream/litestream/@external/net/http/Client.Do","kind":"external","name":"Do","module":"net/http","signature":"Client.Do","parameters":[{"name":"req","type":"*net/http.Request"}],"return_type":"(*net/http.Response, error)","receiver":{"name":"c","type":"*net/http.Client"}},"can://litestream/litestream/@external/net/http/Client.Get":{"id":"can://litestream/litestream/@external/net/http/Client.Get","kind":"external","name":"Get","module":"net/http","signature":"Client.Get","parameters":[{"name":"url","type":"string"}],"return_type":"(*net/http.Response, error)","receiver":{"name":"c","type":"*net/http.Client"}},"can://litestream/litestream/@external/net/http/Client.Post":{"id":"can://litestream/litestream/@external/net/http/Client.Post","kind":"external","name":"Post","module":"net/http","signature":"Client.Post","parameters":[{"name":"url","type":"string"},{"name":"contentType","type":"string"},{"name":"body","type":"io.Reader"}],"return_type":"(*net/http.Response, error)","receiver":{"name":"c","type":"*net/http.Client"}},"can://litestream/litestream/@external/net/http/Handle":{"id":"can://litestream/litestream/@external/net/http/Handle","kind":"external","name":"Handle","module":"net/http","signature":"Handle","parameters":[{"name":"pattern","type":"string"},{"name":"handler","type":"net/http.Handler"}]},"can://litestream/litestream/@external/net/http/Header.Set":{"id":"can://litestream/litestream/@external/net/http/Header.Set","kind":"external","name":"Set","module":"net/http","signature":"Header.Set","parameters":[{"name":"key","type":"string"},{"name":"value","type":"string"}],"receiver":{"name":"h","type":"net/http.Header"}},"can://litestream/litestream/@external/net/http/ListenAndServe":{"id":"can://litestream/litestream/@external/net/http/ListenAndServe","kind":"external","name":"ListenAndServe","module":"net/http","signature":"ListenAndServe","parameters":[{"name":"addr","type":"string"},{"name":"handler","type":"net/http.Handler"}],"return_type":"error"},"can://litestream/litestream/@external/net/http/NewRequestWithContext":{"id":"can://litestream/litestream/@external/net/http/NewRequestWithContext","kind":"external","name":"NewRequestWithContext","module":"net/http","signature":"NewRequestWithContext","parameters":[{"name":"ctx","type":"context.Context"},{"name":"method","type":"string"},{"name":"url","type":"string"},{"name":"body","type":"io.Reader"}],"return_type":"(*net/http.Request, error)"},"can://litestream/litestream/@external/net/http/NewServeMux":{"id":"can://litestream/litestream/@external/net/http/NewServeMux","kind":"external","name":"NewServeMux","module":"net/http","signature":"NewServeMux","parameters":[],"return_type":"*net/http.ServeMux"},"can://litestream/litestream/@external/net/http/ResponseWriter.Header":{"id":"can://litestream/litestream/@external/net/http/ResponseWriter.Header","kind":"external","name":"Header","module":"net/http","signature":"ResponseWriter.Header","parameters":[],"return_type":"net/http.Header","receiver":{"name":"_recv","type":"net/http.ResponseWriter"}},"can://litestream/litestream/@external/net/http/ResponseWriter.WriteHeader":{"id":"can://litestream/litestream/@external/net/http/ResponseWriter.WriteHeader","kind":"external","name":"WriteHeader","module":"net/http","signature":"ResponseWriter.WriteHeader","parameters":[{"name":"statusCode","type":"int"}],"receiver":{"name":"_recv","type":"net/http.ResponseWriter"}},"can://litestream/litestream/@external/net/http/ServeMux.Handle":{"id":"can://litestream/litestream/@external/net/http/ServeMux.Handle","kind":"external","name":"Handle","module":"net/http","signature":"ServeMux.Handle","parameters":[{"name":"pattern","type":"string"},{"name":"handler","type":"net/http.Handler"}],"receiver":{"name":"mux","type":"*net/http.ServeMux"}},"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc":{"id":"can://litestream/litestream/@external/net/http/ServeMux.HandleFunc","kind":"external","name":"HandleFunc","module":"net/http","signature":"ServeMux.HandleFunc","parameters":[{"name":"pattern","type":"string"},{"name":"handler","type":"func(net/http.ResponseWriter, *net/http.Request)"}],"receiver":{"name":"mux","type":"*net/http.ServeMux"}},"can://litestream/litestream/@external/net/http/ServeMux.ServeHTTP":{"id":"can://litestream/litestream/@external/net/http/ServeMux.ServeHTTP","kind":"external","name":"ServeHTTP","module":"net/http","signature":"ServeMux.ServeHTTP","parameters":[{"name":"w","type":"net/http.ResponseWriter"},{"name":"r","type":"*net/http.Request"}],"receiver":{"name":"mux","type":"*net/http.ServeMux"}},"can://litestream/litestream/@external/net/http/Server.ListenAndServe":{"id":"can://litestream/litestream/@external/net/http/Server.ListenAndServe","kind":"external","name":"ListenAndServe","module":"net/http","signature":"Server.ListenAndServe","parameters":[],"return_type":"error","receiver":{"name":"s","type":"*net/http.Server"}},"can://litestream/litestream/@external/net/http/Server.Serve":{"id":"can://litestream/litestream/@external/net/http/Server.Serve","kind":"external","name":"Serve","module":"net/http","signature":"Server.Serve","parameters":[{"name":"l","type":"net.Listener"}],"return_type":"error","receiver":{"name":"s","type":"*net/http.Server"}},"can://litestream/litestream/@external/net/http/Server.Shutdown":{"id":"can://litestream/litestream/@external/net/http/Server.Shutdown","kind":"external","name":"Shutdown","module":"net/http","signature":"Server.Shutdown","parameters":[{"name":"ctx","type":"context.Context"}],"return_type":"error","receiver":{"name":"s","type":"*net/http.Server"}},"can://litestream/litestream/@external/net/url/Parse":{"id":"can://litestream/litestream/@external/net/url/Parse","kind":"external","name":"Parse","module":"net/url","signature":"Parse","parameters":[{"name":"rawURL","type":"string"}],"return_type":"(*net/url.URL, error)"},"can://litestream/litestream/@external/net/url/ParseQuery":{"id":"can://litestream/litestream/@external/net/url/ParseQuery","kind":"external","name":"ParseQuery","module":"net/url","signature":"ParseQuery","parameters":[{"name":"query","type":"string"}],"return_type":"(net/url.Values, error)"},"can://litestream/litestream/@external/net/url/URL.Hostname":{"id":"can://litestream/litestream/@external/net/url/URL.Hostname","kind":"external","name":"Hostname","module":"net/url","signature":"URL.Hostname","parameters":[],"return_type":"string","receiver":{"name":"u","type":"*net/url.URL"}},"can://litestream/litestream/@external/net/url/URL.Port":{"id":"can://litestream/litestream/@external/net/url/URL.Port","kind":"external","name":"Port","module":"net/url","signature":"URL.Port","parameters":[],"return_type":"string","receiver":{"name":"u","type":"*net/url.URL"}},"can://litestream/litestream/@external/net/url/URL.Query":{"id":"can://litestream/litestream/@external/net/url/URL.Query","kind":"external","name":"Query","module":"net/url","signature":"URL.Query","parameters":[],"return_type":"net/url.Values","receiver":{"name":"u","type":"*net/url.URL"}},"can://litestream/litestream/@external/net/url/URL.String":{"id":"can://litestream/litestream/@external/net/url/URL.String","kind":"external","name":"String","module":"net/url","signature":"URL.String","parameters":[],"return_type":"string","receiver":{"name":"u","type":"*net/url.URL"}},"can://litestream/litestream/@external/net/url/Userinfo.Password":{"id":"can://litestream/litestream/@external/net/url/Userinfo.Password","kind":"external","name":"Password","module":"net/url","signature":"Userinfo.Password","parameters":[],"return_type":"(string, bool)","receiver":{"name":"u","type":"*net/url.Userinfo"}},"can://litestream/litestream/@external/net/url/Userinfo.Username":{"id":"can://litestream/litestream/@external/net/url/Userinfo.Username","kind":"external","name":"Username","module":"net/url","signature":"Userinfo.Username","parameters":[],"return_type":"string","receiver":{"name":"u","type":"*net/url.Userinfo"}},"can://litestream/litestream/@external/net/url/Values.Get":{"id":"can://litestream/litestream/@external/net/url/Values.Get","kind":"external","name":"Get","module":"net/url","signature":"Values.Get","parameters":[{"name":"key","type":"string"}],"return_type":"string","receiver":{"name":"v","type":"net/url.Values"}},"can://litestream/litestream/@external/os/Chmod":{"id":"can://litestream/litestream/@external/os/Chmod","kind":"external","name":"Chmod","module":"os","signature":"Chmod","parameters":[{"name":"name","type":"string"},{"name":"mode","type":"os.FileMode"}],"return_type":"error"},"can://litestream/litestream/@external/os/Chown":{"id":"can://litestream/litestream/@external/os/Chown","kind":"external","name":"Chown","module":"os","signature":"Chown","parameters":[{"name":"name","type":"string"},{"name":"uid","type":"int"},{"name":"gid","type":"int"}],"return_type":"error"},"can://litestream/litestream/@external/os/Chtimes":{"id":"can://litestream/litestream/@external/os/Chtimes","kind":"external","name":"Chtimes","module":"os","signature":"Chtimes","parameters":[{"name":"name","type":"string"},{"name":"atime","type":"time.Time"},{"name":"mtime","type":"time.Time"}],"return_type":"error"},"can://litestream/litestream/@external/os/Create":{"id":"can://litestream/litestream/@external/os/Create","kind":"external","name":"Create","module":"os","signature":"Create","parameters":[{"name":"name","type":"string"}],"return_type":"(*os.File, error)"},"can://litestream/litestream/@external/os/CreateTemp":{"id":"can://litestream/litestream/@external/os/CreateTemp","kind":"external","name":"CreateTemp","module":"os","signature":"CreateTemp","parameters":[{"name":"dir","type":"string"},{"name":"pattern","type":"string"}],"return_type":"(*os.File, error)"},"can://litestream/litestream/@external/os/Environ":{"id":"can://litestream/litestream/@external/os/Environ","kind":"external","name":"Environ","module":"os","signature":"Environ","parameters":[],"return_type":"[]string"},"can://litestream/litestream/@external/os/Exit":{"id":"can://litestream/litestream/@external/os/Exit","kind":"external","name":"Exit","module":"os","signature":"Exit","parameters":[{"name":"code","type":"int"}]},"can://litestream/litestream/@external/os/Expand":{"id":"can://litestream/litestream/@external/os/Expand","kind":"external","name":"Expand","module":"os","signature":"Expand","parameters":[{"name":"s","type":"string"},{"name":"mapping","type":"func(string) string"}],"return_type":"string"},"can://litestream/litestream/@external/os/File.Chown":{"id":"can://litestream/litestream/@external/os/File.Chown","kind":"external","name":"Chown","module":"os","signature":"File.Chown","parameters":[{"name":"uid","type":"int"},{"name":"gid","type":"int"}],"return_type":"error","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Close":{"id":"can://litestream/litestream/@external/os/File.Close","kind":"external","name":"Close","module":"os","signature":"File.Close","parameters":[],"return_type":"error","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Fd":{"id":"can://litestream/litestream/@external/os/File.Fd","kind":"external","name":"Fd","module":"os","signature":"File.Fd","parameters":[],"return_type":"uintptr","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Name":{"id":"can://litestream/litestream/@external/os/File.Name","kind":"external","name":"Name","module":"os","signature":"File.Name","parameters":[],"return_type":"string","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Read":{"id":"can://litestream/litestream/@external/os/File.Read","kind":"external","name":"Read","module":"os","signature":"File.Read","parameters":[{"name":"b","type":"[]byte"}],"return_type":"(int, error)","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.ReadAt":{"id":"can://litestream/litestream/@external/os/File.ReadAt","kind":"external","name":"ReadAt","module":"os","signature":"File.ReadAt","parameters":[{"name":"b","type":"[]byte"},{"name":"off","type":"int64"}],"return_type":"(int, error)","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Readdir":{"id":"can://litestream/litestream/@external/os/File.Readdir","kind":"external","name":"Readdir","module":"os","signature":"File.Readdir","parameters":[{"name":"n","type":"int"}],"return_type":"([]os.FileInfo, error)","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Seek":{"id":"can://litestream/litestream/@external/os/File.Seek","kind":"external","name":"Seek","module":"os","signature":"File.Seek","parameters":[{"name":"offset","type":"int64"},{"name":"whence","type":"int"}],"return_type":"(int64, error)","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Stat":{"id":"can://litestream/litestream/@external/os/File.Stat","kind":"external","name":"Stat","module":"os","signature":"File.Stat","parameters":[],"return_type":"(os.FileInfo, error)","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Sync":{"id":"can://litestream/litestream/@external/os/File.Sync","kind":"external","name":"Sync","module":"os","signature":"File.Sync","parameters":[],"return_type":"error","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.Truncate":{"id":"can://litestream/litestream/@external/os/File.Truncate","kind":"external","name":"Truncate","module":"os","signature":"File.Truncate","parameters":[{"name":"size","type":"int64"}],"return_type":"error","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/File.WriteAt":{"id":"can://litestream/litestream/@external/os/File.WriteAt","kind":"external","name":"WriteAt","module":"os","signature":"File.WriteAt","parameters":[{"name":"b","type":"[]byte"},{"name":"off","type":"int64"}],"return_type":"(int, error)","receiver":{"name":"f","type":"*os.File"}},"can://litestream/litestream/@external/os/Getenv":{"id":"can://litestream/litestream/@external/os/Getenv","kind":"external","name":"Getenv","module":"os","signature":"Getenv","parameters":[{"name":"key","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/os/Getpid":{"id":"can://litestream/litestream/@external/os/Getpid","kind":"external","name":"Getpid","module":"os","signature":"Getpid","parameters":[],"return_type":"int"},"can://litestream/litestream/@external/os/Hostname":{"id":"can://litestream/litestream/@external/os/Hostname","kind":"external","name":"Hostname","module":"os","signature":"Hostname","parameters":[],"return_type":"(string, error)"},"can://litestream/litestream/@external/os/IsNotExist":{"id":"can://litestream/litestream/@external/os/IsNotExist","kind":"external","name":"IsNotExist","module":"os","signature":"IsNotExist","parameters":[{"name":"err","type":"error"}],"return_type":"bool"},"can://litestream/litestream/@external/os/IsPathSeparator":{"id":"can://litestream/litestream/@external/os/IsPathSeparator","kind":"external","name":"IsPathSeparator","module":"os","signature":"IsPathSeparator","parameters":[{"name":"c","type":"uint8"}],"return_type":"bool"},"can://litestream/litestream/@external/os/LookupEnv":{"id":"can://litestream/litestream/@external/os/LookupEnv","kind":"external","name":"LookupEnv","module":"os","signature":"LookupEnv","parameters":[{"name":"key","type":"string"}],"return_type":"(string, bool)"},"can://litestream/litestream/@external/os/Lstat":{"id":"can://litestream/litestream/@external/os/Lstat","kind":"external","name":"Lstat","module":"os","signature":"Lstat","parameters":[{"name":"name","type":"string"}],"return_type":"(os.FileInfo, error)"},"can://litestream/litestream/@external/os/Mkdir":{"id":"can://litestream/litestream/@external/os/Mkdir","kind":"external","name":"Mkdir","module":"os","signature":"Mkdir","parameters":[{"name":"name","type":"string"},{"name":"perm","type":"os.FileMode"}],"return_type":"error"},"can://litestream/litestream/@external/os/MkdirAll":{"id":"can://litestream/litestream/@external/os/MkdirAll","kind":"external","name":"MkdirAll","module":"os","signature":"MkdirAll","parameters":[{"name":"path","type":"string"},{"name":"perm","type":"os.FileMode"}],"return_type":"error"},"can://litestream/litestream/@external/os/Open":{"id":"can://litestream/litestream/@external/os/Open","kind":"external","name":"Open","module":"os","signature":"Open","parameters":[{"name":"name","type":"string"}],"return_type":"(*os.File, error)"},"can://litestream/litestream/@external/os/OpenFile":{"id":"can://litestream/litestream/@external/os/OpenFile","kind":"external","name":"OpenFile","module":"os","signature":"OpenFile","parameters":[{"name":"name","type":"string"},{"name":"flag","type":"int"},{"name":"perm","type":"os.FileMode"}],"return_type":"(*os.File, error)"},"can://litestream/litestream/@external/os/Process.Signal":{"id":"can://litestream/litestream/@external/os/Process.Signal","kind":"external","name":"Signal","module":"os","signature":"Process.Signal","parameters":[{"name":"sig","type":"os.Signal"}],"return_type":"error","receiver":{"name":"p","type":"*os.Process"}},"can://litestream/litestream/@external/os/ReadDir":{"id":"can://litestream/litestream/@external/os/ReadDir","kind":"external","name":"ReadDir","module":"os","signature":"ReadDir","parameters":[{"name":"name","type":"string"}],"return_type":"([]os.DirEntry, error)"},"can://litestream/litestream/@external/os/ReadFile":{"id":"can://litestream/litestream/@external/os/ReadFile","kind":"external","name":"ReadFile","module":"os","signature":"ReadFile","parameters":[{"name":"name","type":"string"}],"return_type":"([]byte, error)"},"can://litestream/litestream/@external/os/Remove":{"id":"can://litestream/litestream/@external/os/Remove","kind":"external","name":"Remove","module":"os","signature":"Remove","parameters":[{"name":"name","type":"string"}],"return_type":"error"},"can://litestream/litestream/@external/os/RemoveAll":{"id":"can://litestream/litestream/@external/os/RemoveAll","kind":"external","name":"RemoveAll","module":"os","signature":"RemoveAll","parameters":[{"name":"path","type":"string"}],"return_type":"error"},"can://litestream/litestream/@external/os/Rename":{"id":"can://litestream/litestream/@external/os/Rename","kind":"external","name":"Rename","module":"os","signature":"Rename","parameters":[{"name":"oldpath","type":"string"},{"name":"newpath","type":"string"}],"return_type":"error"},"can://litestream/litestream/@external/os/Setenv":{"id":"can://litestream/litestream/@external/os/Setenv","kind":"external","name":"Setenv","module":"os","signature":"Setenv","parameters":[{"name":"key","type":"string"},{"name":"value","type":"string"}],"return_type":"error"},"can://litestream/litestream/@external/os/Stat":{"id":"can://litestream/litestream/@external/os/Stat","kind":"external","name":"Stat","module":"os","signature":"Stat","parameters":[{"name":"name","type":"string"}],"return_type":"(os.FileInfo, error)"},"can://litestream/litestream/@external/os/UserHomeDir":{"id":"can://litestream/litestream/@external/os/UserHomeDir","kind":"external","name":"UserHomeDir","module":"os","signature":"UserHomeDir","parameters":[],"return_type":"(string, error)"},"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput":{"id":"can://litestream/litestream/@external/os/exec/Cmd.CombinedOutput","kind":"external","name":"CombinedOutput","module":"os/exec","signature":"Cmd.CombinedOutput","parameters":[],"return_type":"([]byte, error)","receiver":{"name":"c","type":"*os/exec.Cmd"}},"can://litestream/litestream/@external/os/exec/Cmd.Output":{"id":"can://litestream/litestream/@external/os/exec/Cmd.Output","kind":"external","name":"Output","module":"os/exec","signature":"Cmd.Output","parameters":[],"return_type":"([]byte, error)","receiver":{"name":"c","type":"*os/exec.Cmd"}},"can://litestream/litestream/@external/os/exec/Cmd.Start":{"id":"can://litestream/litestream/@external/os/exec/Cmd.Start","kind":"external","name":"Start","module":"os/exec","signature":"Cmd.Start","parameters":[],"return_type":"error","receiver":{"name":"c","type":"*os/exec.Cmd"}},"can://litestream/litestream/@external/os/exec/Cmd.Wait":{"id":"can://litestream/litestream/@external/os/exec/Cmd.Wait","kind":"external","name":"Wait","module":"os/exec","signature":"Cmd.Wait","parameters":[],"return_type":"error","receiver":{"name":"c","type":"*os/exec.Cmd"}},"can://litestream/litestream/@external/os/exec/CommandContext":{"id":"can://litestream/litestream/@external/os/exec/CommandContext","kind":"external","name":"CommandContext","module":"os/exec","signature":"CommandContext","parameters":[{"name":"ctx","type":"context.Context"},{"name":"name","type":"string"},{"name":"arg","type":"[]string","is_variadic":true}],"return_type":"*os/exec.Cmd"},"can://litestream/litestream/@external/os/signal/Notify":{"id":"can://litestream/litestream/@external/os/signal/Notify","kind":"external","name":"Notify","module":"os/signal","signature":"Notify","parameters":[{"name":"c","type":"chan\u003c- os.Signal"},{"name":"sig","type":"[]os.Signal","is_variadic":true}]},"can://litestream/litestream/@external/os/user/Current":{"id":"can://litestream/litestream/@external/os/user/Current","kind":"external","name":"Current","module":"os/user","signature":"Current","parameters":[],"return_type":"(*os/user.User, error)"},"can://litestream/litestream/@external/path/Base":{"id":"can://litestream/litestream/@external/path/Base","kind":"external","name":"Base","module":"path","signature":"Base","parameters":[{"name":"path","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/path/Clean":{"id":"can://litestream/litestream/@external/path/Clean","kind":"external","name":"Clean","module":"path","signature":"Clean","parameters":[{"name":"path","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/path/Dir":{"id":"can://litestream/litestream/@external/path/Dir","kind":"external","name":"Dir","module":"path","signature":"Dir","parameters":[{"name":"path","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/path/Join":{"id":"can://litestream/litestream/@external/path/Join","kind":"external","name":"Join","module":"path","signature":"Join","parameters":[{"name":"elem","type":"[]string","is_variadic":true}],"return_type":"string"},"can://litestream/litestream/@external/path/filepath/Abs":{"id":"can://litestream/litestream/@external/path/filepath/Abs","kind":"external","name":"Abs","module":"path/filepath","signature":"Abs","parameters":[{"name":"path","type":"string"}],"return_type":"(string, error)"},"can://litestream/litestream/@external/path/filepath/Base":{"id":"can://litestream/litestream/@external/path/filepath/Base","kind":"external","name":"Base","module":"path/filepath","signature":"Base","parameters":[{"name":"path","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/path/filepath/Clean":{"id":"can://litestream/litestream/@external/path/filepath/Clean","kind":"external","name":"Clean","module":"path/filepath","signature":"Clean","parameters":[{"name":"path","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/path/filepath/Dir":{"id":"can://litestream/litestream/@external/path/filepath/Dir","kind":"external","name":"Dir","module":"path/filepath","signature":"Dir","parameters":[{"name":"path","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/path/filepath/FromSlash":{"id":"can://litestream/litestream/@external/path/filepath/FromSlash","kind":"external","name":"FromSlash","module":"path/filepath","signature":"FromSlash","parameters":[{"name":"path","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/path/filepath/IsAbs":{"id":"can://litestream/litestream/@external/path/filepath/IsAbs","kind":"external","name":"IsAbs","module":"path/filepath","signature":"IsAbs","parameters":[{"name":"path","type":"string"}],"return_type":"bool"},"can://litestream/litestream/@external/path/filepath/Join":{"id":"can://litestream/litestream/@external/path/filepath/Join","kind":"external","name":"Join","module":"path/filepath","signature":"Join","parameters":[{"name":"elem","type":"[]string","is_variadic":true}],"return_type":"string"},"can://litestream/litestream/@external/path/filepath/Match":{"id":"can://litestream/litestream/@external/path/filepath/Match","kind":"external","name":"Match","module":"path/filepath","signature":"Match","parameters":[{"name":"pattern","type":"string"},{"name":"name","type":"string"}],"return_type":"(bool, error)"},"can://litestream/litestream/@external/path/filepath/Rel":{"id":"can://litestream/litestream/@external/path/filepath/Rel","kind":"external","name":"Rel","module":"path/filepath","signature":"Rel","parameters":[{"name":"basePath","type":"string"},{"name":"targPath","type":"string"}],"return_type":"(string, error)"},"can://litestream/litestream/@external/path/filepath/Split":{"id":"can://litestream/litestream/@external/path/filepath/Split","kind":"external","name":"Split","module":"path/filepath","signature":"Split","parameters":[{"name":"path","type":"string"}],"return_type":"(string, string)"},"can://litestream/litestream/@external/path/filepath/ToSlash":{"id":"can://litestream/litestream/@external/path/filepath/ToSlash","kind":"external","name":"ToSlash","module":"path/filepath","signature":"ToSlash","parameters":[{"name":"path","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/path/filepath/Walk":{"id":"can://litestream/litestream/@external/path/filepath/Walk","kind":"external","name":"Walk","module":"path/filepath","signature":"Walk","parameters":[{"name":"root","type":"string"},{"name":"fn","type":"path/filepath.WalkFunc"}],"return_type":"error"},"can://litestream/litestream/@external/path/filepath/WalkDir":{"id":"can://litestream/litestream/@external/path/filepath/WalkDir","kind":"external","name":"WalkDir","module":"path/filepath","signature":"WalkDir","parameters":[{"name":"root","type":"string"},{"name":"fn","type":"io/fs.WalkDirFunc"}],"return_type":"error"},"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch":{"id":"can://litestream/litestream/@external/regexp/Regexp.FindStringSubmatch","kind":"external","name":"FindStringSubmatch","module":"regexp","signature":"Regexp.FindStringSubmatch","parameters":[{"name":"s","type":"string"}],"return_type":"[]string","receiver":{"name":"re","type":"*regexp.Regexp"}},"can://litestream/litestream/@external/regexp/Regexp.MatchString":{"id":"can://litestream/litestream/@external/regexp/Regexp.MatchString","kind":"external","name":"MatchString","module":"regexp","signature":"Regexp.MatchString","parameters":[{"name":"s","type":"string"}],"return_type":"bool","receiver":{"name":"re","type":"*regexp.Regexp"}},"can://litestream/litestream/@external/runtime/Version":{"id":"can://litestream/litestream/@external/runtime/Version","kind":"external","name":"Version","module":"runtime","signature":"Version","parameters":[],"return_type":"string"},"can://litestream/litestream/@external/runtime/debug/ReadBuildInfo":{"id":"can://litestream/litestream/@external/runtime/debug/ReadBuildInfo","kind":"external","name":"ReadBuildInfo","module":"runtime/debug","signature":"ReadBuildInfo","parameters":[],"return_type":"(*runtime/debug.BuildInfo, bool)"},"can://litestream/litestream/@external/slices/Clone":{"id":"can://litestream/litestream/@external/slices/Clone","kind":"external","name":"Clone","module":"slices","signature":"Clone","parameters":[{"name":"s","type":"S"}],"return_type":"S"},"can://litestream/litestream/@external/slices/Contains":{"id":"can://litestream/litestream/@external/slices/Contains","kind":"external","name":"Contains","module":"slices","signature":"Contains","parameters":[{"name":"s","type":"S"},{"name":"v","type":"E"}],"return_type":"bool"},"can://litestream/litestream/@external/slices/Delete":{"id":"can://litestream/litestream/@external/slices/Delete","kind":"external","name":"Delete","module":"slices","signature":"Delete","parameters":[{"name":"s","type":"S"},{"name":"i","type":"int"},{"name":"j","type":"int"}],"return_type":"S"},"can://litestream/litestream/@external/slices/Sort":{"id":"can://litestream/litestream/@external/slices/Sort","kind":"external","name":"Sort","module":"slices","signature":"Sort","parameters":[{"name":"x","type":"S"}]},"can://litestream/litestream/@external/slices/SortFunc":{"id":"can://litestream/litestream/@external/slices/SortFunc","kind":"external","name":"SortFunc","module":"slices","signature":"SortFunc","parameters":[{"name":"x","type":"S"},{"name":"cmp","type":"func(a E, b E) int"}]},"can://litestream/litestream/@external/sort/Slice":{"id":"can://litestream/litestream/@external/sort/Slice","kind":"external","name":"Slice","module":"sort","signature":"Slice","parameters":[{"name":"x","type":"any"},{"name":"less","type":"func(i int, j int) bool"}]},"can://litestream/litestream/@external/strconv/Atoi":{"id":"can://litestream/litestream/@external/strconv/Atoi","kind":"external","name":"Atoi","module":"strconv","signature":"Atoi","parameters":[{"name":"s","type":"string"}],"return_type":"(int, error)"},"can://litestream/litestream/@external/strconv/FormatBool":{"id":"can://litestream/litestream/@external/strconv/FormatBool","kind":"external","name":"FormatBool","module":"strconv","signature":"FormatBool","parameters":[{"name":"b","type":"bool"}],"return_type":"string"},"can://litestream/litestream/@external/strconv/Itoa":{"id":"can://litestream/litestream/@external/strconv/Itoa","kind":"external","name":"Itoa","module":"strconv","signature":"Itoa","parameters":[{"name":"i","type":"int"}],"return_type":"string"},"can://litestream/litestream/@external/strconv/ParseInt":{"id":"can://litestream/litestream/@external/strconv/ParseInt","kind":"external","name":"ParseInt","module":"strconv","signature":"ParseInt","parameters":[{"name":"s","type":"string"},{"name":"base","type":"int"},{"name":"bitSize","type":"int"}],"return_type":"(int64, error)"},"can://litestream/litestream/@external/strings/Builder.String":{"id":"can://litestream/litestream/@external/strings/Builder.String","kind":"external","name":"String","module":"strings","signature":"Builder.String","parameters":[],"return_type":"string","receiver":{"name":"b","type":"*strings.Builder"}},"can://litestream/litestream/@external/strings/Builder.WriteString":{"id":"can://litestream/litestream/@external/strings/Builder.WriteString","kind":"external","name":"WriteString","module":"strings","signature":"Builder.WriteString","parameters":[{"name":"s","type":"string"}],"return_type":"(int, error)","receiver":{"name":"b","type":"*strings.Builder"}},"can://litestream/litestream/@external/strings/Contains":{"id":"can://litestream/litestream/@external/strings/Contains","kind":"external","name":"Contains","module":"strings","signature":"Contains","parameters":[{"name":"s","type":"string"},{"name":"substr","type":"string"}],"return_type":"bool"},"can://litestream/litestream/@external/strings/EqualFold":{"id":"can://litestream/litestream/@external/strings/EqualFold","kind":"external","name":"EqualFold","module":"strings","signature":"EqualFold","parameters":[{"name":"s","type":"string"},{"name":"t","type":"string"}],"return_type":"bool"},"can://litestream/litestream/@external/strings/Fields":{"id":"can://litestream/litestream/@external/strings/Fields","kind":"external","name":"Fields","module":"strings","signature":"Fields","parameters":[{"name":"s","type":"string"}],"return_type":"[]string"},"can://litestream/litestream/@external/strings/HasPrefix":{"id":"can://litestream/litestream/@external/strings/HasPrefix","kind":"external","name":"HasPrefix","module":"strings","signature":"HasPrefix","parameters":[{"name":"s","type":"string"},{"name":"prefix","type":"string"}],"return_type":"bool"},"can://litestream/litestream/@external/strings/HasSuffix":{"id":"can://litestream/litestream/@external/strings/HasSuffix","kind":"external","name":"HasSuffix","module":"strings","signature":"HasSuffix","parameters":[{"name":"s","type":"string"},{"name":"suffix","type":"string"}],"return_type":"bool"},"can://litestream/litestream/@external/strings/Index":{"id":"can://litestream/litestream/@external/strings/Index","kind":"external","name":"Index","module":"strings","signature":"Index","parameters":[{"name":"s","type":"string"},{"name":"substr","type":"string"}],"return_type":"int"},"can://litestream/litestream/@external/strings/IndexByte":{"id":"can://litestream/litestream/@external/strings/IndexByte","kind":"external","name":"IndexByte","module":"strings","signature":"IndexByte","parameters":[{"name":"s","type":"string"},{"name":"c","type":"byte"}],"return_type":"int"},"can://litestream/litestream/@external/strings/LastIndex":{"id":"can://litestream/litestream/@external/strings/LastIndex","kind":"external","name":"LastIndex","module":"strings","signature":"LastIndex","parameters":[{"name":"s","type":"string"},{"name":"substr","type":"string"}],"return_type":"int"},"can://litestream/litestream/@external/strings/NewReader":{"id":"can://litestream/litestream/@external/strings/NewReader","kind":"external","name":"NewReader","module":"strings","signature":"NewReader","parameters":[{"name":"s","type":"string"}],"return_type":"*strings.Reader"},"can://litestream/litestream/@external/strings/Split":{"id":"can://litestream/litestream/@external/strings/Split","kind":"external","name":"Split","module":"strings","signature":"Split","parameters":[{"name":"s","type":"string"},{"name":"sep","type":"string"}],"return_type":"[]string"},"can://litestream/litestream/@external/strings/SplitN":{"id":"can://litestream/litestream/@external/strings/SplitN","kind":"external","name":"SplitN","module":"strings","signature":"SplitN","parameters":[{"name":"s","type":"string"},{"name":"sep","type":"string"},{"name":"n","type":"int"}],"return_type":"[]string"},"can://litestream/litestream/@external/strings/ToLower":{"id":"can://litestream/litestream/@external/strings/ToLower","kind":"external","name":"ToLower","module":"strings","signature":"ToLower","parameters":[{"name":"s","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/strings/ToUpper":{"id":"can://litestream/litestream/@external/strings/ToUpper","kind":"external","name":"ToUpper","module":"strings","signature":"ToUpper","parameters":[{"name":"s","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/strings/Trim":{"id":"can://litestream/litestream/@external/strings/Trim","kind":"external","name":"Trim","module":"strings","signature":"Trim","parameters":[{"name":"s","type":"string"},{"name":"cutset","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/strings/TrimPrefix":{"id":"can://litestream/litestream/@external/strings/TrimPrefix","kind":"external","name":"TrimPrefix","module":"strings","signature":"TrimPrefix","parameters":[{"name":"s","type":"string"},{"name":"prefix","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/strings/TrimSpace":{"id":"can://litestream/litestream/@external/strings/TrimSpace","kind":"external","name":"TrimSpace","module":"strings","signature":"TrimSpace","parameters":[{"name":"s","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/strings/TrimSuffix":{"id":"can://litestream/litestream/@external/strings/TrimSuffix","kind":"external","name":"TrimSuffix","module":"strings","signature":"TrimSuffix","parameters":[{"name":"s","type":"string"},{"name":"suffix","type":"string"}],"return_type":"string"},"can://litestream/litestream/@external/sync/Mutex.Lock":{"id":"can://litestream/litestream/@external/sync/Mutex.Lock","kind":"external","name":"Lock","module":"sync","signature":"Mutex.Lock","parameters":[],"receiver":{"name":"m","type":"*sync.Mutex"}},"can://litestream/litestream/@external/sync/Mutex.Unlock":{"id":"can://litestream/litestream/@external/sync/Mutex.Unlock","kind":"external","name":"Unlock","module":"sync","signature":"Mutex.Unlock","parameters":[],"receiver":{"name":"m","type":"*sync.Mutex"}},"can://litestream/litestream/@external/sync/Once.Do":{"id":"can://litestream/litestream/@external/sync/Once.Do","kind":"external","name":"Do","module":"sync","signature":"Once.Do","parameters":[{"name":"f","type":"func()"}],"receiver":{"name":"o","type":"*sync.Once"}},"can://litestream/litestream/@external/sync/RWMutex.Lock":{"id":"can://litestream/litestream/@external/sync/RWMutex.Lock","kind":"external","name":"Lock","module":"sync","signature":"RWMutex.Lock","parameters":[],"receiver":{"name":"rw","type":"*sync.RWMutex"}},"can://litestream/litestream/@external/sync/RWMutex.RLock":{"id":"can://litestream/litestream/@external/sync/RWMutex.RLock","kind":"external","name":"RLock","module":"sync","signature":"RWMutex.RLock","parameters":[],"receiver":{"name":"rw","type":"*sync.RWMutex"}},"can://litestream/litestream/@external/sync/RWMutex.RUnlock":{"id":"can://litestream/litestream/@external/sync/RWMutex.RUnlock","kind":"external","name":"RUnlock","module":"sync","signature":"RWMutex.RUnlock","parameters":[],"receiver":{"name":"rw","type":"*sync.RWMutex"}},"can://litestream/litestream/@external/sync/RWMutex.TryLock":{"id":"can://litestream/litestream/@external/sync/RWMutex.TryLock","kind":"external","name":"TryLock","module":"sync","signature":"RWMutex.TryLock","parameters":[],"return_type":"bool","receiver":{"name":"rw","type":"*sync.RWMutex"}},"can://litestream/litestream/@external/sync/RWMutex.Unlock":{"id":"can://litestream/litestream/@external/sync/RWMutex.Unlock","kind":"external","name":"Unlock","module":"sync","signature":"RWMutex.Unlock","parameters":[],"receiver":{"name":"rw","type":"*sync.RWMutex"}},"can://litestream/litestream/@external/sync/WaitGroup.Add":{"id":"can://litestream/litestream/@external/sync/WaitGroup.Add","kind":"external","name":"Add","module":"sync","signature":"WaitGroup.Add","parameters":[{"name":"delta","type":"int"}],"receiver":{"name":"wg","type":"*sync.WaitGroup"}},"can://litestream/litestream/@external/sync/WaitGroup.Done":{"id":"can://litestream/litestream/@external/sync/WaitGroup.Done","kind":"external","name":"Done","module":"sync","signature":"WaitGroup.Done","parameters":[],"receiver":{"name":"wg","type":"*sync.WaitGroup"}},"can://litestream/litestream/@external/sync/WaitGroup.Wait":{"id":"can://litestream/litestream/@external/sync/WaitGroup.Wait","kind":"external","name":"Wait","module":"sync","signature":"WaitGroup.Wait","parameters":[],"receiver":{"name":"wg","type":"*sync.WaitGroup"}},"can://litestream/litestream/@external/sync/atomic/AddInt64":{"id":"can://litestream/litestream/@external/sync/atomic/AddInt64","kind":"external","name":"AddInt64","module":"sync/atomic","signature":"AddInt64","parameters":[{"name":"addr","type":"*int64"},{"name":"delta","type":"int64"}],"return_type":"int64"},"can://litestream/litestream/@external/sync/atomic/Bool.Load":{"id":"can://litestream/litestream/@external/sync/atomic/Bool.Load","kind":"external","name":"Load","module":"sync/atomic","signature":"Bool.Load","parameters":[],"return_type":"bool","receiver":{"name":"x","type":"*sync/atomic.Bool"}},"can://litestream/litestream/@external/sync/atomic/Bool.Store":{"id":"can://litestream/litestream/@external/sync/atomic/Bool.Store","kind":"external","name":"Store","module":"sync/atomic","signature":"Bool.Store","parameters":[{"name":"val","type":"bool"}],"receiver":{"name":"x","type":"*sync/atomic.Bool"}},"can://litestream/litestream/@external/sync/atomic/Int64.Add":{"id":"can://litestream/litestream/@external/sync/atomic/Int64.Add","kind":"external","name":"Add","module":"sync/atomic","signature":"Int64.Add","parameters":[{"name":"delta","type":"int64"}],"return_type":"int64","receiver":{"name":"x","type":"*sync/atomic.Int64"}},"can://litestream/litestream/@external/sync/atomic/LoadInt64":{"id":"can://litestream/litestream/@external/sync/atomic/LoadInt64","kind":"external","name":"LoadInt64","module":"sync/atomic","signature":"LoadInt64","parameters":[{"name":"addr","type":"*int64"}],"return_type":"int64"},"can://litestream/litestream/@external/sync/atomic/StoreInt64":{"id":"can://litestream/litestream/@external/sync/atomic/StoreInt64","kind":"external","name":"StoreInt64","module":"sync/atomic","signature":"StoreInt64","parameters":[{"name":"addr","type":"*int64"},{"name":"val","type":"int64"}]},"can://litestream/litestream/@external/testing/TB.Fatal":{"id":"can://litestream/litestream/@external/testing/TB.Fatal","kind":"external","name":"Fatal","module":"testing","signature":"TB.Fatal","parameters":[{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"_recv","type":"testing.TB"}},"can://litestream/litestream/@external/testing/TB.Fatalf":{"id":"can://litestream/litestream/@external/testing/TB.Fatalf","kind":"external","name":"Fatalf","module":"testing","signature":"TB.Fatalf","parameters":[{"name":"format","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"_recv","type":"testing.TB"}},"can://litestream/litestream/@external/testing/TB.Helper":{"id":"can://litestream/litestream/@external/testing/TB.Helper","kind":"external","name":"Helper","module":"testing","signature":"TB.Helper","parameters":[],"receiver":{"name":"_recv","type":"testing.TB"}},"can://litestream/litestream/@external/testing/TB.Logf":{"id":"can://litestream/litestream/@external/testing/TB.Logf","kind":"external","name":"Logf","module":"testing","signature":"TB.Logf","parameters":[{"name":"format","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"_recv","type":"testing.TB"}},"can://litestream/litestream/@external/testing/TB.Skip":{"id":"can://litestream/litestream/@external/testing/TB.Skip","kind":"external","name":"Skip","module":"testing","signature":"TB.Skip","parameters":[{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"_recv","type":"testing.TB"}},"can://litestream/litestream/@external/testing/TB.TempDir":{"id":"can://litestream/litestream/@external/testing/TB.TempDir","kind":"external","name":"TempDir","module":"testing","signature":"TB.TempDir","parameters":[],"return_type":"string","receiver":{"name":"_recv","type":"testing.TB"}},"can://litestream/litestream/@external/testing/common.Fatal":{"id":"can://litestream/litestream/@external/testing/common.Fatal","kind":"external","name":"Fatal","module":"testing","signature":"common.Fatal","parameters":[{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"c","type":"*testing.common"}},"can://litestream/litestream/@external/testing/common.Logf":{"id":"can://litestream/litestream/@external/testing/common.Logf","kind":"external","name":"Logf","module":"testing","signature":"common.Logf","parameters":[{"name":"format","type":"string"},{"name":"args","type":"[]any","is_variadic":true}],"receiver":{"name":"c","type":"*testing.common"}},"can://litestream/litestream/@external/text/tabwriter/NewWriter":{"id":"can://litestream/litestream/@external/text/tabwriter/NewWriter","kind":"external","name":"NewWriter","module":"text/tabwriter","signature":"NewWriter","parameters":[{"name":"output","type":"io.Writer"},{"name":"minwidth","type":"int"},{"name":"tabwidth","type":"int"},{"name":"padding","type":"int"},{"name":"padchar","type":"byte"},{"name":"flags","type":"uint"}],"return_type":"*text/tabwriter.Writer"},"can://litestream/litestream/@external/text/tabwriter/Writer.Flush":{"id":"can://litestream/litestream/@external/text/tabwriter/Writer.Flush","kind":"external","name":"Flush","module":"text/tabwriter","signature":"Writer.Flush","parameters":[],"return_type":"error","receiver":{"name":"b","type":"*text/tabwriter.Writer"}},"can://litestream/litestream/@external/time/After":{"id":"can://litestream/litestream/@external/time/After","kind":"external","name":"After","module":"time","signature":"After","parameters":[{"name":"d","type":"time.Duration"}],"return_type":"\u003c-chan time.Time"},"can://litestream/litestream/@external/time/AfterFunc":{"id":"can://litestream/litestream/@external/time/AfterFunc","kind":"external","name":"AfterFunc","module":"time","signature":"AfterFunc","parameters":[{"name":"d","type":"time.Duration"},{"name":"f","type":"func()"}],"return_type":"*time.Timer"},"can://litestream/litestream/@external/time/Duration.Milliseconds":{"id":"can://litestream/litestream/@external/time/Duration.Milliseconds","kind":"external","name":"Milliseconds","module":"time","signature":"Duration.Milliseconds","parameters":[],"return_type":"int64","receiver":{"name":"d","type":"time.Duration"}},"can://litestream/litestream/@external/time/Duration.Round":{"id":"can://litestream/litestream/@external/time/Duration.Round","kind":"external","name":"Round","module":"time","signature":"Duration.Round","parameters":[{"name":"m","type":"time.Duration"}],"return_type":"time.Duration","receiver":{"name":"d","type":"time.Duration"}},"can://litestream/litestream/@external/time/Duration.Seconds":{"id":"can://litestream/litestream/@external/time/Duration.Seconds","kind":"external","name":"Seconds","module":"time","signature":"Duration.Seconds","parameters":[],"return_type":"float64","receiver":{"name":"d","type":"time.Duration"}},"can://litestream/litestream/@external/time/NewTicker":{"id":"can://litestream/litestream/@external/time/NewTicker","kind":"external","name":"NewTicker","module":"time","signature":"NewTicker","parameters":[{"name":"d","type":"time.Duration"}],"return_type":"*time.Ticker"},"can://litestream/litestream/@external/time/NewTimer":{"id":"can://litestream/litestream/@external/time/NewTimer","kind":"external","name":"NewTimer","module":"time","signature":"NewTimer","parameters":[{"name":"d","type":"time.Duration"}],"return_type":"*time.Timer"},"can://litestream/litestream/@external/time/Now":{"id":"can://litestream/litestream/@external/time/Now","kind":"external","name":"Now","module":"time","signature":"Now","parameters":[],"return_type":"time.Time"},"can://litestream/litestream/@external/time/Parse":{"id":"can://litestream/litestream/@external/time/Parse","kind":"external","name":"Parse","module":"time","signature":"Parse","parameters":[{"name":"layout","type":"string"},{"name":"value","type":"string"}],"return_type":"(time.Time, error)"},"can://litestream/litestream/@external/time/Since":{"id":"can://litestream/litestream/@external/time/Since","kind":"external","name":"Since","module":"time","signature":"Since","parameters":[{"name":"t","type":"time.Time"}],"return_type":"time.Duration"},"can://litestream/litestream/@external/time/Ticker.Stop":{"id":"can://litestream/litestream/@external/time/Ticker.Stop","kind":"external","name":"Stop","module":"time","signature":"Ticker.Stop","parameters":[],"receiver":{"name":"t","type":"*time.Ticker"}},"can://litestream/litestream/@external/time/Time.Add":{"id":"can://litestream/litestream/@external/time/Time.Add","kind":"external","name":"Add","module":"time","signature":"Time.Add","parameters":[{"name":"d","type":"time.Duration"}],"return_type":"time.Time","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.After":{"id":"can://litestream/litestream/@external/time/Time.After","kind":"external","name":"After","module":"time","signature":"Time.After","parameters":[{"name":"u","type":"time.Time"}],"return_type":"bool","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.Before":{"id":"can://litestream/litestream/@external/time/Time.Before","kind":"external","name":"Before","module":"time","signature":"Time.Before","parameters":[{"name":"u","type":"time.Time"}],"return_type":"bool","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.Format":{"id":"can://litestream/litestream/@external/time/Time.Format","kind":"external","name":"Format","module":"time","signature":"Time.Format","parameters":[{"name":"layout","type":"string"}],"return_type":"string","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.IsZero":{"id":"can://litestream/litestream/@external/time/Time.IsZero","kind":"external","name":"IsZero","module":"time","signature":"Time.IsZero","parameters":[],"return_type":"bool","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.Sub":{"id":"can://litestream/litestream/@external/time/Time.Sub","kind":"external","name":"Sub","module":"time","signature":"Time.Sub","parameters":[{"name":"u","type":"time.Time"}],"return_type":"time.Duration","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.Truncate":{"id":"can://litestream/litestream/@external/time/Time.Truncate","kind":"external","name":"Truncate","module":"time","signature":"Time.Truncate","parameters":[{"name":"d","type":"time.Duration"}],"return_type":"time.Time","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.UTC":{"id":"can://litestream/litestream/@external/time/Time.UTC","kind":"external","name":"UTC","module":"time","signature":"Time.UTC","parameters":[],"return_type":"time.Time","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.Unix":{"id":"can://litestream/litestream/@external/time/Time.Unix","kind":"external","name":"Unix","module":"time","signature":"Time.Unix","parameters":[],"return_type":"int64","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.UnixMilli":{"id":"can://litestream/litestream/@external/time/Time.UnixMilli","kind":"external","name":"UnixMilli","module":"time","signature":"Time.UnixMilli","parameters":[],"return_type":"int64","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Time.UnixNano":{"id":"can://litestream/litestream/@external/time/Time.UnixNano","kind":"external","name":"UnixNano","module":"time","signature":"Time.UnixNano","parameters":[],"return_type":"int64","receiver":{"name":"t","type":"time.Time"}},"can://litestream/litestream/@external/time/Timer.Reset":{"id":"can://litestream/litestream/@external/time/Timer.Reset","kind":"external","name":"Reset","module":"time","signature":"Timer.Reset","parameters":[{"name":"d","type":"time.Duration"}],"return_type":"bool","receiver":{"name":"t","type":"*time.Timer"}},"can://litestream/litestream/@external/time/Timer.Stop":{"id":"can://litestream/litestream/@external/time/Timer.Stop","kind":"external","name":"Stop","module":"time","signature":"Timer.Stop","parameters":[],"return_type":"bool","receiver":{"name":"t","type":"*time.Timer"}},"can://litestream/litestream/@external/time/UnixMilli":{"id":"can://litestream/litestream/@external/time/UnixMilli","kind":"external","name":"UnixMilli","module":"time","signature":"UnixMilli","parameters":[{"name":"msec","type":"int64"}],"return_type":"time.Time"},"can://litestream/litestream/@external/time/Until":{"id":"can://litestream/litestream/@external/time/Until","kind":"external","name":"Until","module":"time","signature":"Until","parameters":[{"name":"t","type":"time.Time"}],"return_type":"time.Duration"}}}} \ No newline at end of file diff --git a/tests/resources/go/analysis_json/v2/README.md b/tests/resources/go/analysis_json/v2/README.md index 1ca3178..1b3d303 100644 --- a/tests/resources/go/analysis_json/v2/README.md +++ b/tests/resources/go/analysis_json/v2/README.md @@ -1,3 +1,22 @@ +## Identity-v2 snapshots (2026-10-30) + +These positive fixtures were regenerated from `tests/resources/go/litestream.zip`, SHA-256 `28c63ee3fba625529d78ab6174a1163b028f980f312598c368a57b32a3471cde`, using reviewed local +`codeanalyzer-go` source commit `4e1fb80e099a82b9f21c1cf749d43cd749eba251` (reported version `0.1.0`). +These are local verification builds; the dependency release pins are unchanged. +Every envelope carries required `identity_version: 2` and raw application ownership metadata. +The resulting application is `can://litestream/litestream`; 55 modules and 3,082 call edges. + +Reproduce from the SDK root with the reviewed producer artifacts configured: + +```sh +.venv/bin/python tests/resources/regenerate_identity_fixtures.py go +``` + +The checked-in generator records the exact CLI arguments and source pruning. It uses the +existing TS/Go binary environment overrides and the installed Java wheel. Java regeneration requires Maven and a JDK; its gzip artifacts use `mtime=0`. +No persisted IDs were translated. +The historical notes below describe earlier fixture generations and are superseded by this section. + The Go analysis fixture is a single schema-v2 output committed one directory up, at `tests/resources/go/analysis.json`, generated by **codeanalyzer-go** (`cango`) on the application in `tests/resources/go/litestream.zip` (the [litestream](https://github.com/benbjohnson/litestream) Go diff --git a/tests/resources/java/analysis_json/v2/README.md b/tests/resources/java/analysis_json/v2/README.md index 235f972..c516310 100644 --- a/tests/resources/java/analysis_json/v2/README.md +++ b/tests/resources/java/analysis_json/v2/README.md @@ -1,3 +1,24 @@ +## Identity-v2 snapshots (2026-10-30) + +These positive fixtures were regenerated from `tests/resources/java/application/daytrader8-1.2.zip`, SHA-256 `0624ad6b46ab2f1f23df936a55663edae8c2704b866005e013150a93f52c03b7`, using reviewed local +`codeanalyzer-java` source commit `cbfbd01dd9ed3f5bfca51237487d0273f4eff4ec` (reported version `3.3.4`). +These are local verification builds; the dependency release pins are unchanged. +Every envelope carries required `identity_version: 2` and raw application ownership metadata. +The resulting application is `can://daytrader8/daytrader8`; L1 has 138 modules; pruned L4 has four modules, 247 call edges, 258 param-in and 97 param-out edges, and 320 WALA points-to edges. + +Reproduce from the SDK root with the reviewed producer artifacts configured: + +```sh +.venv/bin/python tests/resources/regenerate_identity_fixtures.py java +``` + +The checked-in generator records the exact CLI arguments and source pruning. It uses the +existing TS/Go binary environment overrides and the installed Java wheel. Java requires Maven +and a JDK; a complete strict L4 run builds the full source before the four-file snapshot is +emitted with `--no-build --strict`. The WALA log verified 118 visited callables and 320 added +points-to edges. Java gzip artifacts use `mtime=0`. No persisted IDs were translated. +The historical notes below describe earlier fixture generations and are superseded by this section. + Generated from `tests/resources/java/application/daytrader8-1.2.zip` (unzipped to `` = `sample.daytrader8-1.2/`) by **codeanalyzer-java 3.1.0** — the pinned `codeanalyzer-java` wheel (the `cldk[java]` extra), run as `codeanalyzer_java.command()`: the wheel's own jar on the JVM it bundles diff --git a/tests/resources/java/analysis_json/v2/a1/analysis.json.gz b/tests/resources/java/analysis_json/v2/a1/analysis.json.gz index 65265661c1dcc945cee67bfbdf448d38d036bd11..4a0e60983da98decf6044f7203ad27a42153da49 100644 GIT binary patch literal 926009 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

U(+83q1W!sv8z~;VRJiX< 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

Z%wryN37Uz+jb``0HQPVr%ve9iSu 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 z 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

?Rv!gogX=bpwR$A#h)fysf84k5<*! z?;_#OpZ8M`B4Ho??RP>imq#M`QATUrCtsarf`j22IvDxj%aYOC5Y!905=2H-VnzI{ zy4lypIxSl(i42mgc*ubnkVZ?(`3{{VoW%%0Dm1rNDz5^wYLC8WrgP#$oHWl;?X~Nj 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

OZSmCVZrW#e9D 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≀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%0A0@^k)yjJlftlo8&m|XA(RF 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